按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址:

  1. load address:
  2. entry point: 这两个地址是mkimage时指定的
  3. bootm address:bootm为uboot的一个命令,以此从address启动kernel
  4. kernel运行地址:在具体mach目录中的Makefile.boot中指定,为kernel启动后实际运行的物理地址
mkimage -n 'linux-3.2.1' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage

理论上因为mkimage要为zImage加上0x40字节的header,所以entry point = load address + 0x40

但由于uboot 的bootm对uImage处理不是简单的go操作,其对前三个地址都有比较判断,所以在实际的操作中,就分为两种不同的情况:

1. bootm地址和load address一样

  此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行。因此此时的entry point必须设置为load address + 0x40。如果kernel boot过程没有到uncompressing the kernel,就可能是这里设置不对。

boom address == load address == entry point - 0x40

具体细节可参看uboot代码common/cmd_bootm.c中bootm_load_os函数的实现:

        switch (comp) {case IH_COMP_NONE:if (load == blob_start || load == image_start) {                        printf("   XIP %s ... ", type_name);                        no_overlap = 1;                } else {                        printf("   Loading %s ... ", type_name);                        memmove_wd((void *)load, (void *)image_start,                                        image_len, CHUNKSZ);                }                *load_end = load + image_len;                puts("OK\n");break;

2. bootm地址和load address不一样(但需要避免出现memory move时出现覆盖导致zImage被破坏的情况)

  此种情况下,bootm会把uImage header后的zImage move到load address(见上方代码),然后go到entry point开始执行。 由此知道此时的load address必须等于entry point。

boom address != load address == entry point

因此,在mkimage以及设置uboot boot command的时候需要注意到以上两种情况。

至于kernel的运行地址,其与前3个地址没有关系,除了要避免内存覆盖导致解压后kernel不完整的情况。

zImage的头部有地址无关的自解压程序,因此刚开始执行的时候,zImage所在的内存地址(entry point)不需要同编译kernel的地址相同。自解压程序会把kernel解压到编译时指定的物理地址,然后开始地址相关代码的执行。在开启MMU之前,kernel都是直接使用物理地址(可参看System.map)。

转载于:https://www.cnblogs.com/sywtt/archive/2012/01/25/2329284.html

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系相关推荐

  1. ENSP的The specified address conflicts with another address.以及其中一个Protocol是down的问题

    如下图是不小心分配错了,本来要把地址赋给子接口1.1和1.2的,结果弄成1.2和1.3了,导致其中一个Protocol是down,而且修改IP地址也不行,出现错误The specified addre ...

  2. 认知BLE中多个MAC地址类型:Public Device Address、Random Device Address、Non-resolvable Private Address

    1. 前言 BLE设备有多种类型的设备地址,如Public Device Address.Random Device Address.Static Device Address.Private Dev ...

  3. uboot加载linux内核加载那些内容,uBoot和Linux内核中涉及到的几个地址参数的理解...

    uBoot和Linux内核中涉及到的几个地址参数的理解 ************************************************* arch/arm/Makefile //内核 ...

  4. linux 内核load addr,linux2.4启动分析(1)---内核启动地址的确定 vmlinux LOAD_ADDR ZRELADDR...

    http://blog.chinaunix.net/u/31100/showart_244622.html ================================ Author: taoyu ...

  5. 10 编译2022年最新的U-Boot v2023.01-rc2源码,并用QEMU模拟器运行

    编译2022年最新的U-Boot v2023.01-rc2源码,并用QEMU模拟器运行 作者 将狼才鲸 创建日期 2022-11-26 Gitee源码和工程地址:才鲸嵌入式 / 嵌入式QEMU教程 C ...

  6. Access Violation at address 00000000.Read of address 00000000 解决办法

    是数组越标或没有初始化某个对象之类的问题,搂住细细检查一下代码, 使用指针前未做检查,而这个指针未初始化. 可能是new后没有delete,这样出现溢出的可能性比较大     检查代码或者跟踪试试 使 ...

  7. SAP Spartacus shipping address页面请求1 - Address

    前三个CMS page请求可以忽略: 请求path:/occ/v2/electronics-spa/users/current/addresses?lang=en&curr=USD curre ...

  8. 指出Linux内核中boot,uBoot和Linux内核中涉及到的几个地址参数的理解

    ************************************************* arch/arm/Makefile //内核运行虚拟地址TEXTADDR = 0xC0008000 ...

  9. 基于AR9331(MIPS架构)分析系统启动过程(uboot)

    前提: 1.AR9331是基于MIPS 24K CPU的一款WIFI1X1芯片,其SDK采用uboot作为引导.AR9331中定义的基地址是:0x9f00,0000 2.MIPS24K芯片,将固定的起 ...

最新文章

  1. 华为10GE LAN板与Wan板区别
  2. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub
  3. bzoj4427【Nwerc2015】Cleaning Pipes清理管道
  4. python监控服务器信息,Python监控服务器实现邮件微信报警
  5. 网上的画板代码收集和整理
  6. oracle关联视图查询满_对于复杂的SQL, Oracle是怎么做的?
  7. Python字符串详解(包含长字符串和原始字符串)
  8. 单精度浮点数(float)加法计算出错
  9. java大学实用教程(第四版)_Java大学实用教程(第4版)
  10. android svg 线条动画教程,SVG 实现复杂线条动画
  11. WEB服务器硬件配置要求
  12. npm ERR! File exists: /XXX/xxx npm ERR! Move it away, and try again.
  13. Raptor软件与学习资料
  14. 二叉树遍历-层序-递归
  15. 吐血推荐珍藏的Visual Studio Code插件
  16. 黑客用我们服务器挖矿了
  17. java集合类的一些总结——Arrays.asList和Guava操作集合
  18. 学GIS开发怎么入门,GIS专业的学生应该掌握什么知识 ?
  19. 全球5G发展洞察2022(中)
  20. CSP 201609-3 炉石传说(C++)

热门文章

  1. .Net对SQL数据库的web备份
  2. asp.net 跨页面传值(一)
  3. Save info in Hidden Field
  4. C# CheckedListBox控件的用法
  5. uglifyjs报错 webpack_webpack3里使用uglifyjs压缩js时打包报错的解决
  6. java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”
  7. Mat的初始化以及Mat与数组的相互转化
  8. mysql数据库char类型长度_mysql数据库设计字符类型及长度
  9. 材料成形计算机辅助设计,材料成型及计算机辅助设计(综述)
  10. array python 交集_模糊数学Python库简介和评测