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

(转)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)

分享到:
评论

相关推荐

    解包boot.img工具

    4. 重新打包:将修改后的组件按照原始结构打包回一个新的`boot.img`文件。 四、使用解包工具 使用解包工具通常涉及以下步骤: 1. 下载并安装工具:获取解包工具,如从GitHub或其他开源社区下载。 2. 运行命令:在...

    Boot.img-修补工具-Magisk-Patcher

    在实际操作中,Magisk Patcher会分析Boot.img的结构,找到合适的位置插入模块,并进行签名验证,以确保修改后的Boot.img能够在设备上正常运行。完成后,你可以通过fastboot命令将新的Boot.img刷回设备,完成系统的...

    安卓系统boot.img和recovery.img及system.img文件解包打包工具,Windows下使用

    5. **解包过程**:使用MTK_Extractor_V2.6.3,用户可以将boot.img、recovery.img和system.img解包为可编辑的文件结构,例如解包boot.img会得到内核(kernel)、ramdisk(包含启动脚本和服务)等部分,方便进行个性化...

    boot.img解包打包工具for Windows

    3. 不同设备的boot.img结构可能略有差异,使用前需确认工具是否适用于目标设备。 4. 这个工具可能需要与ADB和Fastboot等Android开发者工具配合使用,确保它们也正确安装并配置。 总之,"boot.img解包打包工具for ...

    三星内核压缩文件 lz4 解压缩为 普通文件,boot.img.lz4 解压为 boot.img

    标题中的“三星内核压缩文件lz4解压缩为普通文件,boot.img.lz4解压为boot.img”指的是使用lz4压缩算法对特定的内核文件进行解压的过程。lz4是一种快速的数据压缩算法,广泛应用于系统启动文件、内核模块和其他需要...

    如何解包/编辑/打包android系统的boot.img文件

    了解了 boot 和 recovery 映像的文件结构,我们可以更好地理解和操作 Android 系统的 boot.img 文件。 在实际操作中,我们可以使用 mkbootimg 工具来解包、编辑和打包 boot.img 文件。例如,可以使用以下命令来解包...

    boot.img 解包/打包/刷机工具(2K版)

    通过运行这个脚本,用户可以将`boot.img`解包为一个包含kernel、ramdisk目录和其他相关文件的结构。这通常涉及到使用如`unzip`、`dd`和自定义的Perl脚本等命令。 解包后的`boot.img`可以被进一步修改。例如,`...

    split boot.img

    一、boot.img结构 `boot.img`是一个包含多个组件的单一文件,具体包括: 1. 引导加载程序(Bootloader):这是系统启动的第一个软件,负责加载内核到内存并初始化硬件。 2. 内核(Kernel):操作系统的内核,管理...

    解包打包boot.img工具

    本文将深入探讨boot.img的结构、解包打包过程及其相关工具。 首先,boot.img是Android设备启动过程中的核心组件。它主要包含以下三个部分: 1. 引导加载程序(Bootloader):这是设备启动时首先运行的代码,负责...

    windows下解包/打包boot/recovery.img的工具bootimg.exe

    在Android系统中,`boot.img`和`recovery.img`是两个至关重要的文件,它们包含了启动和恢复模式下的操作系统核心及必要的驱动程序。`bootimg.exe`是一个在Windows环境下使用的工具,专门用于处理这些镜像文件,使得...

    手机rom内核boot.img解包打包合并替换工具

    1. **Boot.img结构** Boot.img是Android系统中的一个关键文件,由四个主要部分组成:Bootloader、Kernel(内核)、Ramdisk(初始RAM磁盘)和Second(第二个引导加载程序)。Bootloader负责启动设备,Kernel是操作...

    boot.img exe工具及使用教程

    1. **解包**:将boot.img文件解包成可读的文件结构,方便用户查看和编辑内含的引导程序、内核和驱动文件。 2. **打包**:完成修改后的文件可以重新打包成boot.img,供系统使用。这对于开发者调试或自定义系统是非常...

    如何解包-编辑-打包boot.img文件.doc

    2、**boot和recovery映像的文件结构** `boot.img`和`recovery.img`不是标准的文件系统,而是包含特定头部信息的自定义格式。头部信息包括内核的加载地址、长度,ramdisk的位置和长度,以及命令行参数。接着是gzip...

    安卓内核修改工具 bootimg_tools

    【安卓内核修改工具 bootimg_tools】是一款专用于Android系统内核修改的工具包,它包含了一系列脚本和工具,帮助开发者和高级用户对设备的启动镜像(boot.img)进行解包、打包、签名以及调整。这个工具集合是Android...

    windows下完美的bootimg解包助手

    1. **解包boot.img**:将boot.img文件转换为可编辑的文件结构,包括内核映像(kernel)、初始化ramdisk(initrd)和其他相关数据。 2. **编辑内核**:如果你需要修改内核参数或者添加驱动,可以使用专门的工具打开...

    himedia q5 1,0.7. boot.img contents

    【标题】"海美迪Q5 1.0.7 boot.img 文件内容解析" 【描述】"海美迪Q5是一款基于Linux系统的智能媒体播放器,其1.0.7版本的boot.img文件包含了启动过程中的关键组件。boot.img是Android系统中用于设备启动的关键镜像...

    HiMedia Q5 4K3D boot.img contents

    总的来说,理解`boot.img` 的内部结构和文件内容对于深入研究HiMedia Q5 4K3D的系统工作原理以及进行设备调试、优化至关重要。无论是开发者还是高级用户,都需要掌握这部分知识,以便更好地利用和定制这款强大的4K3D...

    Android boot解包打包工具,支持Android 4到android11,Linux 环境可用

    本工具提供了这样的功能,它能解析boot.img文件,将其中的ramdisk(通常为 squashfs 或 ext4 格式)解压为可读写的目录结构,方便用户查看和修改内容。这对于系统开发者和安全研究人员来说尤其重要,他们可以借此...

Global site tag (gtag.js) - Google Analytics