嵌入式中linux引导前奏曲。

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

请问问题会在那里呢?引导linux前,有那些必要的准备工作?

回复评论 (15)

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

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


MARK.
点赞  2010-3-14 10:18
不懂Linux呢。呵呵,帮顶了。
点赞  2010-3-14 10:26
首先确定你在NAND FLASH中的内容是不是有问题,也就是说起码数据时没有问题的,才能谈到拷贝之后的跳转没有问题。
确定SOURCE数据没有问题之后,再看看你的C数据搬移代码是不是有问题,搬移的地址和搬移的方法是否正确。可以自己写一个函数把0x30008000之后的内容打印出来,也可以采用系统的方法来看。

都没有问题了,还不好用,只能怀疑你加载的内核有问题了。
点赞  2010-3-14 11:03
如果是 u-boot启内核
u-boot会读取kernel img的 kernel header 分析margic number判断系统类型等
这里一般分打印系统的一些信息的
完了 跳到kernel start entry然后交给kernel控制

你这个是直接ldr的 问题不会在bootloader块  内核的问题  原先内核可否正常启动
写到nand中内核数据对不对 dump出来对比下
读出来的又对不对
点赞  2010-3-14 15:04
在网上查了查有几个要求
CPU是SVC模式,IRQ与FIQ要关闭。
MMU关闭
数据Cache关闭
寄存器R0等于0
R1等于machine type
R2等于kernel parameter list的物理地址。
点赞  2010-3-14 20:03
学习了。。。
点赞  2010-3-14 20:14
你在用UBOOT启动前需要关注很多事情。比如寄存器状态。不是一句代码就搞定的事情。
点赞  2010-3-14 20:26
现在就是想知道怎么设置
R1-----machine type
R2-----kernel parameter list的物理地址。
点赞  2010-3-14 21:12
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

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

然后就引导成功了。


都解决啦,呵呵!恭喜您!!成长了,进步很大!
MARK,我来学习下。
点赞  2010-3-15 09:06
引用: 引用 10 楼 zhang6yong 的回复:
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。

感谢分享,标记一下!
点赞  2010-3-15 10:10
学习了………………………………
点赞  2010-3-15 10:30
感谢各位,喝喝。
还要补充一点。
我的这个引导程序只能是在由uboot下载到SDRAM中时才能成功引导linux,如果下载到nand由那个
“steppingstone"来启动,就又不工作了。我猜测是启动参数的问题,就是那个tag数据结构。可能uboot初始化了这个结构,所以在经由uboot的时候能用。而且传说这个数据结构一定要在0x30000100处。
点赞  2010-3-15 21:35
引用: 引用 10 楼 zhang6yong 的回复:
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。


恭喜,多谢分享。
点赞  2010-3-15 22:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复