昨天把子image.ram下到SDRAM中ZREALADDR运行了一下,成功了
今天上午把image.rom下到SDRAM中ZTEXTADDR运行了一下,也成功了
写这之前不久,把image.rom下到flash地址bootm 50000指定的地址0x50000里运行一下,不成功
提示:Bad Magic Number
貌似是bootm不能识别image.rom。于是乎想起是有这么一说:bootm通过识别加在image.rom前的0x40个字节的头部来判断和加载内核。
于是,再用mkimage把image.rom加工一下:
uboot/tools/mkimage -A arm -O linux -T kernel -C gzip -a 0x0c100000 -e 0x0c0fffc0 -n "uclinux" -d image.rom uclinux.bin
在UBOOT的tools目录下看到了uclinux.bin。当时还是蛮兴奋的,第一次用mkimage就成功了~~
再一次把uclinux.bin下到flash的0x50000处,重启板子后:
Uncompressing Kerenl Image .....OK
GUNZIP ERROR -must RESET board to recover
于是发现,应该先把image.rom用gzip压缩一下的:gzip -9 image.rom 得到个image.rom.gz
再一次下载到flash里~~~
Uncompressing Kernel Image...... OK
Starting kernel..................
又死了,还没提示~~
再找找原因吧:发现mkimage 里-a -e后面的地址不太一样~~于是修改地址-a 0x0c008000 -e 0x0c008000
不知道第几次下载到flash里后:
Uncompressing Kernel Image..........OK
Starting kerel.....
Uncompressing Linux........................
crc error
--System halted
哎,事情总是这么的难。然后把自动加载改为手动加载bootm 0x50000后:
Uncompressing Kernel Image..........OK
Starting kerel.....
Uncompressing Linux........................
invalid compressed format (err=2)
--System halted
这~~看着这种错误都不知道怎么下手。我当时想有第三种加载方式的话,它肯定会显示出第三种错误来的。当时就觉的思路不对:碰到莫名其妙的问题的时候最好不要顺着问题的方向去找答案---这是经过一个星期的反反复复make之后得出的经验!
于是,再一次的打开了vendors/Samsung/44B0/Makefile。再一次看看到底干了些什么。结果发现这么一个问题:下载到位flash里能自启动的不是image.rom,而是image.ram~~
当时感觉真是不可思议,怎么会是这样呢~~!!!
于是这样做:uclinux-dist/linux-2.4-x
arm-elf-objcopy -O binary -R .note -R .comment -S linux uclinux_ram.bin
cp uclinux_ram.bin /usr/locate/src/u-boot-1.1.4/tools/
gzip -9 uclinux_ram.bin 得到uclinux_ram.bin.gz
./mkimage -A arm -O linux -T kernel -C gzip -a 0x0c008000 -e 0x0c008000 -n "uclinux" -d uclinux_ram.bin.gz uclinuxrom.bin
最后把uclinuxrom.bin下载到0x50000,重启板子:
~~~~
终于见到了welcome to uclinux了
昨天运行成功image.ram的时候以为几乎成功了~~ 上午运行image.rom在DRAM中成功的时候,几乎是成功了,可下到flash里才知道还差很多。还是有几个问题没搞清楚的:
首先:当然还是那个能自启动的到底是image.ram还是image.rom。感觉两个都可以,只是要做不同的处理,处理的关键应该还是mkimage参数的-a -e两个指定的地址。
然后:就是mkimage -a -e参数的意义了。在网上找到一段话;
1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。
2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。
这个写的应该是ARM9的,但还是可以说明问题的。刚开始几次就是看着这段话的意思,把-a设为0x0c100000 -e设为0x0c0fffc0的。可结果运行错了。因为当时也是用image.rom制作的uimage。而且我的image.rom直接用loadb命令加载到0x0c100000处是可以成功运行的。不知道为什么会死机~~~
而0x0c008000处是加载image.ram用的地址。由此可以看出,这里用image.ram制作uimage并且配以地址0x0c008000是正确的。可为什么image.rom配以地址0x0c100000不能正确运行呢。按着这种逻辑推应该也是可以运行的~~然道是UBOOT的局限??
总之,问题还是有不少的。准确的说应该是刚刚入门~~~
慢慢来吧~~ |