Kbuild 編譯 Linux 內核系列(一)
Author: Wei Yang
作者公眾號:楊小偉的世界
內核編譯是一個非常生僻的領域,哪怕是做內核的童鞋也不一定關注過整個內核編譯的流程,更不用說內核的門外漢了。
然而了解學習內核編譯系統,可能會有你意想不到的收穫。我在這個過程中從以下幾個方面獲得收益。
- 深入的理解_ makefile _如何管理大型項目
- 編譯出錯了也不會那麼慌張
- 多年後才明白究竟是哪個文件才是放在 /boot/ 目錄下的那個啟動文件以及它和另一個很像的文件之間的差別
- 節省了編譯時間,不會每次都用 make all 這種粗暴的方式了
- 傳說的 make -j8 中,這8個進程是在什麼條件下才能開啟的
- 進一步的了解了整個內核的構造,而不是僅僅知道自己做的那一塊了
- 了解了某些編譯鏈接細節,幫助看懂內核啟動時的一些操作
但是很多人,包括我自己在很長的一段時間內都沒有相對仔細閱讀和研究內核編譯的過程。在此,我希望通過分享自己一點點的經驗,幫助大家破除對內核編譯系統的抵觸,快速掌握內核編譯系統的整體架構,為後續的深入研究開一個好頭。
鑒於本人經驗尚淺,或有不透徹甚至是錯誤的地方,還望大家包涵。如能告知,萬分感謝。
先用起來
大多數人都是從最簡單的開始的,我也不例外。首先你得有這麼一個環境,能夠編譯內核,接下來你才有機會去修改去實驗去探索內核編譯的過程。
第一步先
由此小白們可以體會一下編譯的過程,和使用自己編譯的內核的快樂。也為後續我們做深入的實驗做好準備。
在了解了基本的編譯過程和步驟之後,我們再來看看那些
這些小目標可以幫助我們
- 生成輔助資料
- 生成單個目標文件
- 節約時間
- 偶爾可以幫助一下調試
或許你會發現某個對你有用的~
跟著我走
現在我們已經會使用基本的命令製作出內核和一些小目標了。說實話,整個_kbuild_系統還是有點複雜的。不過不用擔心,我們先來三個簡單的小目標,了解一下基本的運作方式。或許你會覺得並沒有想像中的那麼高不可攀,或許可以讓自己覺得還是有那麼點機會可以看懂的~
先來一個最簡單最直接的
看了這個例子,你或許會覺得不過癮。什麼嘛,這個 help 的目標就和平時自己寫的 makefile 的套路是一樣的。沒有什麼花頭,也不是什麼高級貨。好了,這次我們來一個稍微複雜一些的。上面的例子太直接了只有一個層次的結構,那這次來一個有兩層的看看。
有了上述這兩個不是編譯目標的目標,我們已經儲備了相當的 make 和 kbuild 知識,了解了一定的 kbuild 系統結構,接下來來看一個稍微複雜一點但相對還是比較直接的目標。這次可是貨真價實的編譯目標了哦~
真刀真槍
能走到這,而且看懂上面三個小目標的基本上已經儲備了足夠多的基礎知識。正所謂養兵千日,用兵一時,接下來我們就該動真格的了~
在根目錄下最明顯的內核目標就數 vmlinux 了。不過編譯內核這麼多年,安裝內核無數次,卻從來都沒有好好研究過他老人家出生的過程。那我們就先來看看
研究完了根目錄的 vmlinux ,我突然發現還有一個叫 bzImage 的目標。也是啊,內核不是說要壓縮的么? vmlinux 是 ELF 格式,那就能被直接載入到內存了?帶著這些疑惑,讓我們來探索一下
探索的過程中發現 bzImage 是由 setup.bin 和 vmlinux.bin 兩個目標粘合而成。看來馬上就要弄明白整個 bzImage 編譯過程了。咱逐個探索~
setup.bin的誕生記 和 真假vmlinux--由vmlinux.bin揭開的秘密
終於,經歷了九九八十一難之後,可以說徹底的理解了內核編譯的整個過程,也對 kbuild 系統架構有了基本的認識。可以學成下山了。
寫在最後
整個內核的編譯系統依然是十分龐大複雜的。其中還有不少細枝末節在本系列中沒有深入仔細地去分析,講解和探索。經過了這麼一段時間的磨練,相信大家已經掌握了基本的知識,對 kbuild 系統運作原理有了深入了解,若能為大家進一步的探索打下了基礎也算是沒有白費功夫。
本系列文章或許還會再修正更新增加,本次更新就先到這裡。願大家能夠在內核探索的道路上勇猛精進。
送君千里,終須一別,我們來日江湖再見~
本文是 LinuxStory 柴米油鹽計劃的投稿文章,由 LinuxStory 整理髮布。
原作者署名為:Wei Yang 。
轉載請註明出處,否則必究相關責任。
本文鏈接:https://linuxstory.org/kbuild-compile-linux-1/
[…] Kbuild 編譯 Linux 內核系列(一) Kbuild 編譯 Linux 內核系列(二) Kbuild 編譯 Linux 內核系列(三) […]