android系统启动流程
注意:
1) 解析rc文件中所有的action,token,ketwork,section,service等:
一直跟踪parse_new_section,会发现最后数据存在servicelist,actionlist等链表中去了,后续执行这些解析出来的数据的时候,正是从servicelist,actionlist中取出来,加入到执行队列queue中.。至于rc文件到底是怎么解析的,其中有什么关键内容,先放到后面。
2) 嵌套调用init_parse_config_file:
继续解析完init.rc用import导入的所有其他rc. 看看init.rc的开头是如何导入其他文件的:
其中的import /init.${ro.hardware}.rc,显然需要知道ro. hardware到底是什么值。 前面分析init.c的main函数的时候,我们注意到下面2个函数:
9 / 52
android系统启动流程
3)进入\\system\\core\\init\%util.c的get_hardware_name: 该函数的源代码如下:
我们在终端cat /proc/cpuinfo获得如下信息
前面是4个CPU信息(4核处理器),最后明确看到Hardware的值是bigfish.
10 / 52
android系统启动流程
4)回到\\system\\core\\init\\init.c的 process_kernel_cmdline:
process_kernel_cmdline中调用了export_kernel_boot_props函数,这个函数设置了 ro. hardware这个属性的值:
ro.boot.hardware在 系统中没有设值,所以hardware这个字符串保持为bigfish,导致:
目录下,和init.rc同级.
5)接下来,解析得到的所有action就开始加入到执行队列:
所以import /init.${ro.hardware}.rc就是import /init. bigfish.rc,而这个文件在终端的根
并在\\system\\core\\init\\init.c的main的for循环中得以执行。
11 / 52
android系统启动流程
3.4核心任务三:执行command,监控service重启h和socket请求
\\system\\core\\init\\init.c的main:
poll这个api其实就是检测传入的socket的可读,可写,异常等状态;返回POLLIN表示该socket可读,此时就分别调调三种类型任务对应的handle接口进行任务处理。
这三个socket分别是在各自的模块初始化函数(init)中创建的:
3.5疑问:传说中的zygote进程启动在 哪里?
通过上面对\\system\\core\\rootdir\\init.c下面main函数及其执行的相关核心任务的解析,init进程到底干了些什么事,已经基本清楚了,但是我们似乎没发现传说中的zygote进程在哪里启动?
main函数的任务中,唯一确实看到他到底是内容,到底在做什么的就是init.rc的内容,整理我们还没有详细分析过,而zygote和servicemanager等的启动其实就藏在里面,我们这里只关注zygote。
12 / 52
相关推荐: