《深入分析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中。