【发布时间】:2020-05-24 23:22:42
【问题描述】:
我是操作系统主题的新手。而且我在理解系统调用接口方面遇到了麻烦。如果您能提供帮助,我将不胜感激。 谢谢
【问题讨论】:
标签: operating-system system-calls
我是操作系统主题的新手。而且我在理解系统调用接口方面遇到了麻烦。如果您能提供帮助,我将不胜感激。 谢谢
【问题讨论】:
标签: operating-system system-calls
我试图简单地解释进行系统调用的整个过程。
内核提供一组接口,运行在用户空间的进程可以通过这些接口与系统进行交互。这些接口为应用程序提供了对硬件的受控访问、一种创建新进程并与现有进程通信的机制,以及请求其他操作系统资源的能力。
这些 API(应用程序编程接口)充当应用程序和内核之间的信使,应用程序发出各种请求,内核完成它们(或返回错误)。 系统调用在硬件和用户空间进程之间提供了一层。
但是系统调用和 API 不是一回事。 API 基本上是指定“如何获得特定服务”的函数定义。 您通常不直接进行系统调用,而是使用 API。
每个系统调用都有一个对应的包装例程,它指定应用程序调用该系统调用时必须使用的 API。 (包装程序是函数定义,其唯一目的是发出系统调用)。 但是,一个 API 不一定要对应一个系统调用,一个 API 可以直接在用户模式下提供它的服务,而不需要进行任何系统调用,或者一个 API 函数可以进行多个不同的系统调用,更多的是不同的 API 函数可以调用相同的系统调用。
API 定义了一组应用程序使用的编程接口。这些接口可以作为一个系统调用来实现,也可以通过多个系统调用来实现,或者完全不使用系统调用来实现。相同的 API 可以存在于多个系统上,并为应用程序提供相同的接口,而 API 本身的实现可能因系统而异。
从程序员的角度来看,黑白 API 和系统调用的区别是无关紧要的,对他们来说,这只是另一个函数调用,他/她需要考虑的只是函数名、参数类型和返回值。从内核设计者的角度来看,这种区别显然是非常重要的。
此外,当用户模式进程调用系统调用时,CPU 切换到内核模式并开始执行称为系统调用处理程序的内核函数(恰好是汇编语言函数) >。此系统调用处理程序与其他“异常处理程序”的结构相似。
此系统调用处理程序首先将寄存器的内容保存在内核模式堆栈中。 然后根据系统调用编号(每个系统调用都有一个与之关联的编号,用户态进程必须将此编号作为参数传递,以便识别请求的调用) 系统调用处理程序调用相关的系统调用服务例程,它在 Linux 中恰好是一个 C 函数,实际上继续执行用户进程请求的功能。 完成后,寄存器被加载回它们之前的值,CPU 切换回用户模式。
【讨论】:
系统调用接口是一组函数,用于在执行它们的操作系统上向内核请求服务。它提供了进程和操作系统之间的基本接口。
例如:
open();
是一个系统调用,用于提供对文件系统中文件的访问等等。
【讨论】: