rCore-Tutorial-Book-v3 icon indicating copy to clipboard operation
rCore-Tutorial-Book-v3 copied to clipboard

rCore-Tutorial-Book-v3/chapter8/1thread-kernel

Open utterances-bot opened this issue 3 years ago • 9 comments

内核态的线程管理 — rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档

https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter8/1thread-kernel.html

utterances-bot avatar May 25 '22 02:05 utterances-bot

在内核中,每个线程的执行状态和线程上下文等均保存在一个被称为 ~线程控制块 (PCB, Process Control Block)~ 线程控制块 (TCB, Task Control Block) 的结构中,它是内核对线程进行管理的核心数据结构。在内核看来,它就等价于一个线程。

jackcpku avatar May 25 '22 02:05 jackcpku

如果编译执行上述程序,可以看到在主线程创建了子线程后,讲调用 join() 函数等待子线程结束; (应该是将调用join()函数吧)位于小标题<通用操作系统多线程应用程序示例>

huanngod avatar Sep 26 '22 13:09 huanngod

带了的一个潜在不足是

带来的

讲调用 join() 函数等待子线程结束;

子线程 mythread 打印 arg 参数并返回 arg+ ;

arg+1

初始化位于该线程在用户态地址空间中的 Trap 上下文

初始化位于该线程 ~在~ 用户态地址空间中的 Trap 上下文

如果是主线程发出的退去请求

退出请求

longguzzz avatar Dec 12 '22 14:12 longguzzz

作者您好, 在阅读代码后有一点不清楚的地方, 希望向您请教:

exit_current_and_run_next 函数中主线程调用 process_inner.tasks.clear() 时也会 Drop 掉该 task 的 KernelSack, 随即在 KERNEL_SPACE.pagetableunmap 掉主线程的内核栈. 那么之后的代码 drop(process); let mut _unused = TaskContext::zero_init(); schedule(&mut _unused as *mut _); 对内核栈使用为什么不会出现 Page Fault 呢? 或者是现在主线程的内核栈并没有被回收调?

十分感谢!

dalekdalekdalek avatar Feb 21 '24 03:02 dalekdalekdalek

@dalekdalekdalek 这确实是个bug,加了一些打印之后可以发现,task.clear会导致当前正在使用的内核栈被unmap,后面的操作都属于UB了。可以手动加一条sfence.vma指令强制同步,就会卡死在这里了。

wyfcyx avatar Feb 21 '24 15:02 wyfcyx