android-boot.img分区详解

2019-07-12 23:05发布

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系统源码开发。
2. 基于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等。