0%

操作系统:Interupt, Exception, Syscall

参考: 中国科学院大学 2025年秋《高级操作系统教程》课件

中断 Interrupt

中断控制器

不同 ISA 采用的中断控制器不同:

  • x86:
  • ARM:
  • RISC-V: PLIC(Platform-level Interrupt Controller)

中断控制器需要考虑的问题:

  1. 如何指定不同中断的优先级
    • 低优先级中断处理中,出现了高优先级的中断
    • 嵌套中断
  2. 中断交给谁处理
  3. 如何与软件协同

中断控制器的主要功能:将中断分发给不同的核(对称或非对称)进行处理

  • 分发:管理所有中断、 决定优先级、路由
  • CPU接口:给每个CPU核有对应的接口

中断处理

  1. 中断处理没有进程上下文
    • 中断(和异常相比)和具体的某条指令无关
    • 和中断时正在跑的进程、用户程序无关
  2. 中断处理程序不能睡眠
  3. 不能调用schedule()调度
  4. 不能释放信号或调用可能睡眠的操作
  5. 不能和用户地址空间交换数据

Linux 中断处理

  • 在中断处理中做尽量少的事
  • 推迟非关键行为
  • 结构:Top half & Bottom half
    • Top half: 做最少的工作后返回
    • Bottom half:推迟处理 (softirq, tasklets, 工作队列,内核线程)

Top Half

  • 包括最小的公共行为:
    • 保存寄存器, 屏蔽其他中断
    • 恢复寄存器, 返回原来场景
  • 最重要的任务:调用合适的由硬件驱动提供的中断处理 handler
    • 现代处理器中,多个 I/O 设备共享一个 IRQ 和中断向量
    • 多个 ISR (interrupt service routines) 可以结合在一个向量上
    • 调用每个设备对应该 IRQ 的 ISR
  • 因为中断被屏蔽,所以不要做太多事情(时间、空间)
  • 使用将请求放入队列 ,或者设置标志位将其他处理推迟到 bottom half

Bottom Half:延迟完成

  • 提供一些推迟完成任务的机制
    • softirqs
    • tasklets (建立在 softirqs 之上)
    • 工作队列
    • 内核线程
  • 这些工作可以被中断

系统调用 Syscall

  1. 传统:陷入内核态,内核处理之后再返回用户态
    • 频繁的用户态和内核态的切换 (性能较差)
  2. Virtual Dynamic Shared Object, VDSO
    • 目前主要应用于一些调用比较频繁的系统调用,如 gettimeofday()
    • VDSO 由内核定义,编译时作为内核的一部分: linux-vdso.so.1
    • 用户态运行时将 gettimeofday 的代码加载到与应用共享的内存页 vDSO ,用户态对于该页只读,只有内核态才可以修改
  3. FLEX-SC (Flexible System Call Scheduling with Exception-Less System Calls, OSDI’10)
    • 提出一种新的 syscall 机制: 引入 system call page ,由 user & kernel 共享
      • User threads 可以将系统调用的请求 push 到 system call page
      • kernel threads 会从system call page poll system call 请求
      • 将系统调用的调用和执行解耦,可分布到不同的 CPU 核
    • push: 将系统调用打包成固定的数据结构写入 syscall page
    • poll: 填充 syscall page 中系统调用的返回值
  4. 消息式系统调用: 类似于微内核中的 IPC
    • GenterOS
    • XOS