Skip to content

Lab: traps

RISC-V assembly (easy)

理解代码,多和 LLM 沟通。

Backtrace (moderate)

首先要理解实验的要求,当实验进行函数调用时,打印出对应的地址,要求中给了一个获取当前地址的函数,按照要求实现调用等功能。
获取到 fp 的地址之后,通过 fp 和 kernel/riscv.h 里的宏获取一下栈的高位和地位,然后就是一个类似于遍历链表的算法,判断是否有效,有效则打印,继续,无效则跳出。

这个实验还是比较简单的。

Alarm (hard)

这个实验和 trap 有关, trap 实际上就是进入内核态的入口。这个实验的就是为了实现一个进程内异步的功能,类似于定时任务。当进程调用 sigalarm(ticks, handler) 时,操作系统跳 ticks 次 tick 时,会执行一次 handler。

先按照题目做一些固定的内容,为 proc 内的数据做初始化,在 sigalarm() 中进行赋值,这时 test1 pass 了。根据提示,备份一下 trapframe 就可以了,重点在于备份的时间点,需要在 handler 执行前备份,然后在 sigreturn() 中恢复原本的 trapframe ,这样 test2 就能 pass 了。最后的提示说了需要添加一个防止重入,添加一个是否在 alarm 中的字段,在进入 alarm 前判断一下,在 sigreturn 中恢复一下,就可以了。

这个实验的难点在于理解题目的用意,以及 trap 的是做什么用的。