在下面的链接中,我有以下代码:
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二进制。
我试图理解do_execve()和execve()之间的区别。为什么不直接使用execve()
发布于 2020-05-25 16:49:43
Userspace使用系统与内核空间通信。两个“空间”--用户空间和内核空间--都可以想到使用寄存器和中断相互通信的独立程序。
execve()是操作系统向C程序公开的标准POSIX函数。它应该由您的标准库实现来实现,很可能是使用滑翔。在Linux上,大多数POSIX函数都与syscalls的名称相匹配,所以glibc只是在syscall周围的实现薄包装。
当从用户空间程序调用syscall时,参数将保存在寄存器上,并触发中断。这将停止用户空间程序的执行,并且在内核空间中继续执行。
内核从用户空间寄存器中获取参数,并执行一个应该处理syscall的函数。大多数处理syscall的函数在内核中只是命名为do_<syscall>。函数do_execve()只是内核用来从用户空间处理execve() syscall的函数。
为什么不直接用execve呢?
当您已经处于内核空间时,为什么要调用系统调用?只需调用将处理系统调用的函数即可。
https://stackoverflow.com/questions/62006709
复制相似问题