linux kernel_init

来源:互联网 发布:看电子书的软件 编辑:程序博客网 时间:2024/06/07 15:41

Kernel:

asmlinkage __visible void __init start_kernel(void){        ....   trap_init();sched_init();rest_init();}

static noinline void __init_refok rest_init(void){    kernel_thread(kernel_init, NULL, CLONE_FS);    pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);}

static int __ref kernel_init(void *unused){        int ret;        kernel_init_freeable();        /* need to finish all async __init code before freeing the memory */        async_synchronize_full();        free_initmem();        mark_rodata_ro();        system_state = SYSTEM_RUNNING;        numa_default_policy();        flush_delayed_fput();        if (ramdisk_execute_command) {                ret = run_init_process(ramdisk_execute_command);                if (!ret)                        return 0;                pr_err("Failed to execute %s (error %d)\n",                       ramdisk_execute_command, ret);        }        if (!try_to_run_init_process("/sbin/init") ||            !try_to_run_init_process("/etc/init") ||            !try_to_run_init_process("/bin/init") ||            !try_to_run_init_process("/bin/sh"))                return 0;        panic("No working init found.  Try passing init= option to kernel. "              "See Linux Documentation/init.txt for guidance.");}

static noinline void __init kernel_init_freeable(void){        if (!ramdisk_execute_command)                ramdisk_execute_command = "/init";}

内核系统调用:

static int run_init_process(const char *init_filename){        argv_init[0] = init_filename;        return do_execve(getname_kernel(init_filename),                (const char __user *const __user *)argv_init,                (const char __user *const __user *)envp_init);}

Userspace:init进程启动


int main(int argc, char** argv) {    if (is_first_stage) {        if (restorecon("/init") == -1) {            ERROR("restorecon failed: %s\n", strerror(errno));            security_failure();        }        char* path = argv[0];        char* args[] = { path, const_cast<char*>("--second-stage"), nullptr };        if (execv(path, args) == -1) {            ERROR("execv(\"%s\") failed: %s\n", path, strerror(errno));            security_failure();        }    }    restorecon("/dev/__properties__");    signal_handler_init();    property_load_boot_defaults();    start_property_service();    init_parse_config_file("/init.rc");}


原创粉丝点击