请选择 进入手机版 | 继续访问电脑版

GODIY 自己动手亲力亲为的DIY社区一起来吧--GODIY论坛

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 6427|回复: 4

[交流使用心得] 总结一下UBoot相关的一些问题

[复制链接]
发表于 2009-3-3 23:56:46 | 显示全部楼层 |阅读模式
三周前入手My Book World Edition II,折腾到现在终于算是比较稳定的运行起来了。期间最让人头痛的问题就是UBoot的问题,因为没有串口线,所以调试UBoot的问题也是特别的困难。在这里把已经发现的东西做一个小结,很多内容在以前贴子中也都提到过,但比较分散,所以这里一起总结一下。

UBoot启动参数:

UBoot在启动的时候,会先试图从硬盘上读取环境变量,环境变量的存放位置是从第48个扇区开始的8K数据。这8K数据的前四个字节是对剩余的8188个字节的CRC校验。如果UBoot跟据CRC校验判断出读到的环境变量是有效的,就使用环境变量作为启动参数。如果环境变量无效,则采用编译UBoot时指定的默认参数来启动。

一茶版的UBoot情况:

一茶版的UBoot环境变量是在写rescue.img时一次写入硬盘的,内容如下:
  1. bootcmd=run select0 load boot || run select1 load boot
  2. bootdelay=2
  3. baudrate=115200
  4. ethaddr=00:30:e0:00:00:01
  5. ipaddr=172.31.0.128
  6. serverip=172.31.0.100
  7. autoload=n
  8. netmask=255.255.0.0
  9. bootfile="uImage"
  10. select0=ide dev 0
  11. select1=ide dev 1
  12. load=ide read 0x48500000 12c 1644
  13. boot=bootm 48500000
  14. stdin=serial
  15. stdout=serial
  16. stderr=serial
  17. bootargs=mem=32M console=ttyS0,115200 root=/dev/md1 netdev=0,0,0x0090A915,0x9984,eth0
复制代码
从中可以看到,它是会尝试从两块硬盘来引导系统。对于任意一块硬盘,把从第301个扇区开始的内容读入到0x48500000的内存地址,并跳转到这个地址实施启动。同时,传给内核的参数列表中可以看到,系统根是/dev/md1。

由于一茶版的rescue.img中有环境变量,所以一茶版的UBoot默认参数是没有机会被用到的。

Debian版UBoot的情况:

按照Debian版的安装步骤,里面是不会包含有写UBoot环境变量的步骤的,所以新硬盘上做Debian,生效的应该是UBoot的默认参数。而如果之前曾经安装过一茶版本,则会因为没有机会覆盖一茶写入的环境变量而使默认参数失效,总是使用一茶的环境变量参数来启动。

UBoot的默认参数是:

  1. bootargs=mem=32M console=ttyS0,115200 root=/dev/sda1 netdev=0,0,0x0030e000,0x0001,eth0 elevator=cfq"
  2. bootcmd="ext2load ide 0:1 0x48500000 /uImage ; bootm 0x48500000"        
复制代码
这里可以看到,与一茶版最大的不同是它不采用硬盘绝对地址的方式去加载内核,而是通过ext2load直接从文件系统加载/uImage文件做为启动内核。

有关ext2load:

这是目前唯一没有搞清楚的问题。我的实验结果与其他一些网友的实验结果很相似,那就是ext2load在双盒上似乎是不能正常工作的。虽然有些朋友报告ext2load是可以工作的,我现在还不确定他们用的是双盒还是单盒。

有了以上的分析,曾经困扰我的问题也就引刃而解了。

我曾经遇到的问题:

1. 装过一茶版后再装Debian成功,但不管怎么换内核不生效,系统可以启动,但用的是老内核
原因:一茶版的环境变量指定了从硬盘绝对位置引导内核,不会去管/uImage文件,所以要换内核,必须把uImage文件dd到硬盘第301个扇区开始的空间中。

2. 把硬盘清零后安装Debian无法启动
原因:UBoot用默认参数启动,但ext2load命令不能正常工作。

3. 明明是装Debian,明明UBoot编译时写的内核启动root是/dev/sda1,却偏偏非得把硬盘分成/dev/md1才能启动
原因:曾经装过一茶版,留下了环境变量,就是要从/dev/md1启动。

4. 故意把Uboot环境变量CRC破坏,想让它从默认参数启动,但无法启动
原因:UBoot用默认参数启动,但ext2load命令不能正常工作。

我的最终解决方案:

自己编译EABI版的内核,把它写入硬盘绝对位置。安装armel架构的Debian Lenny,把茶版的环境变量修改后(把/dev/md1改成/dev/sda1,并重新计算CRC),重新写入硬盘。

装Debian版的必杀计:

看到有很多朋友说Debian安装不成功,估计多半也是卡在UBoot上了,这里提供必杀计:

如果要做RAID,想要从/dev/md1启动:

1. 先刷一次一茶的版本,保证UBoot环境变量正确。(其实把rescue.img刷了就可以了,后面的不用做了)
2. 按以前的步骤装Debian,第一个分区类型一定要是fd,并且用mdadm建好RAID
3. 把uImage dd到301个扇区开始的位置
# dd if=uImage of=/dev/sdb bs=512 seek=300

如果不要RAID,还是从/dev/sda1启动:

1. 先按之前的步骤装Debian。
第一分区可以从2柱面开始,不需要从4柱面开始。当然从4柱开始也不会有问题。
分区时/dev/sda1的分区类型是83即可,不能分成fd。
2. 把UBoot环境变量设好。可以直接用本贴附件中的文件,解压缩后把它dd到第48个扇区开始的位置
# dd if=ubootenv.bin  of=/dev/sda bs=512 seek=47
3. 把uImage dd到301个扇区开始的位置
# dd if=uImage of=/dev/sda bs=512 seek=300

参考贴子:
https://godiy.net/thread-2830-1-1.html
https://godiy.net/thread-1906-1-1.html
https://godiy.net/viewthread.php?tid=3830

[ 本帖最后由 lifanxi 于 2009-3-5 23:16 编辑 ]

ubootenv.zip

421 Bytes, 下载次数: 62

发表于 2009-3-4 15:08:33 | 显示全部楼层
UBOOT分为二部份, stage1,stage2,  狭义地理解, 可以认为, stage1是初始化硬件资源信息, stage2是做资源规划, 并传递给linux内核.
比方内存管理, stage1是定义内存物理地址的, stage2是定义内存逻辑地址的,诸如此类.
比较特别的地方是, 这盒子有二个物理网卡, 一个是ARM内部网卡(10/100M), 一个是外部网卡(10/100/1000M), 所以当stage2启动失败时, 得到的MAC地址, 是ARM内部网卡的.

而在WD中, stage1与stage2又与硬盘MBR表重叠.

所以最早一个偷懒的办法, 就是刷写resuce.img文件, 这个文件包含了250G硬盘的MBR,stage1,stage2
在原版的debian的教程中, 这三部份是一个个做的.

而debian与原版区别是, uboot传递启动区信息时, 前者是sda1, 后者是md1
发表于 2009-3-5 03:42:02 | 显示全部楼层
未理解,有时间再研究
先做个标记,后感谢楼主,再顶贴
 楼主| 发表于 2009-3-6 00:04:14 | 显示全部楼层

回复 4# 的帖子

参考了不少你的贴子才最终把系统做出来的,谢谢。直观感觉上EABI版的性能提升不是很明显,不过好像SSH登录的速度快了一点。对于我来说最重要的是aMule可以用了,之前用老外的rootfs加普通的arm架构的lenny,aMule一运行就会sementation fault,断点在wxWidget库里,搞不定。

前段时间试图自己把Kernel升到跟Debian一样,要打的Patch的还是比较多的,搞了一半,没时间搞了。

新的源代码也下载了,不过还没有时间去看,有空瞅瞅。有心得再来交流。不过不知道新内核有没有什么值得关注的地方,如果没太大价值的话,搞出来也意义不大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|GODIY论坛 ( 粤ICP备12089271号

GMT+8, 2018-7-20 14:35 , Processed in 0.367214 second(s), 8 queries , File On.

Powered by Godiy.net

快速回复 返回顶部 返回列表