操作系统的系统调用

2019-05-25 19:54:56 浏览数 (2)

首先,有一个概念叫做接口。抽象而言的接口是连接两个东西的中间物。接口的好处是屏蔽了连接起来的实际细节。我们只关心接口如何使用。

系统调用:操作系统的接口是连接应用软件与操作系统的中间桥梁。接口在程序设计中表现的形式就是:函数。操作系统提供的函数就被称为系统调用(system call)。这里有个标准POSIX(Portable Operating System Interface of UNIX,缩写为 POSIX ),它定义了操作系统应该为应用程序所提供的标准接口。Linux和Unix等系统遵守这个标准。

系统调用的实现:系统调用的存在给用户提供了接口,阻止了用户恶意访问操作系统的数据。系统调用也给用户访问内核提供了唯一的途径。计算机硬件的设计解决了这个问题的具体实现。它将内核程序和用户程序隔离。内核程序处于内核态,用户程序处于用户态。Intel的X86CPU使用CS寄存器的最低两位来表示:0是内核态,1和2是OS服务,3是用户态。我们把CS的最低的两位叫做CPL,它代表了当前程序的级别。DPL是调用目标段的代码级别。只有当

DPL>CPL时,才能访问。在系统初始化的时候,把操作系统相关的GDT表中的DPL设置为0,把用户态设置为3。

对于Intel X86而言,它进入内核的方式是中断指令int。因此进入内核的方式就是用户函数包含一段int指令的代码。这段代码将会导致操作系统中断,然后获取到想调用的程序的编号。OS根据这个编号来执行相应的代码。int这个指令将DPL更改为3,使得CPL == DPL。这样就进入了内核,然后将CPL设为0,等执行完后,在把CPL=3,返回用户态。系统调用实现的细节是这样的,它在代码中嵌入了一段汇编代码,这段代码中最重要的是int 0x80指令。这将会启动系统调用。当然我们还有系统调用号。 int指令在IDT表中查找系统调用的入口。这样就实现了系统调用。

0 人点赞