android-boot.img分区详解

简介: 对于需要Android系统下,进行Linux驱动、ramdisk定制的开发人员来说,boot.img必须掌握,下面介绍一下boot.img文件格式。

Android boot.img简介


Android不同于一般的嵌入式Linux系统环境固件的组成方式(booloader+kernel+rootfs),其将kernel、ramdisk(rootfs)、second stage(dtb、kernel.logd等)整体打包成一个boot.img文件,并将boot.img文件置于boot分区中,BootLoader启动时,会读取boot.img,将kernel、ramdisk、dtb等信息放置于固定的内存中,然后引导kernel启动。可见,boot.img是相当重要的,如果该文件损坏,那么Android系统是无法正常启动的(可以进入recovery模式进行修复)。对于需要Android系统下,进行Linux驱动、ramdisk定制的开发人员来说,boot.img必须掌握,下面介绍一下boot.img文件格式。


boot.img文件格式


entity_name entity_size
boot header 1 page
kernel n pages
ramdisk m pages
second stage o pages


entity_size的计算方式如下:


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


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


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


注:


  1. all entities are page_size aligned in flash

2 kernel and ramdisk are required (size != 0) 3. second is optional (second_size == 0 -> no second) 4. load each element (kernel, ramdisk, second) at the specified physical address (kernel_addr, etc) 5. prepare tags at tag_addr.  kernel_args[] is appended to the kernel commandline in the tags. 6. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 7. if second_size != 0: jump to second_addr else: jump to kernel_addr


boot.img定制


对于Android系统固件开发者来说,存在两种开发模式:


  1. 基于Android系统源码开发。


  1. 基于Android现有固件,定制boot.img,然后再打包boot.img到Android固件中。


第一种适用于Android 框架层定制开发的人员,第二种使用于linux kernel、ramdisk定制开发的人员。本节主要针对于第二种开发模式进行讲解。


boot.img解包


首先,定制一个boot.img需要将其解包,解包工具本人使用的是split_boot,其基于perl开发,使用非常简单。


split_boot boot.img


之后就会生成解包好的boot,如下:


boot.img-kernel  boot.img-ramdisk.cpio.gz  boot.img-second.gz  ramdisk


本例的boot.img取自firefly-rk3288开发板Android固件,其包括boot.img-second.gz文件,该文件包括的dtb、logo.bmp文件。


boot.img封包


当对于boot.img所包含的文件修改完成之后(例如,修改了kernel、ramdisk或者dtb),接下来就需要重新将各个文件打包成boot.img。


这里需要两个工具,一个是将ramdisk打包成boot.img-ramdisk.cpio.gz的工具,一个是将boot.img-kernel  boot.img-ramdisk.cpio.gz  boot.img-second.gz打包成boot.img的工具。


首先,介绍如何打包ramdisk,打包命令如下:


mkbootfs ramdisk | gzip -n -f -c > boot.img-ramdisk.cpio.gz


其中,ramdisk即为将要被打包的ramdisk目录。


之后,使用mkbooting工具,将所有文件打包成boot.img。


mkbooting \
        --kernel boot.img-kernel \
        --ramdisk boot.img-ramdisk.cpio.gz \
        --second boot.img-second.gz \
        --base  0x60400000 \
        --pagesize 16384\
        -o ../../boot.img


对于boot.img的打包流程,可以通过一个脚本实现。


资源


可以通过链接下载上面所使用到的工具,其中包括:split_tool、mkbootfs、mkbooting等。



相关文章
|
7月前
|
安全 Android开发
Android 预置可卸载分区接收不到任何广播问题分析和解决
Android 预置可卸载分区接收不到任何广播问题分析和解决
225 0
|
7月前
|
存储 缓存 Android开发
android分区概述
android分区概述
278 0
|
7月前
|
Android开发
安卓的分区一点有用知识:super、lpunpack、lpdump
安卓的分区一点有用知识:super、lpunpack、lpdump
1059 0
|
4月前
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
366 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
7月前
|
Shell Android开发
MT8385 Android AB分区系统升级(命令模式)
MT8385 Android AB分区系统升级(命令模式)
86 0
|
7月前
|
存储 缓存 Android开发
Android系统分区与升级
Android系统分区与升级
126 4
|
7月前
|
存储 缓存 Linux
Android 系统的分区
Android 系统的分区
73 1
|
7月前
|
Java API Android开发
Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码
Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码
162 0
|
7月前
|
存储 Linux Android开发
Android存储分区与Rockchip平台的分区命名及U-Boot配置
Android存储分区与Rockchip平台的分区命名及U-Boot配置
240 0
|
7月前
|
存储 缓存 安全
Rockchip系列之RK3568 Android设备固件和分区信息
Rockchip系列之RK3568 Android设备固件和分区信息
547 0