系统调用(system call)提供了操作系统所提供的有效服务接口。

一般应用程序开发人员根据应用程序接口(即API)来设计程序,API是一些列适用于应用程序员的函数,它有参数和返回值。

有三种应用程序员常用的API:

  • Windows系统的win32 API
  • 适用于POSIX系统的POSIX API(包括几乎所有的UNIX,Linux)
  • Java虚拟机程序的Java API

在后台,组成API的函数通常为应用程序员调用实际的系统调用。例如,win32函数CreateProcess()(用于生成一个新的进程)实际上调用了windows内核的NTCreateProcess()这个系统调用。

为什么应用程序员更偏向于API而不是系统调用呢?因为API是通用的,可以跨越机器。

处理系统调用的另一个重要因素是运行时环境(RTE)—— 即提供使用给定编程语言所编写的应用程序执行所需的套件,包括编译器或者解释器以及其他软件,像库以及装载器。RTE提供了一个系统调用接口(system-call interface),作为操作系统所提供的可用的系统调用的链接。系统调用接口拦截API中的函数调用,并在操作系统中调用必要的系统调用。通常,一个数字与每个系统调用相关联,系统调用接口根据这些数字维护一个表的索引。然后,系统调用接口在操作系统内核中调用预期的系统调用,并返回系统调用的状态。

调用者不需要知道系统调用是如何实现的,也不需要知道它在执行期间做什么。相反,调用者只需要遵守API并了解操作系统在执行该系统调用后将做什么。因此,操作系统接口的大部分细节由API向程序员隐藏,并由RTE管理。API、系统调用接口和操作系统之间的关系如图2.6所示,说明操作系统如何处理调用open()系统调用的用户应用程序。

图2-6

面向API编程的好处:

  • 可移植性
  • 简单:实际的系统调用更为注重细节,且困难,而且一般一个API底层,封装了很多的系统调用,这种封装解放了程序员,并体改了编程的效率
  • 如下是第七版的,上面是第十版的

绝大多数程序设计语言的运行时支持系统(即与编译器一起预先构造的函数库)提供了系统调用接口,作为应用程序与操作系统之间的系统调用的链接。

系统调用接口(SCI)截取API的函数调用,并调用操作系统中相应的系统调用。

通常每个系统调用都有一个与其相关的数字,系统调用接口用根据这些数字,维护一个列表索引。然后,系统调用接口来调用所需要的操作系统内核中的系统调用,并返回系统调用的状态和返回值。

API、系统调用接口和操作系统的关系如图,下图展示了操作系统如何处理一个调用open()系统调用的用户应用:

向操作系统传递参数共有三种方法:

  • 通过寄存器传递参数。
  • 但是,参数数量会比寄存器多,这时候参数通常存在内存的块和表中,并将块的地址通过寄存器来传递,见图2.4。Linux和Solaris就可以采用这种方法
  • 参数也可以通过程序存储或者压入堆栈中,并通过操作系统弹出。

有的操作系统采用块(即第二种)或堆栈方法(第三种),因为这些方法并不限制所传递的参数的数量或者长度

results matching ""

    No results matching ""