Android -- Android Init进程的处理流程分析
最近在看Android Init进程的处理流程,现记录如下。
在Android中,Init进程是Linux内核启动后创建的第一个用户进程,地位非常重要。Init进程的可执行文件在/system/core/init/目录下,我们直接看Init进程的main()函数,该函数的代码处理流程较长,我们分两大段来分析。首先看第一大段:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
int main(int argc, char** argv) {
//检测启动程序的文件名,如果是ueventd或者watchdogd,则执行相应守护进程的主函数,然后退出
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
}
if (!strcmp(basename(argv[0]), "watchdogd")) {
return watchdogd_main(argc, argv);
}
// Clear the umask.
umask(0);//umask设置用户创建文件的默认属性;默认情况下文件的属性是022,这里参数为0,意为该进程创建的文件的属性值将为0777
add_environment("PATH", _PATH_DEFPATH);
bool is_first_stage = (argc == 1) || (strcmp(argv[1], "--second-stage") != 0);
// Get the basic filesystem setup we need put together in the initramdisk
// on / and then we'll let the rc file figure out the rest.
if (is_first_stage) {//创建一些基本的目录,并将一些文件系统mount到对应的目录上.
//tmpfs、devpts、proc和sysfs都是文件系统
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);
}
// We must have some place other than / to create the device nodes for
// kmsg and null, otherwise we won't be able to remount / read-only
// later on. Now that tmpfs is mounted on /dev, we can actually talk
// to the outside world.
open_devnull_stdio();//把标准输入、标准输出、标准错误重定向到空设备文件"/dev/__null__"
klog_init();//创建/dev/__kmsg__设备节点,让进程可以使用kernel的log系统来输出log
klog_set_level(KLOG_NOTICE_LEVEL);//设置log等级
NOTICE("init%s started!\n", is_first_stage ? "" : " second stage");
if (!is_first_stage) {
// Indicate that booting is in progress to background fw loaders, etc.
//在/,表示初始化正在进行;is_booting()函数会依靠这个文件判断进程是否正在初始化
//进程初始化结束后,.booting文件将会被删除
close(open("/dev/.booting", O_WRONLY | O_CR
Android -- Android Init进程的处理流程分析 来自淘豆网m.daumloan.com转载请标明出处.