uncompressing linux .................................................後沒反應解決辦法

編譯kernel是的no machine record defined 錯誤,網上有一些解法,其實都是錯誤的,以訛傳訛。不打算自己寫,找到一篇還算靠譜的,轉摘一下。

其根本原因是沒有在 __proc_info_end  與 __proc_info_begin 之間找到有效的machine ID。


首先,要排除硬件的原因,我有次遇到這個問題,最終查到的原因是arm芯片的電源電壓不夠。這個電壓剛好處於一個臨界值,能夠支持u-boot正常運行,卻不能支持kernel的正常運行,把電壓提上來一點點就能夠正常運行kernel了。 


http://hi.baidu.com/rwen2012/item/9f5191c64036d87ecfd4f849

在新的kernel 2.6.29 上編譯不能通過,終端提示: 

arm-none-linux-gnueabi-ld: no machine record defined 

解決方法 
放狗搜後,按照如下方法可以解決。將arch/arm/kernel/vmlinux.lds的最後兩行(如下),給註釋起來,但都沒說是爲了什麼 

ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") 
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") 


自己到arch/arm/kernel/vmlinux.lds裏看的時候,才發現那兩行的上頭寫着 

/* These must never be empty 
If you have to comment these two assert statements out, your binutils is too old (for other reasons as well) */ 
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") 
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") 


我想可能不是我交叉編譯器太舊的緣故,而是太新了! 
我用的是:Sourcery G++ Lite 2009q1-126 for ARM GNU/Linux 
而官方是:Sourcery G++ Lite 2008q1-126 for ARM GNU/Linux 

機器ID錯誤: 
現在註釋後可以正常編譯內核了!替換新的內核文件,在boot後提示: 
uncompressing linux ................................................. 
然後再沒有動靜了,我想可能解壓後給kernel傳遞參數時出現問題了吧。但是是什麼參數可能出的問題就不曉得啦。 

在這裏困住了好久!因爲這句話啥都沒提示!好歹有句話啊。。。。。。。。 

經過多方搜索,發現了一個調試技巧,嘿嘿嘿,一般人我不告訴他!那就是下面解決方法中提到的設置Kernel debugging,設置後,再重啓啓動內核就會出現詳細的問題說明。 



因爲內核啓動時首先進入SVC模式,關閉中斷,並machine ID,如果uboot傳輸過來的 machine ID跟編譯的內核machine ID不一致,那就就咯屁了。具體表現爲:啥反應都沒有! 

解決方法: 
1)。執行make xconfig 

在配置中進入Kernel hacking,打開Kernel debugging和Kernel low-level debugging functions. 

選中這兩項的目的是打印出調試信息,重新make uImage 

Starting kernel ... 

Uncompressing Linux........................................................................................... done, booting the kernel. 

Error: unrecognized/unsupported machine ID (r1 = 0x000007d1). 

Available machine support: 

ID (hex) NAME 

罓?0009 

Please check your kernel config and/or bootloader. 


終於看到阻在這裏的原因啦,是機器ID錯誤,別人的機器ID錯誤至少有個NAME值啊,我的咋爲空呢? 

2) 是不是沒有註冊機器ID?猜測。這一步保證系統支持的ID裏面含有devkit8000! 

make xconfig 發現system type菜單下面沒有devkit的選項,肯定是哪裏的配置文件還沒有添加,經過分析,找到了/kernel/arch/arm/mach-omap2/Kconfig文件,在末尾配置添加了devkit8000支持。 

config MACH_OMAP3_BEAGLE 

bool "OMAP3 BEAGLE board" 

depends on ARCH_OMAP3 && ARCH_OMAP34XX 

config MACH_OMAP3_DEVKIT8000 

bool "OMAP3 DEVKIT8000 board" 

depends on ARCH_OMAP3 && ARCH_OMAP34XX 


然後make xconfig 發現system type菜單,選擇devkit選項,選devkit8000,保存。 

3)上一步僅僅能保證可以支持,要想能正確支持,還要修改下面的文件。 

1. 我們進到arch/arm/mach-omap2/board_devkit8000.c,在最後一段有這句 

MACHINE_START(OMAP3_DEVKIT8000 , ”OMAP3 beggle board”) 

這裏OMAP3_DEVKIT8000就是machine ID的代號~ 呢具體值是多少呢?~ 

2. 在文件arch/arm/tools/mach-types中最後一行添加,設置我們的machine ID是2001。 

omap3_devkit8000 ARCH_OMAP3_DEVKIT8000 OMAP3_DEVKIT8000 2001 


通過修改Kconfig和mach-types兩個文件,我們可以使系統正確的識別我們的machine ID,並且從上面我們也可以看到r1= 0x000007d1,0x7d1就是2001。與我們所設置的machine ID是相一致的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章