关于linux kernel编译的几项关键点:
生活随笔
收集整理的這篇文章主要介紹了
关于linux kernel编译的几项关键点:
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. make參數: CROSS_COMPILE
即交叉編譯器的前綴(prefix),也就是選擇將代碼編譯成目標cpu的指令的工具,如指定makeCROSS_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,就是選擇編譯哪一種cpuarchitecture,也就是編譯arch/目錄下的哪一個子目錄。如指定makeARCH=arm就是編譯arch/arm下的代碼。如果不指定,make將使用本機(用什么機器編譯就是什么)的cpu作為缺省ARCH.注意:arch/arm下不但有arm體系架構特有的代碼,還有arm特有的kconfig,也就是配置選項,所以在makemenuconfig,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 linuxkernel.它是一個elf文件(executable & linkingformat),未壓縮,其中包含所有的symbol,comments。可用arm-none-linux-gnueabi-readelf來讀取其中的信息。
zImage(bzImage):
位于arch/arm/boot/下,是將vmlinux去除了symbol, comment后,添加了一段初始化代碼,然后用gzip壓縮,最后加上一小段mini gunzip代碼(用于load后解壓縮)而成的。bzImage是bigzImage。zImage適用于小內核,如果kernel較大,應該用bzImage.
uImage:
位于arch/arm/boot/下,被uboot引導的kernel image。缺省狀態下不會被編譯出來,需要makeuImage才會被編譯。uImage實在zImage上加上一個64bytes的“header”,用來告訴uboot這個Image的大小等。
所以用hexdump可以看出,uImage從第64byte開始和zImage是完全一樣的。
System.map:
這是整個kernelImage中symbol與address的對應表。用vi打開即可看到。實際上在make的最后會用arm-none-linux-gnueabi-nm來讀取vmlinuxelf文件,從而生成System.map。只要運行arm-none-linux-gnueabi-nm -n vmlinux> tmp.map就會發現tmp.map和System.map是一樣的。
下圖說明了這些產物之間的關系:
? make????????????- symbol, comment? + init code?gzip compress?? + mini gunzipheader
-------> vmlinux?------------------>?---------->?------------->?------------------->
????????????????64B header
zImage(bzImage)------------>??uImage
即交叉編譯器的前綴(prefix),也就是選擇將代碼編譯成目標cpu的指令的工具,如指定makeCROSS_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,就是選擇編譯哪一種cpuarchitecture,也就是編譯arch/目錄下的哪一個子目錄。如指定makeARCH=arm就是編譯arch/arm下的代碼。如果不指定,make將使用本機(用什么機器編譯就是什么)的cpu作為缺省ARCH.注意:arch/arm下不但有arm體系架構特有的代碼,還有arm特有的kconfig,也就是配置選項,所以在makemenuconfig,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 linuxkernel.它是一個elf文件(executable & linkingformat),未壓縮,其中包含所有的symbol,comments。可用arm-none-linux-gnueabi-readelf來讀取其中的信息。
zImage(bzImage):
位于arch/arm/boot/下,是將vmlinux去除了symbol, comment后,添加了一段初始化代碼,然后用gzip壓縮,最后加上一小段mini gunzip代碼(用于load后解壓縮)而成的。bzImage是bigzImage。zImage適用于小內核,如果kernel較大,應該用bzImage.
uImage:
位于arch/arm/boot/下,被uboot引導的kernel image。缺省狀態下不會被編譯出來,需要makeuImage才會被編譯。uImage實在zImage上加上一個64bytes的“header”,用來告訴uboot這個Image的大小等。
所以用hexdump可以看出,uImage從第64byte開始和zImage是完全一樣的。
System.map:
這是整個kernelImage中symbol與address的對應表。用vi打開即可看到。實際上在make的最后會用arm-none-linux-gnueabi-nm來讀取vmlinuxelf文件,從而生成System.map。只要運行arm-none-linux-gnueabi-nm -n vmlinux> tmp.map就會發現tmp.map和System.map是一樣的。
下圖說明了這些產物之間的關系:
? make????????????- symbol, comment? + init code?gzip compress?? + mini gunzipheader
-------> vmlinux?------------------>?---------->?------------->?------------------->
????????????????64B header
zImage(bzImage)------------>??uImage
總結
以上是生活随笔為你收集整理的关于linux kernel编译的几项关键点:的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 是川银藏投资五原则,看完就涨知识了
- 下一篇: linux下gsoap的初次使用 (c)