1. 程式人生 > >《深入分析linux核心原始碼》筆記:linux 核心原始碼

《深入分析linux核心原始碼》筆記:linux 核心原始碼

一、Linux核心原始碼的結構

Linux 核心原始碼位於/usr/src/linux 目錄下。

include/目錄包含了建立核心程式碼時所需的大部分包含檔案,這個模組利用其他模組重建核心。

init/ 子目錄包含了核心的初始化程式碼,這是核心開始工作的起點。

arch/子目錄包含了所有硬體結構特定的核心程式碼,如圖1所示,arch/子目錄下有 i386和 alpha 模組等。

drivers/ 目錄包含了核心中所有的裝置驅動程式,如塊裝置,scsi 裝置驅動程式等。

fs/ 目錄包含了所有檔案系統的程式碼,如:ext2,vfat 模組的程式碼等。

net/ 目錄包含了核心的連網程式碼。

mm/ 目錄包含了所有的記憶體管理程式碼。

ipc/ 目錄包含了程序間通訊的程式碼。

kernel/ 目錄包含了主核心程式碼。

              圖1 Linux原始碼的分佈結構

二、閱讀原始碼

1.系統的啟動和初始化

在基於 Intel 的系統上,當 loadlin.exe 或 LILO 把核心裝入到記憶體並把控制權傳遞給核心時,核心開始啟動。關於這一部分,看 arch/i386/kernel/head.S ,head.S 進行特定結構的設定,然後跳轉到 init/main.c 的 main()例程。

2.記憶體管理

記憶體管理的程式碼主要在/mm,但特定結構的程式碼在 arch/*/mm。缺頁中斷處理的程式碼在mm/memory.c ,而記憶體對映和頁快取記憶體器的程式碼在 mm/filemap.c。緩衝器快取記憶體是在mm/buffer.c 中實現,而交換快取記憶體是在 mm/swap_state.c 和 mm/swapfile.c 中實現。

3.核心

核心中,特定結構的程式碼在 arch/*/kernel,排程程式在 kernel/sched.c,fork 的程式碼在 kernel/fork.c,task_struct 資料結構在 include/linux/sched.h 中。

4.PCI

PCI 偽驅動程式在 drivers/pci/pci.c ,其定義在 include/linux/pci.h。每一種結構都有一些特定的 PCI BIOS 程式碼,Intel 的在 arch/alpha/kernel/bios32.c。

5.程序間通訊

所 有 System V IPC 對 象 權 限 都 包 含 在 ipc_perm 數 據 結 構 中 , 這 可 以 在include/linux/ipc.h 中找到 System V 訊息是在 ipc/msg.c 中實現, 共享記憶體在 ipc/shm.c中,訊號量在 ipc/sem.c 中,管道在 ipc/pipe.c 中實現。

6.中斷處理

內 核 的 中 斷 處 理 代 碼 是 幾 乎 所 有 的 微 處 理 器 所 特 有 的 。 中 斷 處 理 代 碼 在arch/i386/kernel/irq.c 中,其定義在 include/asm-i386/irq.h 中。

7.裝置驅動程式

Linux 核心原始碼的很多行是裝置驅動程式。Linux 裝置驅動程式的所有原始碼都儲存在/driver,根據型別可進一步劃分為:

/block塊裝置驅動程式如 ide(在 ide.c)。如果想看包含檔案系統的所有裝置是如何被初始化的,應當看drivers/block/genhd.c 中的 device_setup(),device_setup()不僅初始化了硬碟,當一個網路安裝 nfs 檔案系統時,它也初始化網路。塊裝置包含了基於 IDE 和 SCSI的裝置。

/char

這是看字元裝置(如 tty,串列埠及滑鼠等)驅動程式的地方。

/cdrom

Linux 的所有 CDROM 程式碼都在這裡,如在這兒可以找到 Soundblaster CDROM 的驅動程式。

注意 ide CD 的驅動程式是 ide-cd.c,放在 drivers/block;SCSI CD 的驅動程式是 scsi.c,

放在 drivers/scsi。

/pci

這是 PCI 偽驅動程式的原始碼,在這裡可以看到 PCI 子系統是如何被對映和初始化的。

/scsi

在這裡可以找到所有的 SCSI 程式碼及 Linux 所支援的 scsi 裝置的所有裝置驅動程式。

/net

在這裡可以找到網路裝置驅動程式,如 DECChip 21040 PCI 乙太網驅動程式在 tulip.c中。

/sound

這是所有音效卡驅動程式的所在地。

8.檔案系統

EXT2 文 件 系 統 的 源 代 碼 全 部 在 fs/ext2/ 目 錄 下 , 而 其 數 據 結 構 的 定 義 在include/linux/ ext2_fs.h,ext2_fs_i.h 及 ext2_fs_sb.h 中。虛擬檔案系統的資料結構include/linux/fs.h 中描述,而程式碼是在 fs/*中。緩衝區快取記憶體與更新核心的守護程序的實現是在 fs/buffer.c 中。

9.網路

網路程式碼儲存在/net 中,大部分的 include 檔案在 include/net 下,BSD 套節口程式碼在net/socket.c 中,IP 第 4 版本的套節口程式碼在 net/ipv4/af_inet.c。一般的協議支援程式碼(包括 sk_buff 處理例程)在 net/core 下,TCP/IP 聯網程式碼在 net/ipv4 下,網路裝置驅動程式在/drivers/net 下。

10.模組

核心模組的程式碼部分在核心中,部分在模組包中,前者全部在 kernel/modules.c 中,而 數 據 結 構 和 內 核 守 護 進 程 kerneld 的 信 息 分 別 在 include/linux/module.h 和include/linux/kerneld.h 中。如果想看 ELF 目標檔案的結構,它位於 include/linux/elf.h中。