上下文切换期间会保存哪些架构状态?据我所知,保存的内容如下
包括 PC 计数器 TLB 在内的寄存器集(如果未刷新...)还有什么?内存?(包含堆栈、堆、数据)...?它只是留在内存中吗?
答案1
内存/堆栈堆是进程地址空间的一部分,因此无需保存它们。是的,它们可以留在那里。每个进程在物理内存中都有自己的起始地址。
从用户空间的角度来看,进程似乎正在使用从 0x00000000 开始的自己的全部内存范围(某些操作系统会在第一页 0x00000000-0x00000fff 中捕获访问以捕获空指针? - 对于这些,有效起始位置为 0x00001000)但是,MMU 使用页表和所有有用的东西在后台重新映射内存。因此,这就是如何将内存分配给用户空间进程,而进程甚至不知道或关心它所能访问的内存总量(上限)。
然而,堆栈指针确实需要保存,但这是寄存器的一部分。
答案2
取决于处理器,并推断出需要什么来表示任务状态。在一定程度上还取决于操作系统。
在旧的原始(虚拟内存之前)Unix中,寄存器将被保存到内存中的固定位置,然后将整个用户内存写入磁盘并读入新的用户内存映像。(Unix“fork”是通过简单地跳过“读入”步骤来完成的。)当带有TLB的CPU出现时(“Berkley Unix”),这很快就被虚拟交换方案所取代。
在 Burroughs 风格的堆栈架构中,理论上需要交换的只有堆栈指针和任务 ID。内存寻址(在原始版本中)是通过“功能”和“段”进行的,而不是使用 TLB。
具有基于 TLB 的虚拟内存的旧寄存器架构要求 TLB(有时还有缓存)至少在交换时无效,此外还要交换程序寄存器(包括 IAR、条件代码等)。较新的基于 TLB 的架构以各种方式巧妙地解决了这个问题,避免了刷新,因此相当快的切换回来不需要重新加载所有内容。(出于这个原因,在多处理器系统上,任务通常会被赋予给定处理器的“亲和性”,以最大限度地减少 TLB/缓存重新加载的数量。)