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
注:
- 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系统固件开发者来说,存在两种开发模式:
- 基于Android系统源码开发。
- 基于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等。