1.Lab-4 Traps
Backtrace
注意栈帧的结构就很简单
Alarm (hard)
sys_sigalarm
解决思路
-
保存时钟周期和handler地址
-
每次发生时钟中断时,计数一次,经过n个时钟周期,就调用handler函数
-
但是handler函数位于用户态
- 需要跳转到用户态执行handler
- 然后跳转回来继续执行
解决方案是,保存当前trapframe,然后修改sepc,使其指向handler地址
之后通过usertrapret跳转到handler
sys_sigreturn思路
正常情况下,时钟中断会发生什么?
-
进入usertrap的程序
-
在
if(which_dev == 2)中,调用yield,跳转到其他线程然后调用
usertrapret()返回用户态
我们和正常程序的区别是,本应执行yield和usertrapret,但我们调用了alarm函数,所以这里模拟原本的行为,首先恢复trapframe状态,然后调用yield和usertrapret
同时,alarm函数不能重入,因此添加一个字段alarm_running和对应的锁alarm_lock,当alarm函数已经在运行时,不会再次调用。

浙公网安备 33010602011771号