linux内核 机器码,u-boot与Linux内核机器码问题
在<>一文中,執行完第6步的操作后,啟動u-boot后,用bootm 命令來引導內核(執行bootm 0x30008000),但是執行后,卡住了,無法啟動內核,現象如下:
Starting kernel ...
Uncompressing Linux.............................................................
Error: unrecognized/unsupported machine ID (r1 = 0x000000c1).
Available machine support:
ID (hex)??????? NAME
000000a8??????? SMDK2440
從這里的提示信息可知,是u-boot的機器碼和linux的不相同造成的,u-boot是0x000000c1(193),內核是 0x0000016A(362)。網上大多數都是修改的linux內核的機器碼,在arch/arm/tools/mach-types.h中,讓它們一致,具體修改哪一方,我覺得要看情況而定。
我們先看u-boot的機器碼和linux的機器碼是在什么地方決定的(為了搞清這個問題,我找了一天時間,呵呵)。u-boot的機器碼是在u-boot的board/samsung/ok2440v3/ok2440v3.c文件里決定的:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
查看u-boot/include/asm-arm/mach-types.h文件,有:
#define MACH_TYPE_SMDK2410??????? 193
#define MACH_TYPE_S3C2440??????? ?? 362
這就是我們上面看到r1 = 0x000000c1(193)的原因。
而linux的機器碼是由arch/arm/mach-s3c2440/mach-smdk2440.c下面的MACHINE_START(S3C2440, "SMDK2440")中的第一個參數S3C2440(關鍵字)決定的:
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks */
.phys_io?? ?= S3C2410_PA_UART,
.io_pg_offst?? ?= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params?? ?= S3C2410_SDRAM_PA + 0x100,
.init_irq?? ?= s3c24xx_init_irq,
.map_io?? ??? ?= smdk2440_map_io,
.init_machine?? ?= smdk2440_machine_init,
.timer?? ??? ?= &s3c24xx_timer,
MACHINE_END
查看內核目錄下的arch/arm/tools/mach-types.h文件,有:
smdk2410?? ??? ?ARCH_SMDK2410?? ??? ?SMDK2410?? ??? ?193
s3c2440?? ??? ?ARCH_S3C2440?? ??? ?S3C2440?? ??? ???????? 362
smdk2440?? ??? ?MACH_SMDK2440?? ??? ?SMDK2440?? ??? ?1008
關鍵字是s3c2440,所以我們上面看到的是0x000000a8(362)。
所以,我們這里不去修改內核,而是直接修改u-boot 的 board/samsung/ok2440v3/ok2440v3.c文件,如下:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
重新編譯u-boot后,下載到nand中,完成<>一文中的第8步后,就可以手動成功引導內核了。
總結
以上是生活随笔為你收集整理的linux内核 机器码,u-boot与Linux内核机器码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷垂直过山车叫什么
- 下一篇: 上海欢乐谷三大过山车