首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux中,do_execve()和execve()有什么区别?

在Linux中,do_execve()和execve()有什么区别?
EN

Stack Overflow用户
提问于 2020-05-25 16:30:54
回答 1查看 1.2K关注 0票数 1

在下面的链接中,我有以下代码:

代码语言:javascript
复制
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()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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呢?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62006709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档