/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通信,如何自动创立设备节点。 |
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)