1 boot.img 
boot.img是由文件头信息,内核数据以及文件系统数据组成,它们之间非页面对齐部分用0填充
文件头信息的具体结构可以在system/core/mkbootimg/bootimg.h中看到:
struct boot_img_hdr  
{  
    unsigned char magic[BOOT_MAGIC_SIZE];  
    unsigned  kernel_size;  
    unsigned  kernel_addr;  
    unsigned  ramdisk_size;  
    unsigned  ramdisk_addr;  
    unsigned  second_size;  
    unsigned  second_addr;  
    unsigned  tags_addr;  
    unsigned  page_size;  
    unsigned  unused[2];  
    unsigned  char  name[BOOT_NAME_SIZE]  
    unsigned  char cmdline[BOOT_ARGS_SIZE]  
    unsigned  id[8]; //存放时间戳,校验和,SHA加密等内容  
}
2 生成boot.img 
在build/core/Makefile里,INSTALLED_BOOTIMAGE_TARGET 是生成boot.img ,其中参数为INTERNAL_BOOTIMAGE_ARGS ,该参数
主要是--kernel , 用到了BOARD_KERNEL_BASE ,而在device/qcom/BoardConfig.mk中,会定义 BOARD_KERNEL_BASE 
这样mkbootimg :
--kernel     kernel   --ramdisk   ramdisk.img  --cmdline $(BOARD_KERNEL_CMDLINE) 
--base $(BOARD_KERNEL_BASE)  --pagesize 2048 
 
mkbootimg的代码在system/core/mkbootimg 它分析参数后,依次写入header, kernel ,ramdisk . 
header参数为:
 kernel_addr  = base 0x8000  --- 内核加载的基地址
 ramdisk_addr = base 0x01100000
 tags_addr    = base 0x1000
确认 boot loader 所用的内核基地址必须和内核映像在编译时所用的运行基地址一致,假设你的内核映像在
编译时用的基地址是 0xc0008000,但你的 boot loader 却将它加载到 0xc0010000 处去执行,那么内核映像
当然不能正确地执行了。
在Kernel/arch/arm 下面的Makefile.boot 中指定了内核编译链接的基地址。
zreladdr    ---- kernel_addr
params_phys ---- tags_addr
3 boot.img的加载
 在lk 中, smem_ptable_init 函数中会初始化 smem_apps_flash_start ,它通过读share memory ,也就是ARM9端传入的0:APPS 
 这样在targe_init函数中,会将offset = smem_apps_flash_start , 然后ptable_add将第一个分区的地址设置为offset .
 
 在ARM9 中 有两个文件 partition.h 和 partition.c 
 partition.h  中定义了:
   FLASH_PARTI_APPS  "0:APPS" --- 对于boot.img 
 partition.c  中定义了所有的分区的大小, 这样smem_apps_flash_start 其实就为ARM9的所有image的大小。
 
 4 ARM9中的实现
   函数smem_retrieve_mibib 中将分配 smem_alloc , 也就是有512 字节的 MIBIB区 
   
   MIBIB区 : 16个字节是header 
              每个分区 28个字节
              这样共有16个分区
  每个分区信息,flash_partition_entry 包括了name 和 offset .
  这样ARM11 测 根据name 为0:APPS 得到offset ,也就是该分区的起始地址。
  MIBIB 分区 是通过根据 mjnand -c mibib_xxx.cfg 得到 

boot.img的分析相关推荐

  1. Spring Boot(四):Spring Boot启动原理分析

    文章目录 Spring Boot启动原理分析 一.依赖导入原理 二.Spring Boot包扫描原理 三.Spring Boot自动配置原理 Spring Boot启动原理分析 一.依赖导入原理 父项 ...

  2. 全志H3 uboot传参到内核分析,boot.scr文件分析

    传参过程 uboot倒计时结束,默认以bootcmd来启动内核,它等于 fatload mmc 0:1 ${scriptaddr} boot.scr; source ${scriptaddr} 上面两 ...

  3. spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 前面的文章我们讲解了一下spring boot配置文件加载的相关源码分析,下面我们将从源码角度讲解一下spring  ...

  4. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现

    概述 我们知道 Spring Boot 能够创建独立的 Spring 应用,内部嵌入 Tomcat 容器(Jetty.Undertow),让我们的 jar 无需放入 Servlet 容器就能直接运行. ...

  5. spring boot 启动流程分析

    spring boot 框架凭借极简配置,一键运行和强大的第三方框架集成等特点,受到广大开发者的青睐,基本成为java开发中必不可少的基础的框架.spirng boot带给我们这么多便利的背后,它都做 ...

  6. spring boot源码分析之SpringApplication

    spring boot提供了sample程序,学习spring boot之前先跑一个最简单的示例: /** Copyright 2012-2016 the original author or aut ...

  7. Spring Boot————BeanCreationNotAllowedException异常分析

    引言 在对数据库进行新增记录的JUnit测试时,抛出一个BeanCreationNotAllowedException异常: 异常分析与解决 异常信息太长,图片截不下,粘贴来看: Exception ...

  8. Spring Boot————Spring Boot启动流程分析

    一.引言 Spring Boot 的启动虽然仅仅是执行了一个main方法,但实际上,运行流程还是比较复杂的,其中包含几个非常重要的事件回调机制.在实际生产开发中,有时候也会利用这些启动流程中的回调机制 ...

  9. Java程序细胞工厂_Spring Boot实现原理分析

    1.各种Bean 如果我们把Spring想象成人体,把Bean当做细胞的话,那么正是不同种类bean的相互协作才使得spring这个大工厂正常运行,有些bean做管理工作,有些bean为其它bean服 ...

最新文章

  1. ASP.NET中 DropDownList+GridView(网格视图)的使用前台绑定[高]
  2. python代理池_用Python搭建一个简单的代理池
  3. python和sql_Python和SQL 2017的强大功能
  4. cdatabase读取excel第一行数据_pandas读取excel数据并对重复数据进行标记或者删除
  5. 一个很好的机器学习普及网站
  6. 【idea】idea快捷键(更新中....)
  7. bzoj千题计划164:bzoj5123: 线段树的匹配
  8. QQ2006 界面编程
  9. 各个刷流量软件总结对比
  10. 水经注万能地图下载器下载的瓦片如何应用到web端的cesium中
  11. 2014年实习生招聘之多益网络实习生招聘笔试题—2014/04/17
  12. 网页计算器 html代码原理,HTML网页之计算器代码
  13. 更多python内容请移步
  14. [个人学习]透视画法的一点记录
  15. Spring Boot入门(05):了解Spring Boot的starter入门 | 超级详细,建议收藏
  16. WMI Provider Host(wmiprvse.exe)占用CPU高的解决方案
  17. HTTP 请求方法 GET/POST/PUT/DELETE
  18. 南京邮电大学微型计算机原理与接口技术答案,微型计算机原理与接口技术南京邮电大学...
  19. 阿里面试官问我Mybatis,我怂了吗?
  20. 线程休眠 java_Java线程休眠和线程让步

热门文章

  1. Maven解决静态资源过滤问题
  2. 025_jdbc-mysql-Statement的sql注入问题
  3. 044_定义类或对象
  4. 031_div和span
  5. python元祖迭代_python *式语法在迭代一个元组序列时的逻辑?
  6. xbox acc驱动win7_Xbox老大:希望第一方工作室能推出更多单机游戏_电竞
  7. 保存oracle数据之后乱码,Oracle保存中文数据和读取数据页面显示乱码解决方案
  8. linux+历史命令',Linux历史命令管理以及用法
  9. android studio使用nodejs本地服务器json数据_使用Node.js的Alexa技巧
  10. 华为云计算之快照技术