Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修复 Kernel Stack 回收错误 #7

Merged
merged 2 commits into from
Mar 12, 2023
Merged

Conversation

jhdjames37
Copy link

@jhdjames37 jhdjames37 commented Mar 12, 2023

在完成 CH8 作业时,我遇到了以下问题:单独运行测例程序能够正常运行,但是运行 ch8b_usertestch8_usertest 时就有概率发生 kernel panic 报错,如下所示:

[kernel] Panicked at src/trap/mod.rs:143 a trap Exception(StorePageFault) from kernel!
[kernel] Panicked at src/task/processor.rs:119 called `Option::unwrap()` on a `None` value
[kernel] Panicked at src/task/processor.rs:119 called `Option::unwrap()` on a `None` value
[kernel] Panicked at src/task/processor.rs:119 called `Option::unwrap()` on a `None` value
...

经过检查,我发现 ch8 代码中有如下缺陷:

  1. 通过打印 sepc/stval 等寄存器的信息,我发现上面汇报 Page Fault 时的内存地址和触发代码为内核栈内的有效空间以及 trap_from_kernel() 函数。结合汇编代码我推断,由于 kernel trap handler 复用了当前正在使用的 kernel stack,因此当 stack 发生异常时将无法正常执行 trap handler。对此我修改了 kernel trap handler,在进入前修改 sp 至预留的内存空间中。
  2. 在修复上述问题后,我发现出错原因在于回收了当前正在使用的 kernel stack。进一步分析发现当线程退出 tid == 0 时 ,该进程会回收其所有线程的资源,也包括内核栈。从而在执行后续代码(包括回收 Kernel Stack 编号 以及后续的切换任务上下文)发生 PageFault。而这一错误之所以不会经常触发则可能是因为 TLB 中仍然保留内核栈的地址转换信息,因此在删除地址段后加入 sfence.vma 即可稳定触发这一 bug。
    因此,为了避免当前线程资源被回收,我在 TaskManager 中保留了一份当前线程的引用,以确保该线程资源不会被回收。(也许放在别的地方更好?欢迎老师助教指教)

另外,我在调试过程中还发现另外一些小问题:

  1. 在 CH6 之后,kernel 的编译不再依赖于用户态程序,因此 Makefile 中可以删除对应任务,节省编译时间。
  2. gdb 的运行命令并未更新至包含 fs 的版本。

@tkf2019 tkf2019 merged commit c500a81 into LearningOS:ch8-dev Mar 12, 2023
tkf2019 added a commit that referenced this pull request Mar 12, 2023
修复 Kernel Stack 回收错误
@kidcats
Copy link

kidcats commented Jul 26, 2023

大佬,你怎么做到这样debug的,是用dbg一行一行调试的吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants