Android init 启动过程分析
分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init
是内核进入文件系统后第一个运行的程序,通常我们可以在linux的命令行中指定内核第一个调用谁,如果没指定那么内核将会到/sbin/,
/bin/ 等目录下查找默认的init,如果没有找到那么就报告出错。
下面是曾经用过的几种开发板的命令行参数:
S3C2410 启动参数:
noinitrd
root=/dev/nfs nfsroot=:/nfsroot/rootfs
ip=:::::eth0:on
console=ttySAC0
S3C2440 启动参数:
setenv bootargs console=ttySAC0
root=/dev/nfs nfsroot=:/nfsroot/rootfs
ip=:::::eth0:on
mem=64M init=/init
marvell 310 启动参数:
boot root=/dev/nfs
nfsroot=:/nfsroot/rootfs,rsize=1024,wsize=1024
ip=:::::eth0:-On
console=ttyS2,115200 mem=64M init=/init
init的源代码在文件:./system/core/init/ 中,init会一步步完成下面的任务:
/init.%hardware%.rc文件
3. 执行 early-init action in the two files parsed in step 2.
4. 设备初始化,例如:在/dev 下面创建所有设备节点,下载 firmwares.
5.
初始化属性服务器,Actually the property system is working as a share memory.
Logically it looks like a registry under Windows system.
6. 执行 init action in the two files parsed in step 2.
7. 开启属性服务。
8. 执行 early-boot and boot actions in the two files parsed in step 2.
9. 执行 Execute property action in the two files parsed in step 2.
10.
进入一个无限循环 to wait for device/property set/child process exit ,
如果SD卡被插入,init会收到一个设备插入事件,它会为这个设备创建节点。系统中比较重要的进程都是由init来fork的,所以如果他们他谁崩溃
了,那么init 将会收到一个 SIGCHLD 信号,把这个信号转化为子进程退出事件, 所以在loop中,init 会操作进程退出事件并且执行
*.rc 文件中定义的命令。
例如,,因为有:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
所以,如果zygote因为启动某些服务导致异常退出后,init将会重新去启动它。
int main(int argc, char **argv)
{
...
//需要在后面的程序中看打印信息的话,需要屏蔽open_devnull_stdio()函数
open_devnull_stdio();
...
//初始化log系统
l
Android init 启动过程分析 来自淘豆网m.daumloan.com转载请标明出处.