一:背景
1. 讲故事
总会有一些朋友问一个问题,在 Windows 中线程做了上下文切换,请问被切的线程他的寄存器上下文都去了哪里?能不能给我挖出来?这个问题其实比较底层,如果对操作系统没有个体系层面的理解以及做过源码分析,其实很难说明白,这篇我们就从.NET高级调试的角度试着分析一下吧。
二:寄存器上下文去哪了
1. 用户线程的两态空间
用C#代码创建的线程在操作系统层面上来说属于 用户态线程,这种线程拥有两个线程栈,哈哈,是不是打破了一些朋友的三观。分别为 用户态栈 和 内核态栈。
为了方便讲解,写一段简单的测试代码,不断的调用 Sleep(1) 让代码在用户态和内核态不断的切换,也就能观察得到这两套栈空间,参考代码如下:
static void Main(string[] args)
{
for (int i = 0; i < int.MaxValue; i++)
{
Thread.Sleep(1);
Console.WriteLine($"i={i}");
}
}
将程序跑起来后我们用 windbg
订阅专栏 解锁全文
662

被折叠的 条评论
为什么被折叠?



