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 ***x_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
Linux kernel 關於keyboard部分
linux kernel 關於keyboard部分 keyboard.c 用於處理和鍵盤相關的input handler。其中包括後續的鍵碼轉換和輸出 atkbd.c 常用的鍵盤布局,用於獲得掃瞄碼,並將其傳送到input handler 鍊錶中 struct input handler kbd h...
裁剪編譯Linux Kernel 初識
參考 最近由於專案需要,需要編譯裁剪符合需求的kernel。大家都知道distribution的版本大都比較龐大,裡面很多東西其實對於自己的機器根本用不到,在嵌入式系統中由於flash與rom的大小有限。顯得裁剪kernel更加有必要。自己編譯核心能在選項裡去除這些多餘的選項,只挑選當前機器適用的硬...
關於linux kernel的死法
最近在除錯linux核心驅動,宕機無數次。關於linux的死法也有些心得。1 嘎嘣兒脆型。特點 啥提示也沒有,說宕就宕,var log messages 裡邊啥提示資訊也沒有。原因 八成是你自己沒玩兒好,在kernel裡邊記憶體越界了。還有兩成是超過了linux核心棧8k的限制。2 半死不活型。特點...