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

12

在3.8.x及之后的内核版本中,run_init_process的定义发生了变化。

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

 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 已经不存在了。我的问题是第一个用户进程如何切换到用户模式。


8
这篇文章 [https://lwn.net/Articles/520227/](Al Viro 的新 execve/kernel_thread 设计)非常有帮助。其中的主要更改位于 copy_thread 函数。 - hseagle
1
更多关于编程的信息,请访问当前网址 - artless noise
1
@artlessnoise:实际上,他只需要学会在URL周围使用<>而不是[]即可... - SamB
1个回答

1
成功的 do_execv() 函数设置了 current 进程以运行新程序(例如通过 load_elf_binary()),然后返回 0 给 run_init_process(),后者返回 0 给 kernel_init(),后者也返回 0,并作为以下过程的一部分被调用:
    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

这就是https://lwn.net/Articles/520227/中的规则发挥作用的地方:我们的fn()execve后返回0,因此“线程将进入由该execve创建的用户空间上下文”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接