是否有一个系统调用函数的定义调用了另一个系统调用函数?

Tim*_*Tim 4 c linux system-calls

在Linux中,是否有一个系统调用函数的定义调用了另一个系统调用函数?

或者所有系统调用函数是否都彼​​此互斥,因为任何系统调用函数都不调用另一个系统调用函数?

或者从上述意义上来说,系统调用函数大多是互斥的?

谢谢。

Nom*_*mal 5

作为一个例子,我们来看看 C 函数write()在 Linux 中是如何实现的。

C 库的实现本质上是:

ssize_t write(int fd, const void *buf, size_t count)
{
    long retval;

    retval = syscall(__NR_write, fd, buf, count);
    if (retval < 0) {
        errno = -retval;
        return -1;
    } else
        return retval;
}
Run Code Online (Sandbox Code Playgroud)

syscall()功能特定于每个硬件架构、操作系统和内核。通常用汇编语言编写。它将参数加载到特定寄存器(根据使用的内核调用约定),并调用内核。

此时,安全边界被跨越,执行转移到内核空间。

内核中的系统write()调用实现本身使用调用进程的文件描述表来查找特定于该文件或套接字的一组文件操作;确切的代码路径取决于文件描述符是文件(在这种情况下是它所在的文件系统)、管道、套接字、字符设备还是块设备。

几乎所有系统调用都会返回一个非负值表示成功,并返回一个负 errno 代码表示错误。

在 Linux 内核中,系统调用实现调用另一个实现系统调用的函数的情况很少见。相反,公共部分被分解为两个系统调用实现函数调用的内核内部函数。这使得维护更加容易。

如果我们看看 Linux 内核如何实现faccessat()access()系统调用,我们会发现两者都只是调用内核内部函数do_faccessat()