API中的函数自己进行系统调用,还是API进行的系统调用由运行时支持系统中的系统调用接口辅助?

API中的函数自己进行系统调用,还是API进行的系统调用由运行时支持系统中的系统调用接口辅助?,api,operating-system,system-calls,Api,Operating System,System Calls,我正在翻阅加尔文的《恐龙》一书,在书中我遇到了问题中提到的困难 通常,应用程序开发人员根据应用程序编程接口(API)设计程序。API指定了应用程序程序员可以使用的一组函数,包括传递给每个函数的参数以及程序员可以期望的返回值 案文补充说: 在幕后,组成API的函数通常代表应用程序程序员调用实际的系统调用。例如,Win32函数CreateProcess()(用于创建新进程)实际上调用了Windows内核中的NTCreateProcess()系统调用 从以上两点我了解到:程序员使用API,根据他们想要

我正在翻阅加尔文的《恐龙》一书,在书中我遇到了问题中提到的困难

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

案文补充说:

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

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

接下来,课文所说的让我有点困惑:

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

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

上面是文本中的一个图表,解释了系统调用接口的工作

下文解释了C标准库中系统调用的工作原理,如下所示:


这很清楚。

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

C库不拦截调用。例如,在Linux上,C标准库的开源实现是glibc。您可以在此处浏览其源代码:。编写C/C++代码时,使用C/C++约定中指定的标准函数

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

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
#包括
int main(){
printf(“你好,世界!”);
返回0;
}
printf()函数在stdio.h中调用,stdio.h是gcc提供的头文件,专门为一个操作系统或一组类似UNIX的操作系统编写。此标题提供了在glibc提供的其他.c文件中定义的原型。这些.c文件提供printf()的实际实现。printf()函数将进行系统调用,该调用依赖于Linux等操作系统的存在来运行。当您静态编译时,所有代码都包含在系统调用中。你可以在这里看到我的答案:。它具体说明了如何进行系统调用

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


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

谢谢你的回答。事实上,正如你指出的文本和真实概念之间的差异,这正是我遇到的问题所在。是的,这本书可能没有你所说的例子。