簡體   English   中英

Linux 中的 do_execve() 和 execve() 有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM