`
dss16694
  • 浏览: 144451 次
社区版块
存档分类
最新评论

(转)boot.img的结构

阅读更多

转自CSDN:http://blog.csdn.net/zhenwenxian/article/details/6219431

 

android 的boot.img 包括 boot header,kernel, ramdisk

首先来看看Makefile是如何产生我们的boot.img的:

boot镜像不是普通意义上的文件系统,而是一种特殊的Android定制格式,由文件头信息boot header,压缩的内核,文件系统数据ramdisk以及second stage loader(可选)组成,它们之间非页面对齐部分用0填充
,可以从mkbootimg.h文件中看到。

文件头信息的具体结构可以在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加密等内容  
}

boot,img文件跳过4k的文件头之后,包括两个 gz包,一个是boot.img-kernel.gz:Linux内核,一个是boot.img-ramdisk.cpio.gz

大概的组成结构如下

 

*
** +-----------------+ 
** | boot header     | 1 page
** +-----------------+
** | kernel              | n pages  
** +-----------------+
** | ramdisk           | m pages  
** +-----------------+
** | second stage    | o pages
** +-----------------+

boot header为包括命令行参数等等,地址为000-----0xFFF

ramdisk为 1F8B0800000000开头

kernel为 0000A0E1 重复8遍开头

 

 

关于boot header这个数据结构我们需要重点注意,在这里我们关注其中几个比较重要的值,这些值定义在boot/boardconfig.h里面,不同的芯片对应vendor下不同的boardconfig,在这里我们的值分别是(分别是kernel/ramdis/tags载入ram的物理地址):

#define PHYSICAL_DRAM_BASE   0x00200000 
#define KERNEL_ADDR          (PHYSICAL_DRAM_BASE + 0x00008000)
#define RAMDISK_ADDR         (PHYSICAL_DRAM_BASE + 0x01000000)
#define TAGS_ADDR            (PHYSICAL_DRAM_BASE + 0x00000100)
#define NEWTAGS_ADDR         (PHYSICAL_DRAM_BASE + 0x00004000)

上面这些值分别和我们开篇时候提到的那几个名词相对应,比如kernel_addr就是ZTEXTADDR,RAMDISK_ADDR就是INITRD_PHYS,而TAGS_ADDR就是PARAMS_PHYS。bootloader会从boot.img的分区中将kernel和ramdisk分别读入RAM上面定义的地址中,然后就会跳到ZTEXTADDR开始执行。

ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。以下是一个典型的ramdisk中包含的文件列表:
./init.trout.rc
.
/default.prop
.
/proc
.
/dev
.
/init.rc
.
/init
.
/sys
.
/init.goldfish.rc
.
/sbin
.
/sbin/adbd
.
/system
.
/data


如果要分离可以用winhex将boot。img打开

找到0000A0E1 到1F8B0800000000的前面的数据块保持为kernel

找到1F8B0800000000到文件尾部的数据块保持为ramdisk.img 

 out/host/linux-x86/bin/mkbootimg  --kernel out/target/product/msm7630_surf/kernel --ramdisk out/target/product/msm7630_surf/ramdisk.img --cmdline "console=ttyMSM1,115200n8 androidboot.hardware=qcom" --base 0x00200000 --pagesize 4096 --output out/target/product/msm7630_surf/boot.img

 

        根据上面的命令我们可以首先看看mkbootimg 这个工具的源文件:system/core/mkbootimg.c。看完之后我们就能很清晰地看到boot.img的内部构造,它是由boot header /kernel  /ramdisk /second stage构成的,其中前3项是必须的,最后一项是可选的。mkbootimg分析参数后,依次写入header, kernel ,ramdisk .


 

header + padding + kernel + padding + ramdisk + padding + ...
4 * 2, magic,固定为"ANDROID!"
4 * 1, kernel长度,小端unsigned
4 * 1, kernel地址,应为base + 0x00008000 (base为0x200000)
4 * 1, ramdisk长度,小端unsigned
4 * 1, ramdisk地址,应为base + 0x01000000
4 * 1, second stage长度,小端unsigned,为0
4 * 1, second stage地址,应为base + 0x00f00000
4 * 1, tags地址,应为base + 0x00000100
4 * 1, page大小,小端unsigned, 为2048或者4096

4 * 2, 未使用,固定为0x00
4 * 4, 板子名字,一般为空
4 * 128, 内核命令参数,为mem=211M console=ttyMSM2,115200n8 androidboot.hardware=qcom console=ttyUSBCONSOLE0 androidboot.console=ttyUSBCONSOLE0
4 * 8, id, 为sha之类,实际写0x00就可
padding, 以上header为608字节,把这部分补齐到page_size * 2大小 
kernel_size, kernel内容
padding,把kernel_size补齐到page_size * 2
ramdisk_size, ramdisk内容
padding, 把ramdisk补齐到page_size * 2
second_size, second内容,一般为0
padding, 补齐second_sise为page_size,一般为0

 

配合 boot.img 来看会比较好理解.

由此可知 boot_img_hdr 中各成员值为:

 

 

 

TAGS_ADDR 如上 target/<your-platform>/rules.mk 所定义的 : 0x40200100, 所以 boot_linux(), 就是传入TAGS_ADDR,

 

然后将资料写入 tag, tag 的结构如下所示.

 

然后进入到 kernel 的入口函数: entry(0, machtype, tags)

分享到:
评论

相关推荐

    ADB-FASTBOOT工具箱

    单刷boot.img命令 : fastboot flash boot boot.img 单刷recovery.img命令 : fastboot flash recovery recovery.img 当然这里不排除有些机器因为民间解锁后刷官方ROM以及升级hboot的问题出错。 我刚才也是刷了4.0...

    刷机原理01 update.zip包目录结构

    update.zip包目录结构 boot.img是更新boot分区所需要的文件。这个boot.img主要包括kernel+ramdisk。 system/目录的内容在升级后会放在系统的system分区。在Android源码编译后out/target/product/generic/system/。

    Android TV ROM体积精简

    在目前的机顶盒ROM中,系统可以精简的地方有很多,本篇文章基于Android4.4.2系统,简单介绍下一些常见的系统精简方式。...|----boot.img |----system |----app |----bin |----lib |----etc ...... |----META-INF

    android笔记.rar

    1.11 android系统支持app2sd(修改boot.img) ... ..27 2 基本概念... ...30 2.1 Android组件 ... ..31 2.1.1 基本组件... .31 2.1.2 组件间的通讯... ..32 2.1.3 intent使用方法... .33 2.2 界面开发... ..35 2.2.1...

    操作系统原理作业-支持多进程并发的操作系统源码+项目说明.zip

    文件结构: src文件夹中包含4个文件夹、1个.asm文件。 1. img文件夹中包含了本次实验的1个映像文件XOS5.0,XOS5.0是本次实验的最终完成品。 2. kernel文件夹中包含了本次实验的2个源代码文件,其中操作系统内核源...

    64BIT_OS:操作系统项目,完成一个可以使用的linux系统

    │ └─ boot.img ├─ docs │ ├─ pics │ ├─ lab1.md │ ├─ lab2.md │ ├─ lab3.md | ├─ lab4.md | ├─ lab5.md │ └─ lab6.md ├─ src │ ├─ boot │ └─ kernel ├─ LICENSE ├─ makefile └...

    Ghost 8.3 系统备份软件

     在 3Com Boot Image Editor 的主菜单中,选择“创建PXE菜单启动文件(Creat a PXE menu boot file)”,在出现的窗口中选择[添加(Add)],加入我们刚刚创建的启动映像文件Pxeghost.img,在“选项(Options)”...

    android的文件系统结构及其引导过程的初步理解

    android的文件系统结构及其引导过程的初步理解

    kgdb-android:修补Nexus 6(Shamu)内核源,以允许KGDB通过串行调试电缆

    创建启动映像,并传递控制台参数,例如更新我使用的库存映像: abootimg -u boot.img -k zImage-dtb -c 'cmdline=console=ttyHSL0,115200,n8 kgdboc=ttyHSL0,115200 kgdbretry=4' 将电话引导到引导加载程序(adb ...

    Ghost 8.3 Enterprise

     在 3Com Boot Image Editor 的主菜单中,选择“创建PXE菜单启动文件(Creat a PXE menu boot file)”,在出现的窗口中选择[添加(Add)],加入我们刚刚创建的启动映像文件Pxeghost.img,在“选项(Options)”...

    grub4dos-0.4.4

    语法结构有下的四条,举例如下:总共  有两个书写格式,任选其一;  格式一:最简单:  代码:  title redflag5  root (hd0,1)  kernel (hd0,1)/linux/vmlinuz  initrd (hd0,1)/linux/initrd.img  title 这行...

    2010年谢彦的android笔记

    1.11 android系统支持app2sd(修改boot.img) 27 2 基本概念 30 2.1 Android组件 31 2.1.1 基本组件 31 2.1.2 组件间的通讯 32 2.1.3 intent使用方法 33 2.2 界面开发 35 2.2.1 界面元素 35 2.2.2 布局的实现 36 ...

    blog-spring-cloud-alibaba:将springboot单体应用改造成spring cloud alibaba

    项目正在改造中... 工程结构 blog-spring-cloud-alibaba ...前台页面的静态资源(css、js、img...)都是放在本地,而预览地址里的静态资源我都放到了OSS里面,觉得加载慢你也可以放到OSS然后再引入。 运行 1

    project_portfolio:一个响应式的单页网站模板,用于设置项目组合。 讲述项目故事的基本结构是“问题,解决方案,工具,视频”。 一个简单的JSON文件提供了内容。 使用Bootcamp进行布局和使用jquery管理DOM

    讲述项目故事的基本结构是“问题,解决方案,工具,视频”。 一个简单的JSON文件提供了内容。 使用bootcamp进行布局,并使用jquery管理DOM。 关于 如果您需要一个投资组合网站来处理您所从事的项目,那么这个简单...

    OS

    ├── bin# 编译输出目录├── boot# bootloader相关代码├── drivers# 系统驱动代码├── floppy.img # 操作系统软盘镜像├── fs# 文件系统代码├── image# 镜像临时挂载点├── init# 内核初始化代码├...

    fhemdocker:FHEM docker家庭自动化堆栈

    完整的堆栈可在x86以及arm体系结构上运行。 克隆其完整的生产环境非常容易,并且具有构建测试系统的简单方法。 去做 蚊子用户/组ID问题 DBLog集成 要求 码头工人 码头工人组成 安装raspberrypi Raspian下载 下载您...

    程序员5个刷题网站-tlmall-springboot-ii:Java企业级电商项目演进——Tomcat集群和Redis分布式

    Boot整合代替SSM整合 注解式开发,包括注解式项目配置以及mybatis中sql语句 项目文件结构: tlmall-springboot-ii +- images | +- img_1_in_markdown.png | +- ... | +- img_n_in_markdown.png +- other | +- image....

    新版Android开发教程.rar

    程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...

    uefi-elf-bootloader:UEFI ELF引导程序示例

    这将创建build/kernel.img文件,该文件是可引导磁盘映像,其中包含加载演示内核的引导程序。 根目录中有一个run脚本,其中包含用于使用QEMU测试引导加载程序/内核组合的脚本。建立依赖GNU Make GNU EFI PATH存在一...

    nunjucks-starter-pack:轻松地从一个地方修改多个HTML文件

    结构 src目录包含开发代码。 可以在dist目录中找到用于生产的已编译代码。 (在运行命令“ gulp prod”后将自动创建dist目录) . ├── app/ | ├── css/ | ├── img/ | └── pages/ | | ├── index.njk ...

Global site tag (gtag.js) - Google Analytics