Android镜像与启动流程

来源:互联网 发布:nokia c6 linux系统 编辑:程序博客网 时间:2024/06/06 18:03

这里写图片描述
对于RK平台上电提供了2K自动搬运到SRAM的机制,方便初始化DDR,并且进行后续代码引导,同时厂商还提供了一级boot(MiniLoader),方便从nand启动:

MiniLoader.bin(单独更新Loader的时候,需要连parameter.txt一起更新)


rk312x.parameter.txt(记录了单板ATAG、CMDLINE、分区信息等,Uboot从中获得信息传递给Kernel)


uboot.img


misc.img(uboot通过其中的配置命令进行启动方式选择)


resource.img(dtb、logo等资源)


kernel.img(内核,当boot.img中含有kernel时,这个分区无效)


boot.img(initrd.img、或者initrd.img+kernel)


recovery.img(kernel.img+initrd.img,用于急救恢复操作)


system.img(安卓的根目录系统)


backup.img(rk自定义的景象备份区,包含了上面除system.img外的所有镜像)


关于boot.img的简介

一般内核镜像大小要求尽量小,而内核启动起来之后执行的第一个进程init在根文件系统,文件系统可能存在于flash、网络、硬盘等各种存储设备,为了避免在内核镜像中集成过多的设备驱动,使用一个比较小巧的文件系统ramfs作为引导,这就是initramfs的诞生缘由。
boot.img由kernel.img和initramfs(cpio格式,或者ext2格式的ramdisk)组成,通过mkbootimg打包
initramfs的文件来源于system/core/rootdir
mkbootimg的源码在system/core/mkbootimg
通过mkbootimg打包的内核首先引导initramfs,然后再根据bootarg引导rootfs
解压ramfs:
mv ramdisk.img ramdisk.img.gz
gunzip ramdisk.img.gz
mkdir initramfs
mv ramdisk.img ./initramfs ; cd initramfs
file ramdisk.img可以查看文件是否cpio格式
cpio -id < ramdisk.img
压缩ramfs:
find . ! -path “./.git*” ! -path “./Makefile” | cpio -H newc -ov | gzip > ../initrd.img
truncate -s “%4” ../initrd.img

Android大致启动流程:

1.MiniLoader(RK)根据parameter检查recover按键电平或者AD值更改CPU寄存器,提醒Uboot是否需要进入recovery模式
1.1如果recovery按键被按下,而且usb被接入,则直接进入loader rockusb升级模式;
1.2如果recovery按键被按下,没有接usb,则修改CPU寄存器,提醒uboot引导recovery.img;
1.3如果combination按键被按下,则修改CPU寄存器,提醒uboot引导recovery.img;
2.MiniLoader完成重定向之后控制权转交Uboot
2.1 Uboot通过检查CPU寄存器或者misc中的配置,如果有recovery要求则进入恢复模式4;
3.加载boot分区
3.1如果boot中同时含有kernel和initramfs(initrd.img),则分别加载到内存特定位置,跳转到3.4(跳过加载kernel.img);
3.2如果boot中只有initramfs(initrd.img),或者boot.img是RK格式(直接编译Android SDK默认选项,产生的boot.img镜像只包含initrd.img,不支持ota,需要使用./mkimage.sh ota重新产生才可支持ota),则只加载ramdisk到内存;
3.3加载kernel分区到内存;
3.4跳转到4;
4.急救模式
4.1读出recover分区中的内核跟initramfs(initrd.img)到内存后跳转到5;
5.初始化内核,分析启动参数,挂载ramdisk,运行ramdisk中的/sbin/init(新)或者/init(旧),重新挂载rootfs,将控制权交给用户rootfs(Ubuntu之类)。

Uboot 1.1.6编译:

make mini6410_defconfig
make all生成uboot.bin文件
Linux 2.6.38编译
cp xxx_defconfig ./.config(make xxx_defconfig)
make uImage/zImage

RK平台烧录过程主要使用的都是img镜像文件:

RK3128平台的Android SDK编译:

1.Uboot
make rk3128_defconfig
make 目录下会生成MiniLoader和uboot.img
2.kernel
make rockchip_defconfig(可以到arch/arm/configs中浏览支持哪些配置)
make rk3128-sdk.img(根据实际情况,将x替换成相应型号,则make过程自动在/arch/arm/boot/dts中寻找对应设备树文件)
3.Framework
source ./build/envsetup.sh
lunch 选择编译选项
make -j8
./mkimage.sh 生成的镜像放在/rockdev/Image-rk312x/

RK3128平台Linux的编译:

1.Uboot
make rk3128_defconfig
make 目录下会生成MiniLoader和uboot.img
2.kernel
make xxx_defconfig(可以到arch/arm/configs中浏览支持哪些配置)
make xxxxx.img(根据实际情况,将x替换成相应型号,则make过程自动在/arch/arm/boot/dts中寻找对应设备树文件)
git clone -b fireprime https://github.com/T-Firefly/initrd.git(下载额外的ramdisk系统)
make -C initrd
truncate -s “%4” initrd.img(调整镜像大小)
mkbootimg –kernel arch/arm/boot/zImage –ramdisk initrd.img -o linux-boot.img(打包ramdisk和kernel)

parameter.txt的说明:
分区表mtdparts中,@前面的是分区大小,后面的是起始位置,单位是sector,sector的大小是512B。

Linux与Android双系统实现思路

1.将linux系统的kernel+initramfs替换安卓系统的recovery分区,这样,当系统通过misc或者recv按键进入恢复模式,则将引导linux系统;
2.为了保留android的恢复模式,将原安卓的recovery.img存放在backup分区,修改linux系统的initramfs启动脚本init,通过判断misc中的标志,如果需要进入安卓恢复模式,则会将backup中的ramfs解压到/root,随后跳转执行recovery.img。

0 0