2 回复
杨振炜(助教)
🔖︎ 11 订阅
👍︎ 11 点赞
TL;DR
你需要将 kern/env.c
文件中 env_run
函数的末尾修改为:
1 | - env_pop_tf(&curenv->env_tf, curenv->env_asid); |
原因剖析
考察原代码以下调用链:
1 | schedule(yield) |
不难发现,被方括号标记的参数和寄存器都指向进程控制块内部的地址。在进入
do_signal
时,sp
寄存器指向
curenv
中的某个地址,而从 do_signal
开始就将
sp
及以下的区域当成栈使用了。进程控制块里也就会出现栈上的非预期值了。
解决这个问题也很简单:在向 env_pop_tf
传参时不使用进程控制块的地址就可以了。可以将
curenv->env_tf
复制到当前的栈上,再传入栈上的地址,此即是上文中给出的修改方式。
Thinking
为什么不能将 curenv->env_tf
复制到
(struct Trapframe *)KSTACKTOP - 1
?
CC BY-SA 4.0
创建于:
最后修改于:
最后回复于:
最后修改于:
最后回复于:
回复主题帖
Roisy
👍︎ 0 点赞
神!!!
自己debug的时候真的没往这个方向考虑过……
(啊啊啊为什么我现在才看到这条,直接55->100了
CC BY-NC 4.0
创建于:2024-06-21 21:46:32
最后修改于:2024-06-21 21:46:32
最后修改于:2024-06-21 21:46:32
回复主题帖
张昀祥
👍︎ 0 点赞
神!
压哨冲刺100全靠您🧎♂️🧎♂️🧎♂️
CC0 1.0
创建于:2024-06-26 22:28:52
最后修改于:2024-06-26 22:28:52
最后修改于:2024-06-26 22:28:52