在内核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 消失了。我的问题是如何将第一个用户进程切换到用户模式。
答案 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>