当前位置: 代码迷 >> 驱动开发 >> 嵌入式中linux引导前奏曲。解决办法
  详细解决方案

嵌入式中linux引导前奏曲。解决办法

热度:92   发布时间:2016-04-28 11:16:40.0
嵌入式中linux引导前奏曲。
我编写了TQ2440的启动代码,在完成各个部件的初始化后,调用自己写的C程序Copy2SDRAM把在Nand flash中以0x1f0000开始,大小为0x00200000的linux内核拷贝到内存中0x30008000处,然后ldr pc , =0x30008000.
在终端上显示:
#starting application at 0x30000000
Uncompressing Linux.......................................
.......................done , booting kernel.
然后就停住了。

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

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

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


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

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

你这个是直接ldr的 问题不会在bootloader块 内核的问题 原先内核可否正常启动
写到nand中内核数据对不对 dump出来对比下
读出来的又对不对
------解决方案--------------------
学习了。。。

------解决方案--------------------
你在用UBOOT启动前需要关注很多事情。比如寄存器状态。不是一句代码就搞定的事情。
------解决方案--------------------
探讨
哈哈哈哈,引导成功。做了两件事。
1,关闭IRQ于FIQ
2,把R0清零
3,把R2赋值168
4,R3的tag表地址,到现在也没明白是什么意思,我就直接没管他。

然后就引导成功了。

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

然后就引导成功了。
  相关解决方案