Linux中的do_execve()和execve()有什么区别?

Linux中的do_execve()和execve()有什么区别?,c,linux,linux-kernel,execve,C,Linux,Linux Kernel,Execve,在以下代码中,我有以下代码: 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 __us

在以下代码中,我有以下代码:

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\u init->run\u init\u process->do\u execve
,这与常规execve系统调用相同,参数是init binary


我试图理解
do\u execve()
execve()
之间的区别。为什么不直接使用
execve()

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

execve()。它应该由您的标准库实现来实现,很可能是您使用的。在Linux上,大多数POSIX函数都与系统调用的名称匹配,因此glibc只与系统调用匹配

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

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

为什么不直接使用execve呢


既然已经在内核空间中,为什么还要调用系统调用呢?只需调用将处理系统调用的函数。

这只是一个函数……谢谢!理论上,如果我将
execve
替换为
do\u execve
,它会工作吗?或者内核不允许使用此函数?内核中没有
execve
函数来区分内核和用户空间。