Lab4

RISC-V assembly

li a2, ARCHI_FC_CID//将ARCHI_FC_CID的低6位取出写入到a2中

sd : 存储指令

1.
(1)s0
(2)a2
2.
li a1,12 函数内联
3.
0x630
4.
0x630
5.
HE110 World
i改为0x726c6400,still 57616
6.
y的结果取决于之前a2中保存的数据

Backtrace(moderate)

  • 注意返回地址位于栈帧帧指针(fp)的固定偏移(-8)位置,并且保存的帧指针位于帧指针的固定偏移(-16)位置

  • XV6在内核中以页面对齐的地址为每个栈分配一个页面。你可以通过PGROUNDDOWN(fp)PGROUNDUP(fp)(参见*kernel/riscv.h*)来计算栈页面的顶部和底部地址。这些数字对于backtrace终止循环是有帮助的。

Alarm(Hard)

添加系统调用参照Hint2或者lab2.

在 proc.h中添加:

因为在ecall指令中,PC(程序计数器)会保存到SEPC寄存器中,通过usertrap:p->trapframe->epc = r_sepc(); 可以看到 spec 寄存器的值存在 epc中。

修改usertrap() : 这里将 epc的值保存为在sys_sigalarm中取到的第二个参数,也就是处理函数的地址。因为后续要将epc的值重新存入spec寄存器,而这里会覆盖掉函数的返回地址,所以会导致出错。

在sysproc.c 中添加:

在allocproc()添加:

在freeproc() 添加:

Last updated