bootm命令中地址参数,内核加载地址以及内核入口地址

bootm命令用于引导经过mkimage处理的内核镜像,涉及三个关键地址:加载地址、内核入口地址。若mkimage中-a指定的加载地址与bootm命令地址相同,内核直接在加载地址运行,入口地址在其后64字节。不同则会将内核移到加载地址并解压。文章详细分析了不同情况下内核加载和启动的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。

 

通过mkimage可以给内核镜像或根文件系统镜像加入一个用来记录镜像的各种信息的头。同样通过mkimage也可以将内核镜像进行一次压缩(指定-C none/gzip/bzip2),所以这里也就引申出了两个阶段的解压缩过程:第一个阶段是u-boot里面的解压缩,也就是将由mkimage压缩的镜像解压缩得到原始的没加镜像头的内核镜像。第二个阶段是内核镜像的自解压, u-boot 里面的解压实际上是bootm 实现的 , 把 mkimage -C bzip2或者gzip 生成的 uImage进行解压 ; 而kernel的自解压是对zImage进行解压,发生在bootm解压之后。

 

下面通过cmd_bootm.c文件中对bootm命令进行解析以及执行的过程来分析,这三种不同地址的区别:

 

ulong load_addr = CFG_LOAD_ADDR;  /* Default Load Address */

 

int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{

       ......

        if (argc < 2) {
             addr = load_addr;//当bootm命令后面不带地址参数时,将默认的加载地址赋值给addr
  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值