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