2013-04-16 21 views
11

在內核3.8.x及更高版本中,run_init_process的定義已更改。在內核3.8中,當kernel_execve被刪除時,第一個用戶進程如何切換到用戶模式

以下是kernel 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不見了。我的問題是,第一個用戶進程如何切換到用戶模式。

+8

文章[https://lwn.net/Articles/520227/](Al Viro的新execve/kernel_thread設計)非常有用。主要更改位於* copy_thread * – hseagle

+1

更多[當前URL](https://lwn.net/Articles/520227/)。 –

+1

@artlessnoise:實際上,他只需要學習在他的URL周圍使用'<>'而不是'[]'... – SamB

回答

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()execve後返回0,所以「線程將繼續進入由execve的創建用戶態語境」。

相關問題