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

2021-06-21 02:58:23 字數 2460 閱讀 8504

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 半死不活型。特點...