uboot启动uImage

kernel 默认uImage生成:
如果在kernel根目录下执行make uImage会用默认参数执行mkimage
arch/arm/boot/Makefile  62行开始有命令和规则:

quiet_cmd_uimage = UIMAGE  $@ 
      cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \ 
           -C none -a $(ZRELADDR) -e $(ZRELADDR) \ 
           -n 'Linux-$(KERNELRELEASE)' -d $< $@
$(obj)/uImage:  $(obj)/zImage FORCE 
    $(call if_changed,uimage) 
    @echo '  Image $@ is ready'
  
上面文件中在24行定义
ZRELADDR    := $(zreladdr-y)

在第17行有
include $(srctree)/$(MACHINE)/Makefile.boot
  
而这个Makefile.boot的中有 
    zreladdr-y  := 0x30008000 
  
所以 ZRELADDR    := 0x30008000

我们还需要了解一下几点:
1)如果我们没用mkimage对内核进行处理的话,那直接把内核(zImage)下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。

2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。

       关键
a.如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,提供传递参数的tag,然后把去掉头部的内核复制到-a指定的load地址中(没有解压,内核会   自解压)去运行之,
b.如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部(会分析提供传递参数的tag),然后内核自解压启动。

       理解:

当bootm xxx中的xxx地址与内核的入口地址不相同时,会从xxx地址提取64byte的头部,对其分析,然后去掉头部64byte,然后将内核复制到-a指定的地址处,这种情况下,-a加载地址和-e的入口地址应该相同。

        当bootm xxx中xxx地址与内核加载地址相同时,此时会在内核入口地址处读,-e的入口地址比-a的加载地址多64byte


    所以-a 和-e的区别在于,-a用于指定uboot将zImage拷贝到哪里,-e指定拷贝之后从哪里开始运行。

mkimage制作uImage的各个参数意义

-A ==> set architecture to 'arch'

-O ==> set operating system to 'os'

-T ==> set image type to 'type'

-C ==> set compression type 'comp'

-a ==> set load address to 'addr' (hex)

-e ==> set entry point to 'ep' (hex)

-n ==> set image name to 'name'

-d ==> use image data from 'datafile'

-x ==> set XIP (execute in place)

#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
首先,使用以下命令安装 cfdisk: ``` sudo apt-get install cfdisk ``` 然后,将 SD 卡插入计算机,并使用以下命令查看 SD 卡设备名称: ``` sudo fdisk -l ``` 假设设备名称为 `/dev/sdb`,接下来使用以下命令启动 cfdisk: ``` sudo cfdisk /dev/sdb ``` 在 cfdisk 中,可以使用箭头键和 Enter 键来创建分区。创建四个分区: - U-Boot 分区,大小为 1 MB,文件系统类型为 FAT32 - 内核分区,大小为 8 MB,文件系统类型为 FAT32 - 设备树分区,大小为 1 MB,文件系统类型为 FAT32 - 根文件系统分区,大小为剩余空间,文件系统类型为 ext4 创建分区后,使用以下命令格式化每个分区: ``` sudo mkfs.fat -F 32 /dev/sdb1 sudo mkfs.fat -F 32 /dev/sdb2 sudo mkfs.fat -F 32 /dev/sdb3 sudo mkfs.ext4 /dev/sdb4 ``` 接下来,创建四个目录,用于挂载之前创建的分区: ``` sudo mkdir /mnt/uboot sudo mkdir /mnt/kernel sudo mkdir /mnt/dtb sudo mkdir /mnt/rootfs ``` 然后,使用以下命令将每个分区挂载到相应的目录: ``` sudo mount /dev/sdb1 /mnt/uboot sudo mount /dev/sdb2 /mnt/kernel sudo mount /dev/sdb3 /mnt/dtb sudo mount /dev/sdb4 /mnt/rootfs ``` 接下来,将 U-Boot、内核、设备树文件以及根文件系统复制到相应的目录中: ``` sudo cp u-boot.imx /mnt/uboot/ sudo cp uImage /mnt/kernel/ sudo cp imx6qp-sabreauto.dtb /mnt/dtb/ sudo cp rootfs.tar.gz /mnt/rootfs/ ``` 最后,卸载分区并拔出 SD 卡: ``` sudo umount /mnt/uboot sudo umount /mnt/kernel sudo umount /mnt/dtb sudo umount /mnt/rootfs sudo eject /dev/sdb ``` 现在,SD 卡已经准备好,可以插入到目标设备中并引导启动了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值