繁体   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