柴米油鹽計劃

Kbuild 編譯 Linux 內核系列(三)

Author : Wei Yang
作者公眾號:楊小偉的世界

王首富定過一個億的小目標,雖然內核沒有一個億,卻還是有不少有意思的小目標的。

這些小目標可以幫助我們:

  • 生成輔助資料。
  • 生成單個目標文件。
  • 節約時間。
  • 偶爾可以幫助調試。

那我們就一個個講吧~

all 或者 空

當你在內核代碼目錄下執行 make 的時候,編譯的目標默認就是 all 。

代碼中的注釋很好的解釋了這個目標的意義。

# The all: target is the default when no target is given on the command line.
# This allow a user to issue only 'make' to build a kernel including modules

這個目標在 x86 平台等價於 vmlinux + modules + bzImage

vmlinux

嗯,這個就是你編譯完成後在 Linux 源代碼目錄下的那個 vmlinux 。

注意了,這是一個 ELF 文件,用處以後你會慢慢知道的。

modules

modules 就是編譯內核模塊。

所以整個內核,你可以理解為就是 vmlinux + modules

bzImage

那既然 vmlinux + modules 組成了整個內核,多出來了一個 bzImage 來插什麼腿?

這個東西可以看作是 vmlinux 的衍生。可以看到 vmlinux 是 ELF 格式,首先在引導程序要載入的時候要看得懂這個格式,另外這個文件比較大。現在 4.9 的內核編譯下來 vmlinux 就有 422M 這麼大,直接放到啟動分區實在太佔地方。當然我這個沒有裁剪,裁剪後應該可以相應減少,但是恐怕也不會小太多。

所以 bzImage 可以粗暴地理解為: ELF載入器 + 壓縮了的 vmlinux 。
整個壓縮完之後 bzImage 大小只有 7M 不到了,這壓縮能力杠杠的。

M=drivers/xxx

這個可以看作是 modules 目標中的更小的一個目標了。

舉一個栗子大家看了或許更明白:

make M=drivers/net/ethernet/intel/ixgbe/

這條命令只會去編譯 ixgbe 這個驅動,而不會對其他無關驅動進行檢測編譯。對開發以及後期維護來說,節省了不少編譯時間。

dir/file.o

這是單獨編譯某個文件,當你修改某個文件做開發的時候,你可以先單獨編譯你修改的文件確保沒有語法錯誤,然後再編譯內核或者是模塊。

比如在 ixgbe 模塊中,更改了 ixgbe_ethtool.o 文件,那麼你可以先運行:

make drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.o

這樣確保單個文件的語法沒有錯誤,然後再去編譯整個模塊。

同樣這也節省了編譯時間,尤其是當遇到某個文件編譯有錯誤的時候。

dir/file.i

這個目標是針對某個文件只做預處理,也就是把所有的頭文件和宏定義都展開。

用法很簡單:

make mm/memblock.i

就生成了 mm/memblock.i 文件,其結果是已經預處理完的,就是宏定義展開後的源文件。

感覺用處不是很多,能想到的就是在閱讀內核源代碼的時候可以確定到底這個宏定義的是啥。因為內核需要在不同的體系架構下都能運行,而且同一架構體系下又有不同的配置。所以同樣一個函數或者宏會在不同情況下定義成不同的樣子,有時候直接肉眼去看代碼不一定能看得准。

這個時候就可以執行這個命令,直接看預處理後的文件,或許可以有助於你理解代碼。

dir/file.s

這個作用是生成了指定文件的彙編代碼。

用法類似:

make mm/memblock.s

這估計是要做彙編級的調試了,俺還從來沒有整過。

cscope

這個目標特殊,已經不是代碼了,是生成 cscope 的文件。嗯,這個文件是用來輔助閱讀代碼的。

懂得人秒懂,不懂的估計得重新開一個話題了。

isoimage

這個還是 Andi Kleen 告訴我的。這是一個包含內核的可以啟動的 iso 文件。
用來調試用的,用得真的不多。

有興趣的朋友或許可以在我其他的文章中見到它的身影。

help

最後的最後, kbuild 中提供了一個 help 目標。當你不確定如何使用或者還想知道哪些目標可以用時,那就執行:

make help

然後你就可以知道都有哪些用法了。

好了,小目標們講完了。現在是不是對內核編譯又有了點了解?強烈建議沒有編譯過這些小目標的讀者實踐一下,看一看執行的結果能加深自己對內核編譯過程的印象。

還是那句話:

紙上得來終覺淺,絕知此事須躬行!


本文是 LinuxStory 柴米油鹽計劃的投稿文章,由 LinuxStory 整理髮布。
原作者署名為:Wei Yang 。
轉載請註明出處,否則必究相關責任。
本文鏈接:https://linuxstory.org/kbuild-compile-linux-3/

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
這裡是柴米油鹽計劃投稿的發布賬號。

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據