【问题标题】:What is the difference between do_execve() and execve() in Linux?Linux 中的 do_execve() 和 execve() 有什么区别?
【发布时间】:2020-05-25 16:30:54
【问题描述】:

在下面link我有以下代码:

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()

【问题讨论】:

  • 只是一个函数...

标签: c linux linux-kernel execve


【解决方案1】:

用户空间使用syscalls 与内核空间通信。 “空间”——用户空间和内核空间——都可以看作是使用寄存器和中断相互通信的独立程序。

execve() 是操作系统向 C 程序公开的standard POSIX function。它应该由您的标准库实现来实现,很可能您使用glibc。在 Linux 上,大多数 POSIX 函数都匹配系统调用的名称,因此 glibc 只是在系统调用周围使用 implements a thin wrapper

当从用户空间程序调用系统调用时,参数保存在寄存器中并触发中断。这将停止用户空间程序的执行,并在内核空间中继续执行。

内核从用户空间寄存器中获取参数并执行一个应该处理系统调用的函数。大多数处理系统调用的函数在内核中只是命名为do_<syscall>。函数do_execve() 只是内核用来处理来自用户空间的execve() 系统调用的函数。

为什么不只使用 execve?

当你已经在内核空间时为什么要调用系统调用?只需调用将处理系统调用的函数即可。

【讨论】:

  • 谢谢!理论上,如果我将execve 替换为do_execve,它会起作用吗?还是内核不允许使用这个功能?
  • 内核中没有execve函数,用来区分内核和用户空间。
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 2015-01-02
  • 2018-11-26
  • 2010-09-16
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多