现在的位置: 首页 > 综合 > 正文

Android init初始化程序分析

2014年09月05日 ⁄ 综合 ⁄ 共 2228字 ⁄ 字号 评论关闭

/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通信,如何自动创立设备节点。

抱歉!评论已关闭.