1、SwapContext 有几个参数,分别是什么?
KiSwapContext 做的工作是保存旧线程的寄存器到自己的栈顶,更新 KPCR 里的 CurrentThread 属性,然后调用 SwapContext 函数切换线程,SwapContext 返回后就已经完成线程切换的工作了。
ebx: _KPCR
esi: 新线程 _ETHREAD
edi: 旧线程 _ETHREAD
2、SwapContext 在哪里实现了线程切换
3、线程切换的时候,会切换CR3吗?切换CR3的条件是什么?
会切换,如果是同一个进程,则不切换CR3,如果不是同一个进程则切换CR3
4、中断门提权时,CPU会从TSS得到ESP0和SS0,TSS中存储的一定是当前线程的ESP0和SS0吗?如何做到的?
ESP0永远是当前线程的ESP0,但是并没有存 SS0 的代码,因为所有线程的 SS0 的值是固定不变的,系统启动时已经填到 TSS 里,不需要在这里改了。
5、FS:[0]在3环指向TEB,但是线程有很多,FS:[0]指向的是哪个线程的TEB,如何做到的?
6、0环的 ExceptionList 在哪里备份的?
7. IdleThread是什么?什么时候执行?找到这个函数.
空闲线程,当 KiSwapThread 找不到新的就绪线程,就会切换到这个 IdleThread,观察下面的代码:
8、如何找到下一个就绪线程?
判断 _KPRCB.NextThread 里是否有值,如果有就直接切换到这个线程,如果没有,调用api找到就绪线程,如果还是没有就切换到空闲线程
参考:
滴水中级班-火哥-内核上-进程线程-5线程切换
https://blog.csdn.net/Kwansy/article/details/109677083