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文件中。