Linux核心原始碼 閱讀方法

2021-09-02 17:00:02 字數 3338 閱讀 1806

[url]

通常linux會有以下目錄

arch 子目錄包括所有和體系結構相關的核心**。它還有更深的子目錄,每乙個代表一種支援的體系結構

include 子目錄包括編譯核心所需要的大部分 include 檔案。它也有更深的子目錄,每乙個支援的體系結構乙個。 include/asm 是這個體系結構所需要的真實的 include 目錄的軟鏈結,例如 include/asm-i386 。為了改變體系結構,你需要編輯核心的 makefile ,重新執行 linux 的核心配置程式

init 這個目錄包含核心的初始化**,這時研究核心如何工作的乙個非常好的起點

mm 這個目錄包括所有的記憶體管理**。和體系結構相關的記憶體管理**位於 arch/*/mm/

drivers 系統所有的裝置驅動程式在這個目錄。它們被劃分成裝置驅動程式類

ipc 這個目錄包含核心的程序間通訊的**

modules 這只是乙個用來存放建立好的模組的目錄

fs 所有的檔案系統**。被劃分成子目錄,每乙個支援的檔案系統乙個

kernel 主要的核心**。同樣,和體系相關的核心**放在 arch/*/kernel

net 核心的網路**

lib 這個目錄放置核心的庫**。和體系結構相關的庫**在 arch/*/lib/

scripts 這個目錄包含指令碼(例如 awk 和 tk 指令碼),用於配置核心

按照以下順序閱讀源**會輕鬆點

核心功能(kernel)

記憶體管理(mm)

檔案系統(fs)

程序通訊(ipc)

網路(net)

系統啟動和初始化(init/main和head.s)

其他等等

system startup and initialization (系統啟動和初始化)

在乙個 intel 系統上,當 loadlin.exe 或 lilo 把核心載入到記憶體並把控制權交給它的時候,核心開始啟動。這一部分看 arch/i386/kernel/head.s 。 head.s 執行一些和體系結構相關的設定工作並跳到 init/main.c 中的 main() 例程。

memory management (記憶體管理)

**大多在 mm 但是和體系結構相關的**在 arch/*/mm 。 page fault 處理**在 mm/memory.c 中,記憶體對映和頁快取**在 mm/filemap.c 中。 buffer cache 在 mm/buffer.c 中實現,交換快取在 mm/swap_state.c 和 mm/swapfile.c 中。

kernel

大部分相對通用的**在 kernel ,和體系結構相關的**在 arch/*/kernel 。排程程式在 kernel/sched.c , fork **在 kernel/fork.c 。 bottom half 處理**在 include/linux/interrupt.h 。 task_struct 資料結構可以在 include/linux/sched.h 中找到

pcipci 偽驅動程式在 drivers/pci/pci.c ,系統範圍的定義在 include/linux/pci.h 。每一種體系結構都有一些特殊的 pci bios **, alpha axp 的位於 arch/alpha/kernel/bios32.c

interprocess communication

全部在 ipc 目錄。所有系統 v ipc 物件都包括 ipc_perm 資料結構,可以在 include/linux/ipc.h 中找到。系統 v 訊息在 ipc/msg.c 中實現,共享記憶體在 ipc/shm.c 中,訊號燈在 ipc/sem.c 。管道在 ipc/pipe.c 中實現。

interrupt handling

核心的中斷處理**幾乎都是和微處理器(通常也和平台)相關。 intel 中斷處理**在 arch/i386/kernel/irq.c 它的定義在 incude/asm-i386/irq.h 。

device drivers (裝置驅動程式)

linux 核心源**的大部分**行在它的裝置驅動程式中。 linux 所有的裝置驅動程式源**都在 drivers 中,但是它們被進一步分類:

/block 塊裝置驅動程式比如 ide ( ide.c )。如果你希望檢視所有可能包含檔案系統的裝置是如何初始化的,你可以看 drivers/block/genhd.c 中的 device_setup() 。它不僅初始化硬碟,也初始化網路,因為你安裝 nfs 檔案系統的時候需要網路。塊裝置包括基於 ide 和 scsi 裝置。

/char 這裡可以檢視基於字元的裝置比如 tty ,序列口等。

/cdrom linux 所有的 cdrom **。在這裡可以找到特殊的 cdrom 裝置(比如 soundblaster cdrom )。注意 ide cd 驅動程式是 drivers/block 中的 ide-cd.c ,而 scsi cd 驅動程式在 drivers/scsi/scsi.c 中

/pci pci 偽驅動程式。這是乙個觀察 pci 子系統如何被對映和初始化的好地方。 alpha axp pci 整理**也值得在 arch/alpha/kernel/bios32.c 中檢視

/scsi 在這裡不但可以找到所有的 linux 支援的 scsi 裝置的驅動程式,也可以找到所有的 scsi **

/net 在這裡可以找到網路裝置驅動程式比如 dec chip 21040 pci 乙太網驅動程式在 tulip.c 中

/sound 所有的音效卡驅動程式的位置

file systems (檔案系統)

ext2 檔案系統的源程式都在 fs/ext2/ 子目錄,資料結構的定義在 include/linux/ext2_fs.h,ext2_fs_i.h 和 ext2_fs_sb.h 中。虛擬檔案系統的資料結構在 include/linux/fs.h 中描述,**是 fs/* 。 buffer cache 和 update 核心守護程序都是用 fs/buffer.c 實現的

network (網路)

網路**放在 net 子目錄,大部分的 include 檔案在 include/net 。 bsd socket **在 net/socket.c , ipv4 inet socket **在 net/ipv4/af_inet.c 中。通用協議的支援**(包括 sk_buff 處理例程)在 net/core 中, tcp/ip 網路**在 net/ipv4 。網路裝置驅動程式在 drivers/net

modules (模組)

核心模組**部分在核心,部分在 modules 包中。核心**全部在 kernel/modules.c ,資料結果和核心守護程序 kerneld 的訊息則分別在 include/linux/module.h 和 include/linux/kerneld.h 中。你可能也希望在 include/linux/elf.h 中檢視乙個 elf 目標檔案的結構

Linux核心原始碼閱讀 1

1 作業系統的基本知識 2 對c語言比較熟悉,最好要有組合語言的知識和gnu c對標準c的擴充套件的知識的了解。另外在閱讀之前,還應該知道linux核心源 的整體分布情況。我們知道現代的作業系統一般由程序管理 記憶體管理 檔案系統 驅動程式 網路等組成。看一下linux內 核源 就可看出,各個目錄大...

怎樣閱讀核心原始碼

1.獲取核心 2.目錄結構 在閱讀原始碼之前,還應知道linux核心原始碼的整體分布情況。現代的作業系統一般由程序管理 記憶體管理 文件系統 驅動程式和網路等組成。linux核心原始碼的各個目錄大致和此相對應,其組成如下 假設相對於linux 2.4.23目錄 arch目錄包括了任何和體系結構相關的...

Linux核心原始碼閱讀之中斷(簡)

本文對linux2.4.0中中斷機制從原始碼層面進行簡要介紹,閱讀需要有一定基礎,詳細版本請參考這裡。這裡主要介紹以下幾個部分 主要是設定中斷向量表中中斷服務的型別,服務程式的入口位址,dpl等。1.1 trap init 初始化系統保留的中斷向量,從0x00到0x1f共36個 init irq 初...