rCore-Tutorial-Book-v3
rCore-Tutorial-Book-v3 copied to clipboard
rCore-Tutorial-Book-v3/chapter8/1thread-kernel
内核态的线程管理 — rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter8/1thread-kernel.html
在内核中,每个线程的执行状态和线程上下文等均保存在一个被称为 ~线程控制块 (PCB, Process Control Block)~ 线程控制块 (TCB, Task Control Block) 的结构中,它是内核对线程进行管理的核心数据结构。在内核看来,它就等价于一个线程。
如果编译执行上述程序,可以看到在主线程创建了子线程后,讲调用 join() 函数等待子线程结束; (应该是将调用join()函数吧)位于小标题<通用操作系统多线程应用程序示例>
带了的一个潜在不足是
带来的
讲调用 join() 函数等待子线程结束;
将
子线程 mythread 打印 arg 参数并返回 arg+ ;
arg+1
初始化位于该线程在用户态地址空间中的 Trap 上下文
初始化位于该线程 ~在~ 用户态地址空间中的 Trap 上下文
如果是主线程发出的退去请求
退出请求
作者您好, 在阅读代码后有一点不清楚的地方, 希望向您请教:
在 exit_current_and_run_next 函数中主线程调用 process_inner.tasks.clear() 时也会 Drop 掉该 task 的 KernelSack, 随即在 KERNEL_SPACE.pagetable 中 unmap 掉主线程的内核栈. 那么之后的代码
drop(process); let mut _unused = TaskContext::zero_init(); schedule(&mut _unused as *mut _); 对内核栈使用为什么不会出现 Page Fault 呢? 或者是现在主线程的内核栈并没有被回收调?
十分感谢!
@dalekdalekdalek 这确实是个bug,加了一些打印之后可以发现,task.clear会导致当前正在使用的内核栈被unmap,后面的操作都属于UB了。可以手动加一条sfence.vma指令强制同步,就会卡死在这里了。