首先,默認(rèn)你對(duì)C語(yǔ)言已經(jīng)十分精通,我的“精通”的意思是你能做到對(duì)C語(yǔ)言的編譯過程了然于心,深刻理解C語(yǔ)言編譯器是如何把文本的C源碼編譯成二進(jìn)制指令的。如果沒有做到,請(qǐng)自學(xué)做到。
其次,默認(rèn)你對(duì)匯編語(yǔ)言有一定了解,熟悉AT&T的基本匯編語(yǔ)法,了解偽指令和指令的差異,理解“匯編源碼文件是用來生成一段二進(jìn)制文件塊的操作指示文件”這句話的含義。如果沒有做到,請(qǐng)自學(xué)做到。
閱讀Linux內(nèi)核代碼的準(zhǔn)備步驟:
1、讀一下Tanenbaum的《現(xiàn)代操作系統(tǒng)》這本書,理解了4大基本概念:Thread(線程/進(jìn)程)、VMS(虛擬內(nèi)存系統(tǒng))、VFS(虛擬文件系統(tǒng))、I/O。
2、讀一下ARM或者X86(選一種即可)的Specification,理解了6大CPU機(jī)制:寄存器機(jī)制、多級(jí)緩存機(jī)制、分段機(jī)制、分頁(yè)機(jī)制、中斷機(jī)制、多核同步機(jī)制。
3、選一個(gè)版本的內(nèi)核源碼(例如v3.18.137),選一個(gè)CPU架構(gòu)(例如X86_64)。
4、下載選定版本的內(nèi)核源碼,并按照選的的CPU架構(gòu)裁剪源碼(刪掉其他架構(gòu)的源碼)。
5、配置好編譯流程。
現(xiàn)在你可以閱讀內(nèi)核代碼了,注意幾個(gè)事項(xiàng):
1、用 https://elixir.bootlin.com/linux/v3.18.137/source 之類輔助普通IDE閱讀內(nèi)核源碼,有奇效。
2、早期,可以在內(nèi)核源碼的任意地方,用printk()輸出調(diào)試信息,輔助學(xué)習(xí);熟了之后,自己寫一個(gè)內(nèi)核模塊,可以通過/proc/kallsyms找到任意內(nèi)核符號(hào)的地址,從而可以隨時(shí)讀取任意的內(nèi)核數(shù)據(jù),輔助學(xué)習(xí)。
3、不要用“一層一層的函數(shù)”的視角看待內(nèi)核源碼,內(nèi)核是由三類符號(hào)組成的:代碼符號(hào)(函數(shù))、數(shù)據(jù)符號(hào)(struct定義)、變量符號(hào)(具體類型的變量)。你首先要了解的是每一個(gè)功能模塊相關(guān)的核心符號(hào),例如mmap模塊相關(guān)的核心符號(hào)有哪些,分別是什么作用,相互之間什么關(guān)系,最好畫個(gè)圖,然后再來看具體每個(gè)符號(hào)是怎么實(shí)現(xiàn)的(一層一層細(xì)讀函數(shù)實(shí)現(xiàn))。
Linux源碼博大精深,處處是寶藏,祝福你尋寶順利~
一般在Linux系統(tǒng)中的/usr/src/linux*.*.*(*.*.*代表的是內(nèi)核版本,如2.4.23)目錄下就是內(nèi)核源代碼(如果沒有類似目錄,是因?yàn)檫€沒安裝內(nèi)核代碼)。另外還可從互連網(wǎng)上免費(fèi)下載。注意,不要總到http://www.kernel.org/去下載,最好使用它的鏡像站點(diǎn)下載。請(qǐng)?jiān)趆ttp://www.kernel.org/mirrors/里找一個(gè)合適的下載點(diǎn),再到pub/linux/kernel/v2.6/目錄下去下載2.4.23內(nèi)核。
代碼目錄結(jié)構(gòu)
在閱讀源碼之前,還應(yīng)知道Linux內(nèi)核源碼的整體分布情況?,F(xiàn)代的操作系統(tǒng)一般由進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)、驅(qū)動(dòng)程序和網(wǎng)絡(luò)等組成。Linux內(nèi)核源碼的各個(gè)目錄大致與此相對(duì)應(yīng),其組成如下(假設(shè)相對(duì)于Linux-2.4.23目錄): 1.arch目錄包括了所有和體系結(jié)構(gòu)相關(guān)的核心代碼。它下面的每一個(gè)子目錄都代表一種Linux支持的體系結(jié)構(gòu),
例如i386就是Intel CPU及與之相兼容體系結(jié)構(gòu)的子目錄。PC機(jī)一般都基于此目錄。 2.include目錄包括編譯核心所需要的大部分頭文件,例如與平臺(tái)無關(guān)的頭文件在include/linux子目錄下。 3.init目錄包含核心的初始化代碼(不是系統(tǒng)的引導(dǎo)代碼),有main.c和Version.c兩個(gè)文件。這是研究核心如何工作的好起點(diǎn)。 4.mm目錄包含了所有的內(nèi)存管理代碼。與具體硬件體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下。 5.drivers目錄中是系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)程序。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于drivers/sound。 6.ipc目錄包含了核心進(jìn)程間的通信代碼。 7.modules目錄存放了已建好的、可動(dòng)態(tài)加載的模塊。 8.fs目錄存放Linux支持的文件系統(tǒng)代碼。不同的文件系統(tǒng)有不同的子目錄對(duì)應(yīng),如ext3文件系統(tǒng)對(duì)應(yīng)的就是ext3子目錄。 Kernel內(nèi)核管理的核心代碼放在這里。同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在arch/*/kernel目錄下。 9.net目錄里是核心的網(wǎng)絡(luò)部分代碼,其每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。 10.lib目錄包含了核心的庫(kù)代碼,不過與處理器結(jié)構(gòu)相關(guān)的庫(kù)代碼被放在arch/*/lib/目錄下。 11.scripts目錄包含用于配置核心的腳本文件。 12.documentation目錄下是一些文檔,是對(duì)每個(gè)目錄作用的具體說明。 一般在每個(gè)目錄下都有一個(gè).depend文件和一個(gè)Makefile文件。這兩個(gè)文件都是編譯時(shí)使用的輔助文件。仔細(xì)閱讀這兩個(gè)文件對(duì)弄清各個(gè)文件之間的聯(lián)系和依托關(guān)系很有幫助。另外有的目錄下還有Readme文件,它是對(duì)該目錄下文件的一些說明,同樣有利于對(duì)內(nèi)核源碼的理解。![]()
身邊有兩名同事在看這本書,感覺不明覺厲啊
