Linux kernel 在kernel3.8中,当kernel_execve被删除时,如何将第一个用户进程切换到用户模式

Linux kernel 在kernel3.8中,当kernel_execve被删除时,如何将第一个用户进程切换到用户模式,linux-kernel,Linux Kernel,在内核3.8.x和更高版本中,run_init_进程的定义被更改 下面是内核3.8中run_init_进程的新定义 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

在内核3.8.x和更高版本中,run_init_进程的定义被更改

下面是内核3.8中run_init_进程的新定义

 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\u execve中最关键的部分是,它将从\u kernel\u execve调用ret\u,然后切换到用户模式


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

成功的
do_execv()
设置
当前的
进程来运行新程序(例如,via),然后返回0到
run_init_process()
,返回0到
kernel_init()
,也返回0,并被称为:

    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

这就是规则的来源:我们的
fn()
execve
之后返回了0,因此“线程将进入由该execve创建的用户环境”。

文章[(Al-Viro的新execve/kernel\u线程设计)这非常有帮助。主要的更改位于副本\u threadA more上。@artlessnoise:实际上,他只需要学会在URL周围使用
,而不是
[]
。。。