中断、异常和系统调用


概念

  • 系统调用:应用程序主动向操作系统发出的服务请求
  • 异常:非法指令或其他原因导致当前指令执行失败(如:内存出错)后的处理请求
  • 中断:来自硬件设备的处理请求(比如:键盘输入数据,主存准备好CPU所需的数据)

源头

  • 中断:外设
  • 异常:应用程序意想不到的行为
  • 系统调用:应用程序请求操作系统提供服务

响应方式

  • 中断:异步
  • 异常:同步
  • 系统调用:同步或异步

处理机制

  • 中断:持续,对用户应用程序是透明的
  • 异常:杀死或重新执行意想不到的应用程序指令
  • 系统调用:等待和持续

硬件处理

  • 在CPU初始化时设置中断使能标志,有了使能标志,CPU才会对中断进行处理
  • 依据内部或外部事件设置中断标志
  • 依据中断向量调用响应的中断服务例程

这里的中断相当于前面的中断、异常和系统调用的总称

软件处理

  • 现场保存(编译器)
  • 中断服务处理(服务例程)
  • 中断标志清除(服务例程)
  • 现场恢复(编译器)

中断嵌套

1.硬件中断服务例程可能被打断

  • 在处理硬件中断过程出可能出现新的不同硬件中断源
  • 硬件中断服务例程需要临时禁止中断请求
  • 中断请求会保持到CPU做出响应

2.异常服务例程可能被打断

异常服务例程执行时可能出现硬件中断,此时要先处理硬件中断

3.异常服务例程可嵌套

在异常服务例程执行中可能出现新的异常,此时允许异常嵌套

系统调用

概念

  • 操作系统服务的编程接口
  • 通常由高级语言编写(C或C++)
  • 程序访问通常通过更高层次的API接口而不是直接进行系统调用

三种最常用的应用程序编程接口(API):

  • Win 32 API 用于Windows
  • Posix API 用于POSIX-based system(包括unix,linux和mac os x)
  • Java API 用于Java虚拟机

系统调用的实现

  • 每个系统调用对应一个系统调用号,系统调用接口通过系统调用号维护表的索引
  • 系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
  • 用户不需要知道系统调用的实现,需要设置调用参数和获取返回结果,操作系统接口的细节大部分都隐藏在应用编程接口之后,通过运行程序支持的库来管理

系统调用和函数调用的不同之处

  • INT和IRET指令用于系统调用,系统调用时,会发生堆栈切换和特权级的转换
  • CALL和RET用于常规函数调用,常规调用没有堆栈切换

系统调用比函数调用更加安全,但相应的开销会更大,会有内核态和用户态之间的转换。

中断、异常和系统调用的开销

  • 用户态到内核态切换的引导机制(硬件)
  • 建立内核堆栈
  • 验证传递参数的合法性
  • 内核态映射到用户态的地址空间(可能会用到内核态的信息),更新页面映射权限
  • 内核态独立的地址空间

文章作者: likai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 likai !
评论
  目录