【问题标题】:Does functions in API make system calls themselves or system calls made by API are aided by system-call interface in the runtime support system?API中的函数自己进行系统调用还是API进行的系统调用由运行时支持系统中的系统调用接口辅助?
【发布时间】:2021-08-04 01:02:55
【问题描述】:

我正在阅读 Galvin 的恐龙书,遇到了问题中提出的困难。

通常应用程序开发人员根据应用程序编程接口 (API) 设计程序。 API 指定了一组可供应用程序员使用的函数,包括传递给每个函数的参数以及程序员可以预期的返回值。

文字补充说:

在幕后,构成 API 的函数通常代表应用程序程序员调用实际的系统调用。例如,Win32 函数CreateProcess()(不出所料用于创建新进程)实际上调用了 Windows 内核中的NTCreateProcess() 系统调用。

从以上两点我了解到:程序员使用API​​,对API的函数调用对应于他们想要进行的系统调用。 API 中的相关函数实际上进行了系统调用。

接下来的文字让我有点困惑:

大多数编程语言的运行时支持系统(编译器随附的库中内置的一组函数)提供了一个系统调用接口,该接口可作为系统调用的链接,由操作系统。 系统调用接口拦截 API 中的函数调用,并在操作系统中调用必要的系统调用。 通常,每个系统调用都关联一个数字,系统调用-call 接口维护一个根据这些数字索引的表。然后系统调用接口调用操作系统内核中的预期系统调用并返回系统调用的状态和任何返回值。

上面的摘录让我觉得API中的函数并没有直接进行系统调用。运行时支持系统的系统调用接口中可能有内置函数,正在等待API中函数的系统调用事件

以上是文中解释系统调用接口工作原理的示意图。

后面的文字解释了C标准库中系统调用的工作原理如下:

这很清楚。

【问题讨论】:

    标签: api operating-system system-calls


    【解决方案1】:

    我不完全理解您分享的摘录的术语。一些术语也是错误的,例如底部的蓝色图像。它说标准 C 库提供系统调用接口,而它没有。标准 C 库只是一个标准。这是一个约定。它只是说,如果你写了一段代码,那么这段代码在运行时的效果应该符合约定。它还说 C 库拦截 printf() 调用,而它没有。这是笼统的术语,充其量是令人困惑的。

    C 库不拦截调用。例如,在 Linux 上,C 标准库的开源实现是 glibc。你可以在这里浏览它的源代码:https://elixir.bootlin.com/glibc/latest/source。当您编写 C/C++ 代码时,您使用的是 C/C++ 约定中指定的标准函数。

    当您编写代码时,此代码将被编译为汇编,然后编译为机器代码。汇编也是机器代码的更高级别表示。它更接近实际代码,因为它比 C/C++ 更容易转换。最容易理解的情况是静态编译代码时。当您静态编译代码时,所有代码都包含在您的可执行文件中。例如,如果你写

    #include <stdio.h>
    int main() {
       printf("Hello, World!");
       return 0;
    }
    

    printf() 函数在 stdio.h 中调用,它是 gcc 提供的头文件,专门为一个操作系统或一组类 UNIX 操作系统编写。这个头文件提供了在 glibc 提供的其他 .c 文件中定义的原型。这些 .c 文件提供了 printf() 的实际实现。 printf() 函数将进行系统调用,该调用依赖于 Linux 等操作系统的存在来运行。静态编译时,代码全部包含到系统调用中。你可以在这里看到我的答案:Who sets the RIP register when you call the clone syscall?。它具体解释了如何进行系统调用。

    最后,您将获得诸如汇编代码之类的东西,将一些参数推入一些常规寄存器,然后是实际的 syscall 指令,它跳转到 MSR。我不完全理解 printf() 背后的机制,但它会跳转到 Linux 内核的 write 系统调用的实现,该系统调用将写入控制台并返回。

    我认为让您感到困惑的是,“运行时支持系统”可能指的是高级语言,它们不像 Python 或 Java 那样直接编译为机器代码。 Java 有一个虚拟机,它在运行时使用虚拟机将编译产生的字节码转换为机器码。在谈论不同的语言时不做这种区分可能会令人困惑。也许你的书缺少例子。

    【讨论】:

    • 感谢您的回答。实际上,正如您指出文本与实际概念之间的差异一样,这正是我遇到问题的地方。是的,这本书可能没有你说的例子。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2022-07-09
    相关资源
    最近更新 更多