在内核3.8中,删除kernel_execve时,第一个用户进程如何切换到用户模式

时间:2013-04-16 01:24:01

标签: linux-kernel

在内核3.8.x及更高版本中,run_init_process的定义已更改。

以下是内核3.8中run_init_proces的新定义。

 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); }

与内核3.7.x和旧版本中的定义相比。

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

kernel_execve 中最关键的部分是它将调用ret_from_kernel_execve,然后将切换到用户模式。

在新定义中, kernel_execve 消失了。我的问题是如何将第一个用户进程切换到用户模式。

1 个答案:

答案 0 :(得分:0)

成功do_execv()设置current进程以运行新程序(例如,通过load_elf_binary()),然后返回0到run_init_process(),返回0到{ {1}},也返回0,并作为以下部分调用:

kernel_init()

这是来自https://lwn.net/Articles/520227/的规则的来源:我们的 kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); fn()之后返回0,因此“线程将进入由该execve创建的用户区上下文”。< / p>