对于环境变量bootcmd,执行run_command(bootcmd, flag)之后,最终是将bootcmd中的参数解析为命令,海思hi3521a中默认参数是bootcmd=bootm 0x82000000 相当于执行bootm 0x82000000 命令 最终将调用do_bootm函数,do_bootm函数在cmd_bootm.c中实现 在这个里面有一个函数: int do_bootm_linux(int flag, int argc, ...
看一下bootcmd命令:bootcmd=movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000 movi read kernel 30008000 以及 bootm 30008000 这两个命令来完成linux内核启动的: movi read kernel 30008000是把sd卡中kernel分区复制到30008000内存地址处,bootm 30008000即到内存地址处执行代码; ...
接下来的很大一部分就是对uImage镜像进行校验,并将头信息写入到全局变量image中。 (2)do_bootm函数执行到after_header_check:就对头信息校验完毕。 (3)后面一句switch (os),case有很多种选项,说明uboot不单单只能启动linux内核的镜像,也能启动其他内核。我们使用的是linux内核,所以后面会执行do_bootm_linux这个函数。
do_bootm_linux函数位于uboot/lib_arm/bootm.c中,函数的主要功能是获取环境变量中的内核传递参数,获取当前uboot启动kernel的p_w_picpaths变量中的kernel入口地址,获取uboot中的机器码,准备向kernel传递的参数,最后跳转到kernel执行,uboot执行完毕。uboot在执行完成前打印了”Starting kernel ...”信息。如果uboot实...
uboot do_bootm_linux U-boot (Unified Bootloader)是一种流行的开源引导加载程序,主要用于嵌入式系统的引导启动。在开发嵌入式系统时,通常需要将Linux内核加载到内存中,并启动Linux操作系统。在U-boot中,有一个非常重要的命令是“do_bootm_linux”,它用于加载并启动Linux内核。
boot->bootm->do_bootm_linux->内核启动,uboot结束。 3.3 内核文件的三种状态 (1)静态文件:以文件的方式存在于ROM中。 (2)静态内核:以可执行代码的方式存在于RAM中。 (3)动态执行:以正在运行状态存在与RAM中。 3.4 内核的加载与重定位 内核从外存加载到DDR RAM中,但还没有执行之前的这个过程就叫做重定位。
(do_bootm_linux)*/ /*内核也位于加载地址了,是不是就可以在入口地址启动内核了?不是!PC机启动时BIOS会检测内存,flash告诉内核*/ /*同样uboot也要告诉内核一些启动参数;之后才会跳到入口地址启动内核*/ theKernel = (void (*)(int, int, uint))addr; /*hdr->ih_ep头部入口地址*/ theKernel = (void...
(2)命令bootm 0x30008000,所以do_bootm的argc=2,argv[0]=bootm argv[1]=0x30008000 但是实际bootm命令还可以不带参数执行,如果不带参数直接bootm则会从,CFG_LOAD_ADDR地址去执行(定义在x210_sd.h中) (3)zImage从头部开始的第37到40个字节,存的是zImage的标志的魔数,从这个位置取出对比LINUX_ZIMAGE_MAGIC...
uboot启动的内核为uImage,这种格式的内核是由两部分组成:真正的内核和内核头部组成,头部中包括内核中的一些信息,比如内核的加载地址,入口地址。uboot在接受到启动命令后,要做的主要是,1,读取内核头部,2,移动内核到合适的加载地址,3,启动内核,执行do_bootm_linux...
bootm - 从内存启动应用程序 bootp - 通过使用BOOTP /TFTP协议的网络引导映像 bootvx - Boot vxWorks from an ELF image chpart - 更改活动分区 cmp - memory compare coninfo - print console devices and information cp - 内存拷贝 crc32 - 检验和的计算dcache - 启用或禁用数据缓存 ...