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


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

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

 

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是相一致的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM