天天看點

ARM—Linux核心編譯

Linux核心編譯

編譯過程

1.    修改Makefile

2.    配置 make XXX_defconifg

3.    make uImage

4.設定uboot啟動參數

檢視預設配置

find –name “*defconfig”

arm架構的預設配置在arch/arm/configs裡面

比如會有mini2440_defconfig,s3c2410_defconfig

使用預設配置進行配置:

make s3c2410_defconfig

執行之後會生成 .config檔案

Vi .config檢視一下

搜尋一下MINI2440:

可以看到有 MINI2440,也有SMDK2440

先編譯一下

Make uImage

下載下傳啟動後發現亂碼,即初始化函數參數不對:初始化過程:

根據bootloader傳入的機器ID,查找核心支援的所有機器ID,比對哪個調用哪個的初始化函數。

Uboot代碼中會寫一個預設的MACH ID,也可使用uboot環境變量設定machid。

比如MACH_TYPE_SMDK2410為193,這個193在哪裡呢?

檢視剛才被編譯了的mach開頭的源檔案,cd arch/arm

Find –name “mach*.o”,列出的即剛才編譯的核心能夠支援的開發闆。可以看到有很多。

測試一下:

在uboot中設定一個不存在的mach id,

Set machid 33333

Save

啟動核心:會看到如下資訊

這裡列出了支援的單闆,其中有一行16a  SMDK2410

如果想使用smdk2410,這設定 machid為16a

他們對應的檔案是哪一個呢? Smdk2440對應的如下:smdk2440.c

根據mach id數值,找到這個結構體,調用其中的初始化函數

MACHINE_START 與 MACHINE_END 之間定義了初始化函數。

設定為smdk2440的mach id後重新開機核心,仍然亂碼,設為mini2440的machid試一下:

Set machid 7CF

Save

正确設定uboot啟動參數(包括序列槽波特率)後啟動核心課看到序列槽的輸出,為什麼mini2440的機器ID會産生輸出呢?

對比 mach_smdk2440.c 與mach_mini2440.c在初始化函數的差别,課看到map_io函數的差别:s3c24xx_init_clocks初始化時鐘與我們使用的單闆不對應。

修改晶振後可正常使用序列槽,啟動核心會發現找不到根檔案系統的提示,檢視在哪裡列印的提示,可以通過grep代碼的方式:

grep “\”Boot\ Agent\’” * -nR

可以查到很多含有該字元串的檔案,可以判定應該在common_smdk.c中

找到位置後可修改分區。

繼續閱讀