讨论记录 2021.7.5 #
参与成员:向勇、陈渝、贺鲲鹏、尤予阳
中断的设计原则 #
向勇:
- 中断会在当前指令执行结束后进行检查,并尽早响应;
- 每个中断包含特权级、类型、源和目的信息;时钟既是中断类别也是中断源,外部中断的中断源为某个外设,目的为某个进程(或地址空间);软件中断的源和目的为某个核或某个进程;
讨论成员对此达成共识。
中断的响应 #
向勇:
- 运行在低特权级,产生高特权级的中断: 根据规范,高特权级的中断不能在低特权级响应,硬件切换到高特权级处理;
- 产生一个和当前特权级相同,且目标地址空间等于当前地址空间的中断:
- 硬件:当前指令结束时,检查是否有中断;有中断时,硬件判断中断源,确定中断的特权级;硬件保存现场;硬件修改特权级;
- 软件:保存现场,响应中断,修改特权级,恢复现场;
- 产生一个和当前特权级相同,但目标地址空间不等于当前地址空间的中断: 切换到更高特权级(通常是内核)进行处理;
- 运行在高特权级,产生低特权级的中断:
- 硬件:当前指令结束时,检查是否有中断;有中断时,硬件判断中断源,确定中断的特权级;硬件保存现场;(不修改特权级)
- 软件:保存现场,在当前特权级对低特权级的数据结构中保存中断请求信息;恢复现场;当 CPU 进入相应的低特权级时,先响应中断,再进行原约定功能;
讨论成员对前三点达成一致,对第四点存在分歧:
- 向勇与贺鲲鹏:应当允许高特权级进行处理,保存中断信息,否则如果推迟到一个调度周期后,可能中断信息已经丢失或失去价值;
- 陈渝:低特权级的中断不应打断高特权级执行;类比网络丢包,中断信息的丢失是正常的;上述设计太复杂;
- 尤予阳:规范中并没有要求 PLIC 产生什么特权级的中断,这是实现决定的;这种情况下完全可以产生一个高特权级的外部中断,而不是低特权级(硬件产生的时钟和软件中断都是 M 态的);
向勇:希望能够以用户态中断为基础实现不切换特权级、不切换地址空间的 IPC 机制,提高异步效率
“内核交换机” #
尤予阳和贺鲲鹏介绍了一种新的内核设计构想。
陈渝:时间比较紧迫,最好能够每个阶段有每个阶段的成果。
尤予阳:目前这个还处在初步设想阶段,并没有计划在短期内进一步完善或实现。
后续工作 #
- 查看 Rocket 的 CPU 实现代码,是否不响应低优先级的中断请求;(贺鲲鹏)
- 确认 PLIC 的中断是否有三条对应不同特权级的中断请求线;(尤予阳)
- 在 QEMU 和 rCore 上完成用户态中断和信号的优化;
- 最终的比较:Linux 与 rCore 的性能比较;为了更好的控制变量,可能需要在 Linux 中适配用户态中断,与不使用的情况比较;