machine ID 问题
2015-10-30 10:13
447 查看
Error: unrecognized/unsupported machine ID (r1 = 0x33f60264).
(2011-03-20
16:03:59)
标签:
| 分类: 私有 |
解决方法一
========================================================
Linux内核启动时出现:bad machine ID,原因大致是u-boot传递给内核的machine ID错误,可以手动在内核源代码中添加machine ID.
解决方法:
在u-boot命令行中输入bdinfo
查看板卡信息,我的输出如下:
[ ~ljh@GDLC ]# bdinfo
arch_number = 0x000000C1
env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x04000000
ethaddr = 08:00:3E:26:0A:5B
ip_addr = 10.1.8.245
baudrate = 115200 bps
修改内核的arch/arm/kernel/head.S,直接将s3c2410的参数赋给内核
# cd linux-2.6.19
# vi arch/arm/kernel/head.S +72
----------------------------------------------
70 __INIT
71 .type stext, %function
72 ENTRY(stext)
mov r0, #0
mov r1, #0xc1
ldr r2, =0x30000100
73 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
74 @ and irqs disabled
解决方法二
========================================================
启动u-boot后,用bootm命令来引导内核(执行bootm 0x30008000),但是执行后,卡住了,无法启动内核,现象如下:
Starting kernel ...
Uncompressing Linux.............................................................
Error: unrecognized/unsupported machine ID (r1 = 0x000000c1).
Available machine support:
ID (hex) NAME
000000** ****
从这里的提示信息可知,是u-boot的机器码和linux的不相同造成的,u-boot是0x000000c1(193),内核是0x000000**。大多数都是修改的linux内核的机器码,让它们一致即可。
先看u-boot的机器码和linux的机器码是在什么地方决定的。
1、 u-boot的机器码是在u-boot的board/fs2410/fs2410.c文件里决定的:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
参照查看u-boot的include/asm-arm/mach-types.h文件,有:
#define MACH_TYPE_SMDK2410 193
这就是我们上面看到r1 = 0x000000c1(193)的原因。
2、 而linux内核的机器码是由arch/arm/mach-s3c2410/mach-smdk2410.c下面的MACHINE_START(SMDK2410, "SMDK2440")中的第一个参数SMDK2410(关键字)决定的:
MACHINE_START(SMDK2410, "SMDK2410")
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io = smdk2410_map_io,
.init_irq = s3c24xx_init_irq,
.init_machine = smdk2410_init,
.timer = &s3c24xx_timer,
MACHINE_END
参照查看内核目录下的arch/arm/tools/mach-types.h文件,有:
smdk2410 ARCH_SMDK2410 SMDK2410 193
只要保持两个文件(u-boot的board/fs2410/fs2410.c与linux内核的arch/arm/mach-s3c2410/mach-smdk2410.c)参照对象的码值一样就可以了!
解决方法三
========================================================
修改u-boot,填写ID;
# vi common/cmd_boot.c
----------------------------------------------
31 #if defined(CONFIG_I386)
32 DECLARE_GLOBAL_DATA_PTR;
33 #endif
====>
31 //#if defined(CONFIG_I386)
32 DECLARE_GLOBAL_DATA_PTR;
33 //#endif
...
60 #if !defined(CONFIG_NIOS)
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
61 rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
62 #else
63
66 rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]);
67 #endif
相关文章推荐
- 009 The Interfaces In JAVA(官网文档翻译)
- MyEclipse非常方便的快捷键
- oracle数据迁移中的故障解决:
- 执行做jffs2的build.sh脚本错误————/usr/bin/ld: cannot find -lc
- Supporting Different Screen Sizes
- 单词翻转
- 微信支付app支付3.0接口开发
- php 连续留存与留存人数计算
- docker详细的基础用法
- Day7.2 计算机中的进制
- 51nod 1089 最长回文子串 V2 (Manacher算法)
- python第一章1.2 初步走进编程之门
- Java重写方法与初始化的隐患
- 【codevs1191】数轴染色 并查集
- 学习windows驱动(温习3)
- apt-get
- selenium+eclipse搭建及编写第一个test代码
- mysql中or和in的效率问题
- 数据结构和算法学习 —— 一次一题
- 如何在Django1.8 结合Python3.4版本中使用MySql