RK3128系统启动大致流程分三个阶段
1、boot启动,即rk3128MiniLoaderAll(L)_V2.31.bin和uboot.img启动
2、linux内核启动,即kernel.img的启动
3、android系统的启动,即ramdisk.img、system.img的启动。
这里讲解第三步。
android系统启动过程是从init进程开始的。(源码在/system/core/init/init.c,linux内核启动完成最后就会跳转到这个文件的main函数里)
Android的init进程主要功能:
1)、分析init.rc启动脚本文件,根据文件内容执行相应的功能;
init会 根据启动脚本中的配置启动各个service进程(入下图)。
2)、当一些关键进程死亡时,重启该进程;
3)、提供Android系统的属性服务;
init.rc脚本是一个初始化的配置文件,非常关键。
因为android采用ramdisk的方式挂载根文件系统,而init.rc文件就放在ramdisk里,所以系统启动后修改init.rc文件是无法保存住的。
可以采用两种方法修改:
(1) 有android源码的话从源码里直接修改,然后重新编译即可,直接修改/system/core/rootdir/init.rc
(2) 将ramdisk.img解包,修改后,再压包
下面详细说明第二种方法的步骤:
(1) 将ramdisk.img拷贝到某个目录下,如tmpdir。
(2) 进入tmpdir将ramdisk.img重命名为ramdisk.img.gz
命令:mv ramdisk.img ramdisk.img.gz
(3) 使用gunzip 解压ramdisk.img.gz
命令:gunzip ramdisk.img.gz
(4) 在tmpdir目录下建立新目录,如ramdisk
命令:mkdir ramdisk
(5) 进入ramdisk目录
命令:cd ramdisk
(6) 解包
命令:cpio -i -F ../ramdisk.img
(7) 修改init.rc文件,并保存
(8) 打包
命令:cpio -i -t -F ../ramdisk.img > list
命令:cpio -o -H newc -O ../new.img < list
命令:gzip new.img
(9) 重命名new.img
命令:mv new.img ramdisk.img