[原创] U-boot下用tftp下载kernel,并加载kernel

sdwuyawen   2014-7-20 14:03 楼主
S3C2416通过U-Boot启动后,U-Boot会自动执行bootcmd来加载内核。《君益兴开发板手册V2》第3.3.4节,把kernel烧写到nandflash的0x40000地址后,set bootcmd 'nand read.i c0008000 0x40000 0x400000;bootm c0008000',即U-Boot把nandflash的0x40000到0x400000地址的数据copy到SDRAM的c0008000,并执行从c0008000执行,这样就完成了内核的加载。当nandflash中没有内核时,同样可以U-Boot下载内核至SDRAM,并加载内核。 直接编译生成的内核镜像zImage是无法直接被U-Boot引导的,需要给zImage添加一个64字节的Header,生成uImage,以供U-Boot引导。U-boot下用tftp下载kernel并bootm的步骤如下: 1,在Fedora系统上,在U-Boot代码目录的tools里找到mkimage文件,并copy到PATH包含的路径里,例如/usr/local/bin。即先cd到u-boot-1.3.4.jyx所在目录,然后
  1. cp u-boot-1.3.4.jyx/tools/mkimage /usr/local/bin/
2,在Fedora系统上,cd到zImage所在目录,利用mkimage工具由zImage生成uImage。
  1. mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.13 -d zImage uImage
3,tftp下载&加载kernel。首先要在Fedora系统上搭建tftp服务器,详细步骤参考《君益兴开发板手册V2》第3.3.1.2节。然后把生成的uImage cp到tftp目录。利用U-Boot启动开发板,并在U-Boot的shell执行
  1. tftp 30008000 uImage
  2. bootm 30008000
这时kernel就被加载了。
kernel下载与启动
本帖最后由 sdwuyawen 于 2014-7-20 14:04 编辑

    mkimage.rar (2014-7-20 14:01 上传)

    16.16 KB, 下载次数: 1

    mkimage工具

    uImage.rar (2014-7-20 14:01 上传)

    1.84 MB, 下载次数: 1

    可以直接tftp下载的uImage

回复评论 (3)

说明一下:zImage和uImage都是内核压缩文件,区别如下:

zImage:内核自解压,在编译内核的时候,编译目标是zImageuImage:uboot解压然后启动,在编译内核的时候,编译目标可以是uImage,内核脚本会自动创建好uImage
参见内核里:s3c-linux.jyx/arch/arm/boot/Makefile可以看到zImage和uImage的描述。

另外,如果用mkimage来制作uImage,源文件应该是vmlinux,而不是zImage,否则,只是在zImage的前边加了64字节的uImage描述字段,没达到uboot管理内核镜像的目的。


zImage和uImage一样,都可以通过tftp下载,然后用bootm命令在内存里启动,建议下载内核的时候,下载到高位地址,比如0xc2000000,要避免与内核运行的启始地址(0x30000000)重叠。


还有一个重要经验,实测zImage的运行速度比uImage的运行速度要快,也就是内核解压速度比uboot解压速度要快,我不知道为什么?谁能解释一下?
My dreams will go on... http://www.jyxtec.com
点赞  2014-7-20 15:17
引用: spacexplorer 发表于 2014-7-20 15:17
说明一下:zImage和uImage都是内核压缩文件,区别如下:

zImage:内核自解压,在编译内核的时候,编译目 ...

学习了!老板能讲解一下Helper2416上的内存地址吗? 2014-07-20_161330.png

从这张图上,只看到30000000是SDRAM,没有看到C0000000这个地址。还有,从图上看00000000是内部SRAM,而不是nandflash,在U-Boot上操作的时候00000000是nandflash,是不是进行了地址映射?刚接触2416,希望老板讲解一下这些地址的关系。
点赞  2014-7-20 16:16
HELPER2416上,内存的物理地址是:0x30000000-0x33ffffff,一共64MB,由于UBOOT里打开了MMU,直接把0x30000000的地址映射到0xC0000000上边去了。NAND地址与内存地址是两回事,NAND地址只是设备上的地址,与内存编址无关。
My dreams will go on... http://www.jyxtec.com
点赞  2014-7-20 16:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复