android boot.img 结构
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)
android boot.img 结构相关推荐
- android boot.img 结构,android boot.img文件结构、拆包、打包
boot.img is not a compressed filesystem image like system.img. It is read by the bootloader, and con ...
- android源码结构
android源码结构 Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编 ...
- Android文件系统的结构
Android 4.2.2 版本的文件系统 内核版本为 3.0.31 版本号为JDQ39 factory//估计是存放网络通信协议的登录密钥的 |-- bluetooth |-- hdcp.keys ...
- Android文件系统的结构及目录用途、操作方法 整理
https://blog.csdn.net/TskyFree/article/details/43935595 1.android文件系统的结构 android源码编译后得到system.img,ra ...
- Android文件系统的结构及目录用途、操作方法
以下内容转载 1.android文件系统的结构 android源码编译后得到system.img,ramdisk.img,userdata.img映像文件.其中,ramdisk.img是emulato ...
- Spring Boot项目结构
目录 Spring Boot项目结构 一.代码层结构 二.资源目录结构 三.测试测序目录结构 四.项目结构示例 Spring Boot项目结构 一.代码层结构 根目录:src/main/java 入口 ...
- android源码树结构介绍
最近在学习android源码,在这里分享学习过程中总结的一些知识.仅供参考,如有错误,还请指教. 无论是下载源码还是在AndroidXref 上在线阅读源码,我认为首先都要弄明白源码中各个目录下的代码 ...
- Android MIME类型结构
Android MIME类型的结构 MIMW类型标准:http://tools.ietf/html/rfc2046 根据MIME类型规范,MIME类型包含两部分:类型和子类型.下面是一些流行的MIME ...
- Android Studio项目结构
我们创建了一个Android Project,打开就如下图所示: 我们选择Project视图,就会有以下的项目文档结构: 上面笔者标注的数字是接下来要讲解的内容. 我们先来看1: 我们创建Ap ...
最新文章
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
- python编程小游戏代码-Python小游戏之300行代码实现俄罗斯方块
- c1200 写频软件_摩托罗拉XIR C1200数字对讲机试用——来自HAM族的呼叫
- windows系统环境变量过长解决方案(PATH too long installer unable to modify Path)
- SaltStack的salt-ssh使用及LAMP状态设计部署
- CentOs7相对于CentOs6的常用命令变化
- python分布式任务调度_Python开源任务调度框架介绍
- Debian忘记密码修改
- 《天下少年英雄》隐私政策
- 将轻松的留给生活,沉重的留给写作——读《灯下尘》(七堇年)
- 新概念英语第三册51-60课(转)
- 手机百度云如何打开doc
- Unity UI跟随物体
- 微信小程序 — tag标签设置选中效果和未选样式
- 关于C语言编译的可执行文件 exe 发给好友解决办法 Visual Studio 2013 版本
- VS2015远程白屏的解决办法——亲测可用
- 使用mybatis-plus时mybatis报错There is no getter for property named ‘xxx‘ in ‘class com.xxx.xxx.xxxMybatis
- PAMI19 - 强大的级联RCNN架构《Cascade R-CNN: High Quality Object Detection and Instance Segmentation》
- 数据分析中的专业术语
- 看电影-《肖申克的救赎》
热门文章
- @Bean修饰的方法参数的注入方式
- 006_url-pattern配置
- mysql 导入导出 优化_mysql数据导入导出与数据表优化
- html 中如何写js代码提示错误,javascript怎么进行错误处理?
- linux lvm 系统快照,利用Linux LVM进行快照备份
- vi测试仪维修成功率高吗?_电工电路板检测维修无图电路板的技巧
- 性能分析工具 Android TraceView
- Java基础:IO流之File类
- day04 : SQL_DDL, 表创建及管理
- java enum 返回list_java – 组合枚举并使用getter返回指定的枚举