在内核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); }
Run Code Online (Sandbox Code Playgroud)
与内核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); }
Run Code Online (Sandbox Code Playgroud)
kernel_execve中最关键的部分是它将调用ret_from_kernel_execve,然后将切换到用户模式.
在新定义中,kernel_execve消失了.我的问题是如何将第一个用户进程切换到用户模式.
成功do_execv()设置current进程运行新程序(例如via load_elf_binary()),然后返回0到run_init_process(),它返回0到kernel_init(),它也返回0,并作为以下部分调用:
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
Run Code Online (Sandbox Code Playgroud)
这就是https://lwn.net/Articles/520227/中的规则出现的地方:我们fn()在 后返回 0 execve,因此“线程将进入由该 execve 创建的用户空间上下文”。
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |