現狀:第一次讀內核的源代碼(物理內存管理第二次)。
資源:Linux-2.6內核源碼(vscode代碼瀏覽)+《深入Linux內核架構》
癥狀:(1)學習的速度慢。(2)看完一部分代碼後總是覺得零零散散不成系統 。
說明:第一個癥狀的原因是我看代碼的時候喜歡一層一層把輔助函數打開看,不知道這樣對不對。
首先,默認你對C語言已經十分精通,我的「精通」的意思是你能做到對C語言的編譯過程瞭然於心,深刻理解C語言編譯器是如何把文本的C源碼編譯成二進位指令的。如果沒有做到,請自學做到。
其次,默認你對彙編語言有一定了解,熟悉ATT的基本彙編語法,瞭解偽指令和指令的差異,理解「彙編源碼文件是用來生成一段二進位文件塊的操作指示文件」這句話的含義。如果沒有做到,請自學做到。
閱讀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源碼博大精深,處處是寶藏,祝福你尋寶順利~
填一些操作細節,可以讓入門者少花一些時間
1、快速在mac上做個內核編譯調試環境