分类:
2011-06-02 15:16:04
/system/core/init初始化程序
1.执行sigaction函数,对SIGCHILD信号进行处理。实际上暂时屏蔽
2.设置umask来清空后面创建文件的mask
3. 创建文件系统mount point & mount 内存文件系统
4. open_devnull_stdio 0 1 2 is the fd. They are all the file descriptor of /dev/__null__
5.open /dev/__kmsg__ as log fd.
6.parse_config_file
首先打开/init.rc然后读出所有的数据到内存,然后调用parse_config函数进行分析。将comand,service等放入链表中等待处理。
7.import_kernel_cmdline 会从/proc/cmdline中获取bootargs,然后分析之,并使用import_kernel_nv填充qemu,console,bootmode,serialno,baseband,carrier,bootloader,hardware变量。如果设置了android.ril参数,还要设置对应的permissions,也就是uid,gid。
8.get_hardware_name根据/dev/cpuinfo获取hardware和rev参数,放到hardware和revision全局变量中
9. 解析init.hardware.rc config文件,然后执行early init中的action,通过drain_action_queue
10. 执行device_init,首先open_uevent_socket,然后设置socket的属性。最后对/sys/class、/sys/block、/sys/devices执行coldboot。
11.在向/sys/class等目录下的uevent文件写入”add\n”之后,从uevent的socket接收消息,并对消息进行解析,完成对uevent结构的赋值。然后根据uevent以及在全局devperms预定义的权限创建各个dev下的目录和设备节点
12.初始化__system_property_area__(打开ashmem设备,申请内存,并将之初始化为prop_area结构)
13.执行property_init,读取buid.prop,然后将之设置到property中
14.根据build.prop中设置过的ro.debuggerable,确定是否open_keychord
15. 打开console,如果console数组设置过,会使用console数组的设置,如果没有,默认会使用/dev/console作为console。如果有console设备,have_console变量为1
16.设置一些property,比如ro.serialno,ro.bootmode,ro.baseband,ro.carrier,ro.bootloader,ro.hardware,ro.revision
17. 执行init.rc和init.hardware.rc里的init组
18.从/system/build.prop、system/default.prop、data/local.prop中读取property并设置,读取property读取data/propery下的各个persist值,根据文件名和内容设置property
19.创建property_service socket并进行监听
20.创建配对的socket
21.确保uevent的socket fd、property_service的fd,signal_receive的fd全部有效
22. run all property triggers based on current state of the properties
23.创建并打开以下log文件。
#define LOG_ROOT "/data/bootchart"
#define LOG_STAT LOG_ROOT"/proc_stat.log"
#define LOG_PROCS LOG_ROOT"/proc_ps.log"
#define LOG_DISK LOG_ROOT"/proc_diskstats.log"
24.调用acct函数,记录内核每次进程的terminate消息。写入LOG_ROOT"/kernel_pacct"
25.将/proc/cmdline、/proc/version、/proc/cpuinfo写入LOG_ROOT"/header"。Bootchart会根据#define LOG_STARTFILE "/data/bootchart-start"设置的时间进行记录
26.进入死循环,在内部对前面提到的几个fd进行poll操作,并在poll成功之后,handle_device_fd或handle_property_set_fd或handle_keychord
从以上分析中可以看出需要注意的几个事项,比如permissions,还可以根据data/bootchard下的几个log文件分析log信息。还可以知道untracket pid的原因。几个prop文件的加载顺序,如何让系统从ramdisk启动并且加载loop设备。rc文件的更多选项。socket通信,如何自动创立设备节点。