问题1: 如何处理来自内核空间的陷阱?
处理步骤:
- 保存被打断内核线程的所有寄存器的值;
- 处理陷阱:设备中断或者异常;
- 返回到被陷阱打断的任何代码处;
调用链:
- 处理路径:
kernelvec->kerneltrap
; - 返回路径:
kerneltrap->kernelvec
;
问题2:如何处理设备中断?
- 见第5章;
问题3:如何处理异常?
- 调用
panic
,停止执行。
问题4:kernelvec
将寄存器的值保存到哪了?
- 被打断内核线程的栈上
问题5:如果发生了计时器中断,且某个进程的内核线程在执行(不是调度线程),会发生什么?
kerneltrap
会暂时放弃CPU,给其他线程一次执行的机会。
问题6:kernelvec
都做了哪些事?
处理陷阱:
- 保存所有寄存器的值;
- 调用
kerneltrap
;
从陷阱中返回:
- 从被打断内核线程栈中弹出所有寄存器的值;
- 执行
sret
,即拷贝sepc
的值到pc
中; - 恢复被打断代码的执行;
问题7:kerneltrap
都做了哪些事?
调用devintr
来检查陷阱。
- 如果是设备中断,则直接处理;
- 如果是异常,则调用
panic
,停止执行;
网友评论