1.Lab-4 Traps

Backtrace

注意栈帧的结构就很简单

Alarm (hard)

sys_sigalarm

解决思路

  1. 保存时钟周期和handler地址

  2. 每次发生时钟中断时,计数一次,经过n个时钟周期,就调用handler函数

  3. 但是handler函数位于用户态

    1. 需要跳转到用户态执行handler
    2. 然后跳转回来继续执行

    解决方案是,保存当前trapframe,然后修改sepc,使其指向handler地址

    之后通过usertrapret跳转到handler

sys_sigreturn思路

正常情况下,时钟中断会发生什么?

  1. 进入usertrap的程序

  2. if(which_dev == 2)中,调用yield,跳转到其他线程

    然后调用usertrapret()返回用户态

我们和正常程序的区别是,本应执行yield和usertrapret,但我们调用了alarm函数,所以这里模拟原本的行为,首先恢复trapframe状态,然后调用yield和usertrapret

同时,alarm函数不能重入,因此添加一个字段alarm_running和对应的锁alarm_lock,当alarm函数已经在运行时,不会再次调用。

posted @ 2024-04-21 00:10  INnoVation-V2  阅读(29)  评论(0)    收藏  举报