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