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

===============>>#1 票数:0

成功的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()的后返回0 execve ,所以“线程将继续进入由execve的创建用户态语境”。

  ask by hseagle translate from so

未解决问题?本站智能推荐: