本帖最后由 ironMan.K 于 2018-3-22 13:50 编辑

以msm8226为例,讲解android源码编译生成boot.img的结构。boot.img包括boot.img header、kernel以及ramdisk文件系统。下面是对boot.img的结构进行解读。

boot.img 文件头信息的具体结构可以在system/core/mkbootimg/bootimg.h中看到:

typedef struct boot_img_hdr boot_img_hdr;

#define BOOT_MAGIC "ANDROID!"

#define BOOT_MAGIC_SIZE 8

#define BOOT_NAME_SIZE 16

#define BOOT_ARGS_SIZE 512

struct boot_img_hdr{unsigned char magic[BOOT_MAGIC_SIZE];

unsigned kernel_size;  /* size in bytes */unsigned kernel_addr;  /* physical load addr */

unsigned ramdisk_size; /* size in bytes */unsigned ramdisk_addr; /* physical load addr */

unsigned second_size;  /* size in bytes */unsigned second_addr;  /* physical load addr */

unsigned tags_addr;    /* physical addr for kernel tags */unsigned page_size;    /* flash page size we assume */unsigned dt_size;      /* device tree in bytes */unsigned unused;       /* future expansion: should be 0 */unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */

unsigned char cmdline[BOOT_ARGS_SIZE];

unsigned id[8]; /* timestamp / checksum / sha1 / etc */};

boot,img文件跳过2k的文件头之后,包括两个 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

** +-----------------+

** | device tree     | p pages

** +-----------------+

** n = (kernel_size + page_size - 1) / page_size

** m = (ramdisk_size + page_size - 1) / page_size

** o = (second_size + page_size - 1) / page_size

** p = (dt_size + page_size - 1) / page_size

图一是boot.img头文件结构解析:

boot.img头文件结构解析

圈一:安卓的boot.img标准的文件头格式:ANDROID!(8字节)

圈二:kernel_size(4字节)

圈三:kernel_addr(4字节)

圈四:ramdisk_size(4字节)

圈五:ramdisk_addr(4字节)

圈六:second_stage_size(4字节)

圈七:second_stage_addr(4字节)

图八:tags_addr(4字节)

圈九:page_size(4字节)

boot.img头文件信息,kernel_addr,ramdisk_addr,second_stage_addr在bootable\bootloader\lk\target\msm8226\Rules.mk中设置:

PLATFORM := msm8226

MEMBASE:= 0x0FF00000 # SDRAM

MEMSIZE:= 0x00500000 # 5MB

BASE_ADDR := 0x00000

TAGS_ADDR:= BASE_ADDR+0x00000100

KERNEL_ADDR:= BASE_ADDR+0x00008000

RAMDISK_ADDR:= BASE_ADDR+0x01000000

SCRATCH_ADDR:= 0x10400000

page是页长,为1k(1024)的整数倍。此处为0x00000800,十进制为2048。

结合实际的boot.img文件,进行验证。如图二,是msm8226 boot.img

图二 msm8226 boot.img内容

解析msm8226 boot.img内容,可以得到:

base=0x00000000

kernel_size=0x005ff6f0

kernel_addr=0x00008000+base=0x00008000

ramdisk_size=0x00195de2

ramdisk_addr=0x01000000+base=0x01000000

sencond_stage_size=0x00000000

sencond_stage_addr=0x00f00000+base=0x00f00000tag_size=0x00000100

page_size=0x00000800(2KB)

binwalk 提取bootimg_boot.img格式文件结构解析相关推荐

  1. 深入boot.img格式文件结构解析

    以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...

  2. binwalk 提取bootimg_boot.img的解包与打包

    Android 产品中,内核格式是Linux标准的zImage,根文件系统采用ramdisk格式.这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中.这个分区格式是 ...

  3. JVM探索之路之Class文件结构解析(一):Class文件的格式与定义

    JVM 学习笔记目录: JVM探索之路之Class文件结构解析(二) :常量池 JVM探索之路之Class文件结构解析(三):访问修饰符.类索引.父类索引与接口索引集合 Class文件的格式与定义 C ...

  4. MP3文件结构解析(超详细)

    1. MP3文件结构解析 1.1. 概述 1.1.1. 音频相关术语 ID3: 一般位于一个mp3文件的开头或末尾的若干字节内,记录该mp3文件的歌手.标题.专辑名称.年代.风格等信息,ID3分位两个 ...

  5. 直播2----FLV文件结构解析

    FLV文件结构解析 FLV(FLASH VIDEO),是一种常用的文件封装格式,目前国内外大部分视频分享网站都是采用的这种格式.其标准定义为<Adobe Flash Video File For ...

  6. 一篇胎死腹中的Android文章——Dex文件结构解析

    前言 国庆的时候,为了理解DexDiff算法,花了几天时间研究了下Dex的文件结构,算是有个整体的把握,这篇文章是在姜维的 <Android逆向之旅-解析编译之后的Dex文件格式>基础上, ...

  7. golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)

    文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...

  8. sqlserver 扩展事件监控慢sql与阻塞sql,xml格式日志解析

    零. 启用参数 SqlServer中默认blocked process收集是不开启的,可以通过以下sql查看,值为0表示未开启. exec sp_configure 'show advanced op ...

  9. 解析las文件_LAS格式的解析与转换

    LAS 格式的解析与转换 孙爱怡,王健 [摘 要] 摘 要: 本文主要探讨 LAS 数据结构的发展历程 , 在分析已有四种版 本的基础上 , 探讨 LAS 标准发展趋势 , 并采用 C++ 语言对该格 ...

最新文章

  1. My deep learning reading list
  2. 为什么说21世纪是一场ABC的革命?
  3. BAT面试题9:谈谈判别式模型和生成式模型?
  4. 找区间连续值(HDU5247)
  5. 【存储知识学习】第三章磁盘原理与技术3.10 固态存储介质和固态硬盘-《大话存储》阅读笔记
  6. html首字母样式,html标签手册
  7. 笔记本高分屏字体模糊_笔记本win8系统设置1920*1080高分屏后字体模糊的解决方法...
  8. win7开启uasp协议_UASP与USB模式切换工具(SwitchUA官方版下载_UASP与USB模式切换工具(SwitchUASP) v1.0免费版 - Win7旗舰版...
  9. Docker最全教程——从理论到实战(二)
  10. c#官方推荐md5通用加密类
  11. [转]何时使用委托而不使用接口(C# 编程指南)
  12. 说说中国的图书出版业者-读《小学奥数举一反三(5年级A版)》和《2010注册建筑师建筑结构考试强化模拟试题集》有感...
  13. 11、doCreateBean中的initializeBean
  14. tar 打包、压缩和备份
  15. oracle脚本转mpp脚本,范本:使用expdp/impdp克隆生成一个新数据库
  16. table2excel 导出表格有边框,文字居中
  17. LED降压恒流驱动芯片适用于LED电动车/摩托/汽车大灯方案
  18. 【准备篇】1.Simulink-F28335自动代码生成开发环境搭建
  19. python是低级语言吗_低级语言和高级语言的区别
  20. java匹配任意,java有关正则表示式,我想匹配一个字串中的任意字元,怎么办?...

热门文章

  1. 架构设计系列(一)——架构设计概述
  2. SpringBoot如何直接访问HTML页面
  3. pytorch学习笔记(7):RNN和LSTM实现分类和回归
  4. 【elasticsearch系列】windows安装IK分词器插件
  5. java web怎么快速设计网页_Javaweb毕业设计快速开发指南(一)
  6. cocos2d-x3.2对CocoStudio的支持
  7. 用Solr4.10实在全文检索
  8. 乐观锁与悲观锁的应用场景
  9. 进程间通信-字符串的传递
  10. ~~~~~~~~~~~~~~坏公司鉴别方法 ~~~~~~~~~~~