[英]What is the difference between do_execve() and execve() in Linux?
在以下鏈接中,我有以下代碼:
static int run_init_process(const char *init_filename)
{
argv_init[0] = init_filename;
return do_execve(getname_kernel(init_filename),
(const char __user *const __user *)argv_init,
(const char __user *const __user *)envp_init);
}
它說:
在這里我們可以看到
kernel_init -> run_init_process -> do_execve
,這與常規的 execve 系統調用相同,參數是 init binary。
我試圖了解do_execve()
和execve()
之間的區別。 為什么不只使用execve()
?
用戶空間使用系統調用與 kernel 空間通信。 “空間”——用戶空間和內核空間——都可以被認為是使用寄存器和中斷相互通信的單獨程序。
execve()
是一個標准的 POSIX function由操作系統暴露給 C 程序。 它應該由您的標准庫實現來實現,很可能您使用glibc 。 在 Linux 上,大多數 POSIX 函數與系統調用的名稱匹配,因此 glibc 只是在系統調用周圍實現了一個瘦包裝器。
當從用戶空間程序調用系統調用時,參數保存在寄存器中並觸發中斷。 這將停止用戶空間程序的執行,並在 kernel 空間中繼續執行。
Kernel 從用戶空間寄存器中獲取參數並執行應該處理系統調用的 function。 大多數處理系統調用的函數只是在 kernel 中命名為do_<syscall>
。 function do_execve()
只是 kernel 用於處理來自用戶空間的execve()
系統調用的 function。
為什么不只使用 execve?
當您已經在 kernel 空間時,為什么還要調用系統調用? 只需調用 function 無論如何都會處理系統調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.