init文件是一个二进制文件,其源码在system/core/init/目录下,文件的函数入口在init.c文件。首先看看其主函数:
1 int main(int argc, char **argv) 2 { 3 //... 4 umask(0); 5 6 /* Get the basic filesystem setup we need put 7 * together in the initramdisk on / and then we'll 8 * let the rc file figure out the rest. 9 */ 10 mkdir("/dev", 0755); 11 mkdir("/proc", 0755); 12 mkdir("/sys", 0755); 13 14 mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); 15 mkdir("/dev/pts", 0755); 16 mkdir("/dev/socket", 0755); 17 mount("devpts", "/dev/pts", "devpts", 0, NULL); 18 mount("proc", "/proc", "proc", 0, NULL); 19 mount("sysfs", "/sys", "sysfs", 0, NULL); 20 //... 21 }
在上面的代码中我们省略了部分声明代码,在函数的初始执行执行目录挂载,权限设置等工作。umask函数为进程设置文件模式创建屏蔽字。接着代码如下:
1 // ... 2 open_devnull_stdio(); 3 klog_init(); 4 property_init(); 5 6 get_hardware_name(hardware, &revision); 7 8 process_kernel_cmdline(); 9 //...
其中第二行的代码主要是将系统的输出定向到/dev/null 设备。第三行的代码初始化内核日志系统。第四行的代码出要是初始化系统服务,具体的实现在于init.c文件的同层目录下的property_service.c文件中实现。第六行获得硬件信息,具体的实现是在util.c文件中。第8行用来处理内核参数。
1 initrc_path = property_get("ro.boot.initrc"); 2 if (!initrc_path) 3 initrc_path = "/init.rc"; 4 INFO("reading config file %s\n", initrc_path); 5 init_parse_config_file(initrc_path);
以上的代码解析加载init.rc 文件,系统首先会尝试获得系统的“ro.boot.initrc”属性,如果获得属性为空那将加载根目录下的init.rc文件,该文件包含在ramdisk.img文件中。第五行解析这个文件,该函数的具体实现在init_parser.c文件中。