[Android源码分析] 一.系统启动-init启动流程梳理

基于AOSP7.1,源码路径:system/core/init/init.cpp

一.守护进程

守护进程(Daemon):一类在后台运行的特殊进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

创建守护进程模型:
1.创建子进程,父进程退出
2.在子进程中创建新会话。调用setsid函数
3.改变当前工作目录至根目录。调用chdir函数
4.重设文件权限掩码。调用umask函数
5.关闭文件描述符
6.开始执行守护进程的核心工作
7.守护进程退出处理程序模型

二.init启动

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")可以看做完成了创建守护进程的前三步

三.init.cpp

[Android源码分析] 一.系统启动-init启动流程梳理_第1张图片

四.Android11 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) {
    ...
}

你可能感兴趣的:(Android启动,android)