如果不是编程语言中的实现,那么“系统调用”是什么意思?

如果不是编程语言中的实现,那么“系统调用”是什么意思?

我想理解术语“系统调用”。我熟悉系统调用用于从用户空间应用程序获取内核服务。

我需要澄清的部分是“系统调用”和“系统调用的 C 实现”之间的区别。

这里有一句话让我很困惑:

在类 Unix 系统上,该 API 通常是 C 库 (libc) 实现的一部分,例如 glibc,它为系统调用提供包装函数,通常命名为与它们调用的系统调用相同的名称

什么是“他们调用的系统调用”?他们的来源在哪里?我可以将它们直接包含在我的代码中吗?

一般意义上的“系统调用”是否只是一个 POSIX 定义的接口,但要实际查看实现,可以检查 C 源代码并在其中查看实际的用户空间到内核的通信实际上是如何进行的?

背景说明:我试图了解每个 c 函数最终是否会与/dev.

答案1

系统调用本身是一个概念。它们代表进程可以要求内核执行的操作。

这些系统调用是在类 UNIX 系统的内核中实现的。这个实现(用 C 语言编写,小部分用 asm 编写)实际上在系统中执行操作。

然后,进程使用接口来请求系统执行系统调用。该接口由 POSIX 指定。这是C标准库的一组函数。它们实际上是包装器,它们可以执行一些检查,然后调用内核中特定于系统的函数,告诉它执行系统调用所需的操作。诀窍在于,那些作为接口的函数的命名与系统调用本身相同,并且通常直接称为“系统调用”。

您可以通过系统特定的机制直接调用内核中执行系统调用的函数。问题是它使你的代码绝对不可移植。

所以,系统调用是:

  • 一个概念,内核为向用户进程提供服务而执行的一系列操作
  • 您应该在代码中使用 C 标准库的函数来从内核获取此服务。

答案2

A系统调用是一种要求操作系统(内核)代表您的程序执行某些操作的方法,而该操作是程序本身无法完成的(或者只是不方便)。无法执行某些操作的原因通常是允许随机程序执行这些操作可能会损害系统的完整性,例如执行 I/O(直接对 RAM,覆盖任何内容)。

POSIX 为程序定义了一个接口,即程序可以调用的某些函数。其中一些或多或少直接转化为系统调用,另一些则需要更多的阐述。它是您的语言(例如 C 库)的运行时,负责提供 POSIX 接口、打包参数并将结果返回给调用者。

Unixy 系统或多或少直接以系统调用的形式提供 POSIX 接口。通常有一种方法可以直接调用系统调用,请查找syscall(2)有关如何在 Linux 中使用此功能的详细信息。

答案3

当然,让我们来看看“我们可以从多少个方向看这头大象?”事物。

在您构建的程序中,实际的系统调用是触发特权升级到内核模式的机器指令,而在内核本身中,它是指令调用的代码。 libc 代码(以及每个语言运行时)在内核代码期望找到它们的地方设置机器寄存器和存储参数,由于机器指令的限制,这些位置可能很奇怪。

一旦进入操作系统代码本身,就会对用户态运行时所做的特定于机器的东西进行一些镜像展开,然后进行完全普通的子例程调用。
如果您想确切地了解它在完整操作系统中的工作原理,请提取内核源代码 ( git clone https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/) 并执行例如git grep -i system\ call。拉取 glibc 源并执行同样的操作。

答案4

每个系统调用都有一个关联的整数。该整数是系统调用的返回值、系统调用的参数数量和参数类型的函数。这个系统调用号只不过是全局系统调用向量的偏移量,这个向量只能在特权模式下访问,包含指向适当处理程序的指针。在调用系统调用的过程中,将产生软件中断(陷阱中断),因此将运行陷阱处理程序来确定应调用哪个系统调用。然后内核会将用户传递的系统调用参数复制到处理器寄存器中,并在完成所请求的服务后,将数据从处理器寄存器复制回堆栈。这是系统调用参数有限的原因之一,因为参数将被复制到处理器寄存器中,而处理器的寄存器也有限。

相关内容