一、系统调用
操作系统是从硬件抽象出来的平台,在该平台上用户可以运行应用程序。它负责直接与硬件交互,向用户程序提供公共服务,并使他们同硬件特性相隔离。计算机要运行Linux系统,至少需要提供两种运行模式:高优先级的核心模式和低优先级的用户模式。 实际上许多计算机都有两种以上的运行模式。如Intel 80x86 体系架构就又四层执行执行特权,内层特权最高。Linux只需要两层即可:核心运行在高优先级,其他软件如shell、文本编辑器、x-window等都运行在低优先级。采取不同的执行模式的目的是为了保护操作系统。由于用户进程在较低的特权级别上运行,他们将不会意外或故意地破坏其他进程或内核,因为每一个进程在系统上运行是都拥有自己的私有地址空间和数据,除非进程与进程之间有特殊的关联。因此,进程造成的破坏会被局部化而不会影响到其他的活动或者进程。当用户进程需要完成在特权模式下才能完成的某些工作的时候,必须严格按照系统向上提供的系统调用接口才能进入特权模式,然后执行调用所提供的有限功能。
在Linux中,为了更好的保护内核,将程序的运行空间分为内核空间和用户空间(即内核态和用户态),他们分别运行在不同的级别上,逻辑上是相互隔离的。因此,用户进程在通常情况下是不允许访问内核数据的,它也就无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。而系统调用正是操作系统向用户程序提供支持的接口,通过这些接口应用程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序。
Linux 系统调用部分是非常精简的系统调用(大概280个),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、系统控制、存储管理、网络管理、socket控制、用户管理等。
二、应用程序编程接口
系统调用并不直接和程序员打交道,它仅仅是一个通过软中断机制向内核提交请求以获取内核服务的接口。系统调用接口看起来和C程序中的普通函数调用很相似,它们通常是通过库吧这些函数调用映射成进入操作系统所需要的操作。这些操作只是提供一个基本功能集,而通过库对这些操作进行引用和封装,可以形成丰富而强大的系统调用库。这里提现了机制与策略相分离的编程思想——系统调用只是提供访问核心的基本机制,而策略通过系统调用库来体现。所以,实际使用中程序员调用的通常是用户编程接口——API。
例如,获取进程号的API函数getpid()对应getpid系统调用。但是并不是所有的函数都对应一个系统调用,有时,一个API函数会需要几个系统调用来实现一个函数的功能,甚至还有一些API函数不需要调用相应的系统调用(因此它所完成的不是内核提供的服务)。
在Linux中,API遵循了在UNIX中最流行的应用编程界面标准——POSIX标准。POSIX 标准是由IEEE和ISO/IEC 共同开发的标准系统。该标准基于当时现有的UNIX 实践和经验,描述了操作系统的系统调用编程接口(即API),用于保证应用程序可以再源代码一级多种操作系统上移植运行,这些系统调用编程接口主要是通过 C 库(libc)
实现的。
大致图例:
阅读(2790) | 评论(0) | 转发(0) |