關於linux kernel編譯的幾項關鍵點

轉自 http://blog.sina.com.cn/s/blog_abc7e49a01011xlk.html

關於linux kernel編譯的幾項關鍵點:

1. make參數: CROSS_COMPILE

即交叉編譯器的前綴(prefix),也就是選擇將代碼編譯成目標cpu的指令的工具,如指定make CROSS_COMPILE=arm-none-linux-gnueabi-就是使用arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld等工具將代碼編譯成arm的可執行指令。如果不指定CROSS_COMPILE參數,make時將認爲prefix爲空,即使用gcc來編譯。

2. make參數: ARCH
即architecture,就是選擇編譯哪一種cpu architecture,也就是編譯arch/目錄下的哪一個子目錄。如指定make ARCH=arm就是編譯arch/arm下的代碼。如果不指定,make將使用本機(用什麼機器編譯就是什麼)的cpu作爲缺省ARCH.注意:arch/arm下不但有arm體系架構特有的代碼,還有arm特有的kconfig,也就是配置選項,所以在make menuconfig,make xxxx_defconfig的時候也必須指定ARCH=arm。

3. Configure & make kernel 的基本步驟
以編譯arm versatile爲利:

step 1:
make mrproper
清除所有上次編譯產生的文件和.config文件。

step 2:
make ARCH=arm versatile_defconfig
使用arch/arm/configs/versatile_defconfig文件的配置,versatile_defconfig的內容將被copy到.config中。.config文件是將用戶選好的編譯選項保存下來,make時讀取.config中的選項來編譯kernel。注意:必須指定ARCH=arm,否則make會到arch/i386/configs下去找versatile_defconfig。正如前面2.ARCH中所述不指定ARCH的話,將使用本機(i386)的ARCH作爲缺省ARCH。

step 3:
make ARCH=arm menuconfig
啓動圖形界面來作手工配置剛此生成的.config文件。此處也必須指定ARCH=arm,否則不會load剛纔生成的ARCH=arm的.config.
修改配置後保存退出。

step 4:
make -j4 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
編譯生成kernel image,arm的kernel image存放在arch/arm/boot/zImage. '-j4'的作用是啓動4線程編譯。



4. Kernel編譯生成產物:

vmlinux
位於kernel源代碼的根目錄下。vmlinux是virtual memory linux kernel.它是一個elf文件(executable & linking format),未壓縮,其中包含所有的symbol, comments。可用arm-none-linux-gnueabi-readelf來讀取其中的信息。

zImage(bzImage):
位於arch/arm/boot/下,是將vmlinux去除了symbol, comment後,添加了一段初始化代碼,然後用gzip壓縮,最後加上一小段mini gunzip代碼(用於load後解壓縮)而成的。bzImage是big zImage。zImage適用於小內核,如果kernel較大,應該用bzImage.

uImage:
位於arch/arm/boot/下,被uboot引導的kernel image。缺省狀態下不會被編譯出來,需要make uImage纔會被編譯。uImage實在zImage上加上一個64bytes的“header”,用來告訴uboot這個Image的大小等。
所以用hexdump可以看出,uImage從第64byte開始和zImage是完全一樣的。

System.map:
這是整個kernel Image中symbol與address的對應表。用vi打開即可看到。實際上在make的最後會用arm-none-linux-gnueabi-nm來讀取vmlinux elf文件,從而生成System.map。只要運行arm-none-linux-gnueabi-nm -n vmlinux > tmp.map就會發現tmp.map和System.map是一樣的。

下圖說明了這些產物之間的關係:

  make             - symbol, comment  + init code  gzip compress   + mini gunzip header
-------> vmlinux  ------------------>  ---------->  ------------->  ------------------->

                 64B header
zImage(bzImage) ------------>   uImage

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章