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