6310|15

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

嵌入式中linux引导前奏曲。 [复制链接]

我编写了TQ2440的启动代码,在完成各个部件的初始化后,调用自己写的C程序Copy2SDRAM把在Nand flash中以0x1f0000开始,大小为0x00200000的linux内核拷贝到内存中0x30008000处,然后ldr pc , =0x30008000.
在终端上显示:
#starting application at 0x30000000
Uncompressing Linux.......................................
.......................done , booting kernel.
然后就停住了。

请问问题会在那里呢?引导linux前,有那些必要的准备工作?
此帖出自Linux开发论坛

最新回复

恭喜,多谢分享。  详情 回复 发表于 2010-3-15 22:22
点赞 关注

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
"booting kernel."是你的程序打印的吧?是否还没到LINUX?
如果是这样的话就要查一下从NAND复制程序到RAM的过程中是否正确完成,建议在跳转语句前加一个使用串口输入命令便执行while(1)的代码,或者干脆就在此加上while(1),然后通过ADS看下0x30008000处的代码与LINUX的代码是否一致,每个512字节看一段,查看是否数据都对。
此帖出自Linux开发论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼上说的对。

想办法验证下自己拷贝的代码是否正确无误。


MARK.
此帖出自Linux开发论坛
 
 
 

回复

66

帖子

1

TA的资源

一粒金砂(初级)

4
 
不懂Linux呢。呵呵,帮顶了。
此帖出自Linux开发论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
首先确定你在NAND FLASH中的内容是不是有问题,也就是说起码数据时没有问题的,才能谈到拷贝之后的跳转没有问题。
确定SOURCE数据没有问题之后,再看看你的C数据搬移代码是不是有问题,搬移的地址和搬移的方法是否正确。可以自己写一个函数把0x30008000之后的内容打印出来,也可以采用系统的方法来看。

都没有问题了,还不好用,只能怀疑你加载的内核有问题了。
此帖出自Linux开发论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
如果是 u-boot启内核
u-boot会读取kernel img的 kernel header 分析margic number判断系统类型等
这里一般分打印系统的一些信息的
完了 跳到kernel start entry然后交给kernel控制

你这个是直接ldr的 问题不会在bootloader块  内核的问题  原先内核可否正常启动
写到nand中内核数据对不对 dump出来对比下
读出来的又对不对
此帖出自Linux开发论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
在网上查了查有几个要求
CPU是SVC模式,IRQ与FIQ要关闭。
MMU关闭
数据Cache关闭
寄存器R0等于0
R1等于machine type
R2等于kernel parameter list的物理地址。
此帖出自Linux开发论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习了。。。
此帖出自Linux开发论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
你在用UBOOT启动前需要关注很多事情。比如寄存器状态。不是一句代码就搞定的事情。
此帖出自Linux开发论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
现在就是想知道怎么设置
R1-----machine type
R2-----kernel parameter list的物理地址。
此帖出自Linux开发论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。
此帖出自Linux开发论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 zhang6yong 的回复:
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。


都解决啦,呵呵!恭喜您!!成长了,进步很大!
MARK,我来学习下。
此帖出自Linux开发论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 10 楼 zhang6yong 的回复:
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。

感谢分享,标记一下!
此帖出自Linux开发论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习了………………………………
此帖出自Linux开发论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
感谢各位,喝喝。
还要补充一点。
我的这个引导程序只能是在由uboot下载到SDRAM中时才能成功引导linux,如果下载到nand由那个
“steppingstone"来启动,就又不工作了。我猜测是启动参数的问题,就是那个tag数据结构。可能uboot初始化了这个结构,所以在经由uboot的时候能用。而且传说这个数据结构一定要在0x30000100处。
此帖出自Linux开发论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 10 楼 zhang6yong 的回复:
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。


恭喜,多谢分享。
此帖出自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
快速回复 返回顶部 返回列表