android-boot.img分区详解

3 篇文章 0 订阅

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_nameentity_size
boot header1 page
kerneln pages
ramdiskm pages
second stageo 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等。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值