操作系统原理:中断,异常,系统调用

系统调用(system call):为应用程序请求操作提供服务。可异步和同步,对于返回值,同步会等待值返回再执行下一步,异步发出系统调用请求后,紧接着就会执行下一步操作。

异常 (Exception): 应用程序产生的,在执行过程中发生非法的指令,破坏其他程序的处理状态。异常是同步的

中断 (interrupt;): 来源于外设,是异步的,外设不清楚什么时候中断会发生。中断时持续的。

 

 

当发生中断时,硬件和软件需要分别做一些事情

对于硬件来讲,发生中断时要设置中断标记,当CPU知道了外设产生了中断标记,根据中断标记CPU可以得出产出一个中断号,将中断号发送给操作系统后,由操作系统找到对应的处理例程。

对于软件来讲(操作系统),当发生中断时,需要保存中断时的处理状态。当接收到中断号时,根据中断号找到中断处理例程的地址,跳转到该地址执行,中断处理例程处理完之后会清除中断标记,之后将原先中断前的状态进行恢复继续处理。

 

当一个些指令触发了异常事件时

操作系统会获得到产生异常指令的地址和寄存器内容,之后对异常进一步的处理,处理方式通常由两种,一种是结束应用程序的执行,另一种是跳转到异常处理指令,恢复寄存器等内容并执行处理指令。

 

系统调用来源于应用程序,应用程序需要操作系统提供一些服务,例如C语言中的print方法,打印字符串到控制台,底层调用了操作系统的write接口,需要传入需要写入的外设,和需要写入的内容这两个参数。

 

为了更方便地使用接口,在系统调用基础上建立了更高层次的API接口来供程序访问。例如 WIN32 API   ,POSIX API , JAVA  API 等。

 

 

系统调用的实现思路:

通常应用程序调用API来间接访问系统调用接口。当调用系统调用时会触发从用户态到内核态的转换。所谓用户态就是应用程序在执行过程中CPU所处于的一个特权级的状态,此特权级较低,在用户态状态下时没有权利直接访问操作系统的内核数据结构、机器指令、IO等。而内核态可以。操作系统通过特权级来保证访问安全。

实现特权级的切换后即从CPU的使用权从应用程序切换到操作系统上。通过对系统调用的识别来完成具体的服务。除了特权级切换。还需要堆栈的切换,应为操作系统并不和应用程序共用相同的堆栈空间。

 

 

跨越操作系统边界的开销是要比程序调用的开销要大,因为

操作系统需要建立 中断/异常/系统调用 号 与服务例程的映射关系和初始化工作,还需要建立内核堆栈。由于操作系统并不信任应用程序,所以还需要对来自上级程序的输入进行检查。内核态需要建立独立的内存空间,当处理完某些数据时操作需要把内核态的内存数据拷贝到用户态的内存空间中,此拷贝是深拷贝。

 

おすすめ

転載: blog.csdn.net/superSmart_Dong/article/details/115803118