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中
找到位置後可修改分區。