文章目录
  1. 基本概念与原理
  2. 中断处理机制
    1. 设置CPU可响应中断
    2. 建立中断服务例程
    3. 保存现场&恢复现场
  3. 系统调用

基本概念与原理

 

系统调用:应用程序主动向操作系统发出的服务请求;异步响应。

异常:非法指令或其他原因导致当前指令执行失败,(如内存出错)后的处理请求;同步响应。

中断:来自硬件设备(外设,device)的处理请求。好处:避免CPU不停地去查询外设的状态,提高CPU的运行效率;异步或同步响应。

中断处理机制

  • 建立中断服务例程;
  • 设置控制寄存器状态使CPU能够响应中断;
  • 处理中断;
  • 保存与恢复现场;

设置CPU可响应中断

  • sstaus(硬件):保存全局中断使能位;
  • sie(硬件):指出CPU目前能处理或忽略的中断;
  • stvec(硬件):中断入口地址;

初始化如下:

  • 设置sie的TI使能STIE位;
  • 设置sstaus的使能中断SIE位;
  • 实现中断服务总控函数并设置stvec指向该函数的地址;

建立中断服务例程

  • 初始化
  • 服务例程

保存现场&恢复现场

在调用中断服务例程之前,需要保存被中断的应用程序的上下文(也就是所有的寄存器),具体来说,有如下寄存器:

  • x[0-31]:通用寄存器;
  • sstatus:系统状态寄存器;
  • 以及寄存器sepc、scause、stval;

产生中断后,硬件设置如下:

  • sepc设置为产生中断后指令的地址;
  • pc设置为stvec(总控中断服务程序的地址);
  • scause设置为中断的来源;
  • sstatus的SIE位置0以禁用中断;
  • stval保存中断相关的附加信息;

系统调用

 

  • ecall指令与sret指令用于系统调用;
  • 系统调用存在着堆栈切换与特权级的切换,参数验证(内核无法信任应用程序)以及可能的切换页表、拷贝数据操作;

具体流程

  • 应用发起请求;
  • 函数库发出系统调用请求(设置系统调用号,再执行ecall指令);
  • 保存被中断的应用程序的上下文;
  • 硬件设置:
    • sepc:保存请求后的指令地址;
    • pc设置为stvec(总控中断服务程序的地址);
    • scause设置为ecall from u-mode;
    • sstatus:SIE位置0以禁用中断;
    • stval保存中断相关的附加信息;
  • 调用中断服务例程;
  • 恢复被中断的应用程序的上下文;
  • 应用继续执行;