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
函数来区分内核和用户空间。