操作系统与设备和程序交互
在操作系统正常运行之后,操作系统如何与设备和程序交互?
在这就就涉及到interface(接口)的设计问题。
操作系统的interface是什么呢?
在我们看来,操作系统的interface包含三个
- 中断(面向外设是通过中断和I/O来处理的)
- 系统调用和异常(面向应用程序是通过系统调用和异常来提供相应的功能)
我们需要对着三个interface有清晰的认识,才能够知道,操作系统如何通过中断来控制和管理外设,操作系统如何通过系统调用和异常来提供相应的服务和支持的。
定义
系统调用(来源于应用程序)
- 应用程序主动向操作系统发出服务请求
异常(来源于不良的应用程序)
- 非法指令或其他坏的处理状态(如:内存出错)
中断(来源于外设)
- 来自不同的硬件设备的计时器和网络中断
应用程序为什么不能够直接去访问外设呢?
- 在计算机运行中,内核是被信任的第三方
- 只有内核可以执行特权指令
- 为了方便应用程序
从安全的角度来考虑,应用程序访问外设是不被信任的也就是说假设允许应用程序访问外设安全性无法得到保障。而且计算机系统为了限制应用程序访问权限只能够访问被允许的地址空间,访问其他程序的地址空间会不安全,划分了不同的特权级。只有内核可以执行特权指令来访问外设。其三,应用程序不用考虑访问外设硬件琐碎的细节,可以交给操作系统来处理,极大的方便了应用程序。
我们希望操作系统能够给上层的应用提供一个更简单一致的接口,使得上层的软件不必关闭底层实现的细节,让应用程序可以写的通用可移植。
操作系统如何实现的
操作系统如何设计和实现中断、异常和系统调用?
那么中断、异常和系统调用有什么区别和特点呢?
源头
- 中断:外设(键盘、鼠标、网卡、声卡、显卡)
- 异常:应用程序意向不到的行为(应用程序在执行某种特殊代码)
- 系统调用:应用程序请求操作系统提供服务
处理时间
- 中断:异步
- 异常:同步
- 系统调用:异步和同步
中断我们可以称之为异步事件,那么什么是异步呢?事件产生后并不一定会产生中断。异常是同步事件,当发生某种异常事件是一定会出现异常(如除0指令,一定会产生异常)。系统调用可以分为同步和异步,同步是指当发生系统调用的指令时,同步就会发生系统调用,但是系统调用的返回可能是异步的。也就是说,系统调用可以立即返回,也可以让操作系统先去做其他的事情,交由内核处理。当处理完成后,发送信号通知应用程序事件完成的消息。
响应
- 中断:持续,对用户应用程序是透明的
- 异常:杀死或者重新执行意向不到的指令
- 系统调用:等待和持续
中断在应用程序执行的过程中时不时就会产生中断,中断是一个持续的过程,但是中断是由操作系统悄悄的完成的,应用程序并不会感知到。产生异常后,可能会产生严重的后果将应用程序杀死,或者重新执行。系统调用是一个等待和持续的过程,等待系统调用完成返回用户空间就会继续执行。