5916|18

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Linux移植过程中的一些问题 [复制链接]

用的是s3c2440的板子,下了最新的Linux内核,按照网上现有资源修改了一些配置后烧入nand flash。u-boot启动后将zImage考入ram,然后出现一些问题
1.
Booting image at 32000000 ...
Bad Magic Number
utu-bootloader=>>>go 32000000
## Starting application at 0x32000000 ...
Uncompressing Linux.................. done, booting the kernel.
Linux version 2.6.27 (root@localhost.localdomain) (gcc version 3.4.1) #3 Sun Dec 14 11:16:14 EST 2008
为什么u-boot不能成功跳至32000000运行,而用go 32000000才能运行呢?

2.
刚开始的时候验证machine ID失败,按照网上的修改方法在head.s下添加了
   mov    r0, #0
   mov    r1, #0xc1
   ldr    r2, =0x30000100
不过0xc1是2410的,2440的machine ID是16a,但是如果把第二据修改成mov r1,#0x16a之后编译错误!
请问为什么,该怎么办。

谢谢!
此帖出自Linux开发论坛

最新回复

先设置 autostart u-boot#set autostart on 然后再从nand flash中下载zImage到指定地址,下完后,它会自动启动,也不用输入什么bootm,go之类的文件。   详情 回复 发表于 2009-6-6 02:11
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不懂,帮顶
此帖出自Linux开发论坛
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你是交叉编译的吗?
此帖出自Linux开发论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
to BEYONDMA:
是的,编译工具是板子带的,应该没问题吧。
此帖出自Linux开发论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 dahuatttt 的帖子:
用的是s3c2440的板子,下了最新的Linux内核,按照网上现有资源修改了一些配置后烧入nand flash。u-boot启动后将zImage考入ram,然后出现一些问题
1.
Booting image at 32000000 ...
Bad Magic Number
utu-bootloader=>>>go 32000000
## Starting application at 0x32000000 ...
Uncompressing Linux.................. done, booting the kernel.
Linux version 2.6.27 (root@localhost.localdomain) (gcc version…

第一个问题比较奇怪,没看到哪里说明uboot跳转到32000000失败的呀?而go 32000000只是打印信息输出的,表明是要跳转去32000000。

第二个没碰到过,从语法上讲应该是正确的。如果0xc1改成别的值呢?比如0xc2,0xff之类的
此帖出自Linux开发论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
1. uboot只认识uImage啊,zImage当然Bad magic了,不过zImage是自解压的,所以go过去就可以了
2.立即数有范围限制的,最低位的1和最高位的1不能相差8位以上
此帖出自Linux开发论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 hhyh612 的回复:
1. uboot只认识uImage啊,zImage当然Bad magic了,不过zImage是自解压的,所以go过去就可以了
2.立即数有范围限制的,最低位的1和最高位的1不能相差8位以上
[/quote]
那有什么办法让uboot能够成功跳转到32000000吗?我改u-boot代码没信心。
最低位的1和最高位的1不能相差8位以上是啥意思?不是很理解。

[quote]引用 4 楼 shuiyan 的回复:
第一个问题比较奇怪,没看到哪里说明uboot跳转到32000000失败的呀?而go 32000000只是打印信息输出的,表明是要跳转去32000000。

第二个没碰到过,从语法上讲应该是正确的。如果0xc1改成别的值呢?比如0xc2,0xff之类的

那个bad magic number是错误信息。go 32000000是我输入的命令。
至于那个machine ID(0xc1)。貌似不能随便改,好象有规定的,具体也不是很懂。
此帖出自Linux开发论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
1.不需要修改uboot的,用go 32000000就可以了,不要用bootm
2.就是说把立即数最低端的0全部移去,那么这个立即数必须小于256
此帖出自Linux开发论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

9
 
2.错了,补充一下,是把立即数最右端的0移去偶数位,然后它必须小于256
此帖出自Linux开发论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 hhyh612 的回复:
1.不需要修改uboot的,用go 32000000就可以了,不要用bootm
[/quote]
那意思是等u-boot结束,还得手动输入go 32000000才能启动不是。。。没有自动的么?

[quote]引用 8 楼 hhyh612 的回复:
2.错了,补充一下,是把立即数最右端的0移去偶数位,然后它必须小于256

还是不明白应该怎样修改。。。
此帖出自Linux开发论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
1。不用,在bootcmd里多写一条命令,比如set bootcmd 'nand read 32000000 ;go 32000000'
2。把mov r1,#0x16a改为两条指令
mov r1,#0x6a;
orr r1,r1,#0x100
或者一条指令 ldr r1,=0x16a
此帖出自Linux开发论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
非常感谢hhyh612的修改方法。
关于"立即数有范围限制的,最低位的1和最高位的1不能相差8位以上"能不能再给你更具体的解释吗?以后再遇到我好自己来修改,谢谢!
此帖出自Linux开发论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

13
 
精确的解释这个意思挺麻烦的

根据指令编码

imm = (imm_8)循环右移(2*rot_4)位,其中0<=imm_8<=255,0<=rot_4<=15

能够表示成上述格式的立即数imm,可以写到指令mov reg, #imm中,否则就不行
此帖出自Linux开发论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

14
 
不懂,帮顶
此帖出自Linux开发论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
不懂,帮顶
此帖出自Linux开发论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 
mark
此帖出自Linux开发论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

17
 
mark
此帖出自Linux开发论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

18
 
通过hhyh612提供的信息,搜索相关关键字,得到如下信息:
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678
就是把0x12345678这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。

另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
ldr r0, =0x12345678
这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。

ldr伪指令和ldr指令不是一个同东西。

引用地址: http://samuelsarla.blog.hexun.com/17760043_d.html
感谢hhyh612和其他朋友!
此帖出自Linux开发论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

19
 
先设置 autostart
u-boot#set autostart on
然后再从nand flash中下载zImage到指定地址,下完后,它会自动启动,也不用输入什么bootm,go之类的文件。

此帖出自Linux开发论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表