我先把造成Uncompressing Linux..... done, booting the kernel.的常見的幾種可能再羅列一下
1、機(jī)器碼不匹配
解決方法:在配置內(nèi)核時開啟debug
Kernel hacking -> Kernel low-level debugging functions 是打開的
Kernel hacking -> Kernel low-level debugging messages via S3C UART 也是打開的
在Device Drivers->Character devices->Serial drivers中選擇加載Samsung SoC serial support ,然后再選上Support for console on Samsung SoC serial port 。
如果是機(jī)器碼不匹配的問題,就會出現(xiàn)相關(guān)打印信息例如
Machine configuration botched (nr 182), unable to continue.
核對一下你的uboot機(jī)器碼是否匹配。
如果不匹配,你可以修改uboot include/asm-arm/mach-types.h 文件中有關(guān)機(jī)器碼的定義。或者修改內(nèi)核 arch/arm/tools/mach-types 文件。
在新內(nèi)核移植時有關(guān)機(jī)器碼的修改步驟及分析如下:
修改機(jī)器碼,機(jī)器碼在2/arch/arm/mach-s3c2440/mach-test2440.c文件中MACHINE_START(TEST2440, "TEST2440")這一行定義的,第二個參數(shù)無所謂,重要的是第一個參數(shù),在gcc編譯這個mach-test2440.c的時候,會把TEST2440匹配到/include/asm-arm/mach-types.h中的"#define MACH_TYPE_TEST2440 N"這里, 如果在mach-types.h中找不到MACH_TYPE_TEST2440的定義, gcc編譯mach-test2440.c則報錯;
還有,/include/asm-arm/mach-types.h是每次make zImage過程中, 由arch/arm/tools/mach-types文件生成的,
總結(jié),修改機(jī)器碼,涉及內(nèi)核代碼的三個地方,MACHINE_START宏,mach-types.h,mach-types,初啟動時,bootloader向內(nèi)核傳遞一個機(jī)器碼。
2、串口配置不正確
確保在配置內(nèi)核時選上了在Device Drivers->Character devices->Serial drivers中選擇加載Samsung SoC serial support ,然后再選上Support for console on Samsung SoC serial port 。
3、arch/arm/mach-s3c2440/Kconfig配置文件設(shè)置出錯,某項關(guān)鍵選項沒選上。
這個情況在網(wǎng)上不多見,但是一出錯就會讓人很糾結(jié)。如果芯片級或板級關(guān)鍵配置沒選上或?qū)е聝?nèi)核啟動進(jìn)入start_kernel函數(shù)之前就進(jìn)入死循環(huán)。如果芯片級的配置沒選上,會在內(nèi)核執(zhí)行完cpu id號匹配函數(shù)__lookup_processor_type()后進(jìn)入死循環(huán),這種情況你無論怎么配置內(nèi)核的debug,串口都不會再有打印信息輸出了。只有點個燈之類的才能跟蹤代碼的執(zhí)行。
這種情況往往在打印Uncompressing Linux..... done, booting the kernel后就無任何輸出了,即便你配置了debug。
我碰到這種情況是因為我在arch/arm/mach-s3c2440/Kconfig 上沒有select ARCH_S3C2440。
導(dǎo)致Uncompressing Linux..... done, booting the kernel 卡住的大致就這幾種情況。
|