-
1 # 蟲洞科技
-
2 # 張羽赫
首先,預設你對C語言已經十分精通,我的“精通”的意思是你能做到對C語言的編譯過程瞭然於心,深刻理解C語言編譯器是如何把文字的C原始碼編譯成二進位制指令的。如果沒有做到,請自學做到。
其次,預設你對組合語言有一定了解,熟悉AT&T的基本彙編語法,瞭解偽指令和指令的差異,理解“彙編原始碼檔案是用來生成一段二進位制檔案塊的操作指示檔案”這句話的含義。如果沒有做到,請自學做到。
閱讀Linux核心程式碼的準備步驟:
1、讀一下Tanenbaum的《現代作業系統》這本書,理解了4大基本概念:Thread(執行緒/程序)、VMS(虛擬記憶體系統)、VFS(虛擬檔案系統)、I/O。
2、讀一下ARM或者X86(選一種即可)的Specification,理解了6大CPU機制:暫存器機制、多級快取機制、分段機制、分頁機制、中斷機制、多核同步機制。
3、選一個版本的核心原始碼(例如v3.18.137),選一個CPU架構(例如X86_64)。
4、下載選定版本的核心原始碼,並按照選的的CPU架構裁剪原始碼(刪掉其他架構的原始碼)。
5、配置好編譯流程。
現在你可以閱讀核心程式碼了,注意幾個事項:
1、用 https://elixir.bootlin.com/linux/v3.18.137/source 之類輔助普通IDE閱讀核心原始碼,有奇效。
2、早期,可以在核心原始碼的任意地方,用printk()輸出除錯資訊,輔助學習;熟了之後,自己寫一個核心模組,可以透過/proc/kallsyms找到任意核心符號的地址,從而可以隨時讀取任意的核心資料,輔助學習。
3、不要用“一層一層的函式”的視角看待核心原始碼,核心是由三類符號組成的:程式碼符號(函式)、資料符號(struct定義)、變數符號(具體型別的變數)。你首先要了解的是每一個功能模組相關的核心符號,例如mmap模組相關的核心符號有哪些,分別是什麼作用,相互之間什麼關係,最好畫個圖,然後再來看具體每個符號是怎麼實現的(一層一層細讀函式實現)。
Linux原始碼博大精深,處處是寶藏,祝福你尋寶順利~
回覆列表
一般在Linux系統中的/usr/src/linux*.*.*(*.*.*代表的是核心版本,如2.4.23)目錄下就是核心原始碼(如果沒有類似目錄,是因為還沒安裝核心程式碼)。另外還可從互連網上免費下載。注意,不要總到http://www.kernel.org/去下載,最好使用它的映象站點下載。請在http://www.kernel.org/mirrors/裡找一個合適的下載點,再到pub/linux/kernel/v2.6/目錄下去下載2.4.23核心。
程式碼目錄結構
在閱讀原始碼之前,還應知道Linux核心原始碼的整體分佈情況。現代的作業系統一般由程序管理、記憶體管理、檔案系統、驅動程式和網路等組成。Linux核心原始碼的各個目錄大致與此相對應,其組成如下(假設相對於Linux-2.4.23目錄): 1.arch目錄包括了所有和體系結構相關的核心程式碼。它下面的每一個子目錄都代表一種Linux支援的體系結構,
例如i386就是Intel CPU及與之相相容體系結構的子目錄。PC機一般都基於此目錄。 2.include目錄包括編譯核心所需要的大部分標頭檔案,例如與平臺無關的標頭檔案在include/linux子目錄下。 3.init目錄包含核心的初始化程式碼(不是系統的引導程式碼),有main.c和Version.c兩個檔案。這是研究核心如何工作的好起點。 4.mm目錄包含了所有的記憶體管理程式碼。與具體硬體體系結構相關的記憶體管理程式碼位於arch/*/mm目錄下。 5.drivers目錄中是系統中所有的裝置驅動程式。它又進一步劃分成幾類裝置驅動,每一種有對應的子目錄,如音效卡的驅動對應於drivers/sound。 6.ipc目錄包含了核心程序間的通訊程式碼。 7.modules目錄存放了已建好的、可動態載入的模組。 8.fs目錄存放Linux支援的檔案系統程式碼。不同的檔案系統有不同的子目錄對應,如ext3檔案系統對應的就是ext3子目錄。 Kernel核心管理的核心程式碼放在這裡。同時與處理器結構相關程式碼都放在arch/*/kernel目錄下。 9.net目錄裡是核心的網路部分程式碼,其每個子目錄對應於網路的一個方面。 10.lib目錄包含了核心的庫程式碼,不過與處理器結構相關的庫程式碼被放在arch/*/lib/目錄下。 11.scripts目錄包含用於配置核心的指令碼檔案。 12.documentation目錄下是一些文件,是對每個目錄作用的具體說明。 一般在每個目錄下都有一個.depend檔案和一個Makefile檔案。這兩個檔案都是編譯時使用的輔助檔案。仔細閱讀這兩個檔案對弄清各個檔案之間的聯絡和依託關係很有幫助。另外有的目錄下還有Readme檔案,它是對該目錄下檔案的一些說明,同樣有利於對核心原始碼的理解。