回忆上一节,UBoot当前要解析和执行启动命令。该启动命令存储在环境变量bootcmd中。回忆环境变量的内容:
baudrate=115200
bloader=ext4load mmc 0:1
bootcmd=$bloader 0x48000000 $kernel;$bloader 0x49000000 root.img.gz;bootm 0x48000000
bootdelay=0
bootfile=uImage
ethaddr=00:e2:1c:ba:e8:60
firstboot=0
gatewayip=192.168.1.254
ipaddr=192.168.1.165
kernel=uImage
netmask=255.255.255.0
serverip=192.168.1.164
stderr=serial
stdin=serial
stdout=serial
bootcmd一个有三条命令,通过继续展开后可以得到三条命令的全部内容:
ext4load mmc 0:1 0x48000000 uImage
ext4load mmc 0:1 0x49000000 root.img.gz
bootm 0x48000000
首先先查找第一条命令的相关信息,ext4load。这条命令的实现位于/uboot-root/common/cmd_ext4.c中。下面是其定义:
U_BOOT_CMD(ext4load, 6, 0, do_ext4_load,
"load binary file from a Ext4 filesystem",
"<interface> <dev[:part]> [addr] [filename] [bytes]\n"
" - load binary file 'filename' from 'dev' on 'interface'\n"
" to address 'addr' from ext4 filesystem");
可以看出,这个命令由do_ext4_load()去执行实现,作用是从具体设备或分区上的ext4文件系统中将指定文件以二进制的形式复制到指定内存地址上。由于其具体实现涉及硬件操作,过程比较复杂,这里就不详细展开了。但需要知道的是,第一和第二条命令,是将Linux系统的内核uImage和Linux系统的根文件系统root.img.gz分别复制到0x4800_0000和0x4900_0000这两个地址中。复制完后内存使用情况如下:
RAM:
0xC000_0000
-
0x5000_0000(RAM_TOP)
-
0x4FFE_F800
UBOOT(Reserve 478K)
0x4FF7_8000
-
0x4FFF_