基于AOSP7.1,源码路径:system/core/init/init.cpp
守护进程(Daemon):一类在后台运行的特殊进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
创建守护进程模型:
1.创建子进程,父进程退出
2.在子进程中创建新会话。调用setsid函数
3.改变当前工作目录至根目录。调用chdir函数
4.重设文件权限掩码。调用umask函数
5.关闭文件描述符
6.开始执行守护进程的核心工作
7.守护进程退出处理程序模型
bootloader启动后,启动kernel,kernel启动完后,在用户空间启动init进程
kernel/init/main.c
start_kernel
rest_init
kernel_init
static int __ref kernel_init(void *unused)
{
kernel_init_freeable(); // 赋值ramdisk_execute_command = "/init";
...
if (ramdisk_execute_command) {
if (!run_init_process(ramdisk_execute_command))
return 0;
pr_err("Failed to execute %s\n", ramdisk_execute_command);
}
...
}
static int run_init_process(const char *init_filename)
{
argv_init[0] = init_filename;
return do_execve(init_filename,
(const char __user *const __user *)argv_init,
(const char __user *const __user *)envp_init);
}
do_execve("/init")可以看做完成了创建守护进程的前三步
都要23年了,7.1的代码太旧了,这不趁着双十二升级了固态。下了份Android11的代码,以后就基于Android11分析了。
这里再梳理下Android11的init流程,因为基本上还是跟Android7很像的,这里简略看下。
system/core/init/main.cpp
int main(int argc, char** argv) {
...
if (!strcmp(argv[1], "selinux_setup")) {
return SetupSelinux(argv);
}
if (!strcmp(argv[1], "second_stage")) {
return SecondStageMain(argc, argv);
}
return FirstStageMain(argc, argv);
}
system/core/init/first_stage_init.cpp
int FirstStageMain(int argc, char** argv) {
...
const char* path = "/system/bin/init";
const char* args[] = {path, "selinux_setup", nullptr};
auto fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
execv(path, const_cast(args));
return 1;
}
system/core/init/selinux.cpp
int SetupSelinux(char** argv) {
...
const char* path = "/system/bin/init";
const char* args[] = {path, "second_stage", nullptr};
execv(path, const_cast(args));
return 1;
}
system/core/init/init.cpp
int SecondStageMain(int argc, char** argv) {
...
}