Linux內核源代碼的組成如下(假設相對於linux目錄):
arch 這個子目錄包含了此核心源代碼所支持的硬件體系結構相關的核心代碼。如對於X86平臺就是i386。
include 這個目錄包括了核心的大多數include文件。另外對於每種支持的體系結構分別有一個子目錄。
init 此目錄包含核心啓動代碼。
mm 此目錄包含了所有的內存管理代碼。與具體硬件體系結構相關的內存管理代碼位於arch/*/mm目錄下,如對應於X86的就是arch/i386/mm/fault.c 。
drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,每一種也有對應的子目錄,如聲卡的驅動對應於drivers/sound。
ipc 此目錄包含了核心的進程間通訊代碼。
modules 此目錄包含已建好可動態加載的模塊。
fs Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext2文件系統對應的就是ext2子目錄。
kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/*/kernel目錄下。
net 核心的網絡部分代碼。裏面的每個子目錄對應於網絡的一個方面。
lib 此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/*/lib/目錄下。
scripts此目錄包含用於配置核心的腳本文件。
Documentation 此目錄是一些文檔,起參考作用。
清楚了源代碼的結構組成後就可以着手閱讀。對於閱讀方法或者說順序,有所謂的縱向與橫向之分。所謂縱向就是順着程序的執行順序逐步進行;所謂橫向,就是分模塊進行。這不是絕對的,而是經常結合在一起進行。對於Linux源代碼來講,啓動的代碼就可以順着linux的啓動順序一步一步來,它的大致流程如下(以X86平臺爲例):
./larch/i386/boot/bootSect.S-->./larch/i386/boot/setup.S-->./larch/i386/kernel/head.S-->./init/main.c中的start_kernel()。而對於象內存管理等部分,則可以單獨拿出來進行閱讀分析。我的體會是:開始最好按順序閱讀啓動代碼,然後進行專題閱讀,如進程部分,內存管理部分等。在每個功能函數內部應該一步步來。實際上這是一個反覆的過程,不可能讀一遍就理解。