参考: 中国科学院大学 2025年秋《高级操作系统教程》课件
中断 Interrupt
中断控制器
不同 ISA 采用的中断控制器不同:
- x86:
- ARM:
- RISC-V: PLIC(Platform-level Interrupt Controller)
中断控制器需要考虑的问题:
- 如何指定不同中断的优先级
- 低优先级中断处理中,出现了高优先级的中断
- 嵌套中断
- 中断交给谁处理
- 如何与软件协同
中断控制器的主要功能:将中断分发给不同的核(对称或非对称)进行处理
- 分发:管理所有中断、 决定优先级、路由
- CPU接口:给每个CPU核有对应的接口
中断处理
- 中断处理没有进程上下文
- 中断(和异常相比)和具体的某条指令无关
- 和中断时正在跑的进程、用户程序无关
- 中断处理程序不能睡眠
- 不能调用schedule()调度
- 不能释放信号或调用可能睡眠的操作
- 不能和用户地址空间交换数据
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
- 传统:陷入内核态,内核处理之后再返回用户态
- 频繁的用户态和内核态的切换 (性能较差)
- Virtual Dynamic Shared Object, VDSO
- 目前主要应用于一些调用比较频繁的系统调用,如
gettimeofday() - VDSO 由内核定义,编译时作为内核的一部分:
linux-vdso.so.1 - 用户态运行时将 gettimeofday 的代码加载到与应用共享的内存页 vDSO ,用户态对于该页只读,只有内核态才可以修改
- 目前主要应用于一些调用比较频繁的系统调用,如
- 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 中系统调用的返回值
- 提出一种新的 syscall 机制: 引入 system call page ,由 user & kernel 共享
- 消息式系统调用: 类似于微内核中的 IPC
- GenterOS
- XOS