我是操作系统的新手。我在理解系统调用接口时遇到了问题。如果你能帮忙,我将不胜感激。谢谢
发布于 2020-09-09 19:52:12
我已经尝试简单地解释了进行系统调用的整个过程。
内核为提供了一组接口,运行在用户空间的进程可以通过这些接口与系统交互。这些接口给应用程序提供了对硬件的受控访问,提供了一种创建新进程并与现有进程进行通信的机制,以及请求其他操作系统资源的能力。
这些API(应用程序编程接口)充当应用程序和内核之间的信使,应用程序发出各种请求,内核满足这些请求(或返回错误)。系统调用在硬件和用户空间进程之间提供了一个层。
但是系统调用和API不是一回事。API基本上是指定“如何获取特定服务”的函数定义。您通常不会直接进行系统调用,而是使用API。
每个系统调用都有一个对应的包装例程,它指定应用程序调用该系统调用时必须使用的。(包装器例程是函数定义,其唯一目的是发出系统调用)。然而,API不必对应于系统调用,API可以直接在用户模式中提供其服务,而无需进行任何系统调用,或者单个API函数可以进行几个不同的系统调用,因此不同的API函数可以调用相同的系统调用。
API定义了应用程序使用的一组编程接口。这些接口可以实现为系统调用,可以通过多个系统调用实现,也可以完全不使用系统调用来实现。相同的API可以存在于多个系统上,并为应用程序提供相同的接口,而API本身的实现在不同系统之间可以有很大差异。
从程序员的角度来看,b/w API和系统调用的区别是无关紧要的,对他们来说,它只是另一个函数调用,他/她所需要考虑的就是函数名、参数类型和返回值。从内核设计者的角度来看,这种区别显然是非常重要的。
此外,当用户模式进程调用系统调用时,CPU切换到内核模式,并开始执行称为系统调用处理程序的内核函数(恰好是汇编语言函数)。此系统调用处理程序具有与其他“异常处理程序”类似的结构。
此系统调用处理程序首先将寄存器的内容保存在内核模式堆栈中。然后,基于系统调用号(每个系统调用都有一个与之关联的号,用户模式进程必须将该号作为参数传递,以便可以识别所请求的调用),系统调用处理器调用相关的系统调用服务例程,它在Linux中恰好是一个C函数,它实际上继续实现用户进程所请求的功能。完成后,寄存器被加载回其先前的值,CPU切换回用户模式。

同样的流程也可以用不同的方式来表示。

发布于 2020-02-09 23:33:54
系统调用接口是一组用于从操作系统内核请求服务的函数,它们被执行时,on.It提供了进程和操作系统之间的基本接口。
例如:
open();是一个系统调用,用于提供对文件系统中的文件等的访问。
https://stackoverflow.com/questions/60136893
复制相似问题