修复抢占式bug,记一次重大bug修复
起因:
1. entry.S的switch_to重写后不再用ret,而是mret(因为抢占式需要trap跳转)
2. 然而,sched.c的task_create()函数中,ctx_tasks[_top].ra = (reg_t) start_routin;该句子没有一起修改
解决方案:
ctx_tasks[_top].ra = (reg_t) start_routin; ——> ctx_tasks[_top].pc = (reg_t) start_routin;
解释:
ret
ret时,pc寄存器 会设置为 ra寄存器存的地址
mret
mret 将 PC 设置为 mepc的值
分析一个原子性上锁
loop:
lw a4,-20(s0) # s0里放的地址 加上-20 放入a4 (a4里最终还是地址)
li a5,1 # a5里写1
amoswap.w.aq a5,a5,(a4) # 把a4指向的内存里的值 与 a5 交换
mv a3,a5 a3复制寄存器a5
bnez a3,loop
优点:直接原子性的交换了1和锁的值,
然后再慢慢看锁的值。
如果值是1,继续2循环,否则直接走下去