上下文切换:如果新进程的虚拟内存映射到与上一个相同的物理地址,那么如何实现内存保护?

问题描述 投票:0回答:1

我知道上下文切换不会刷新缓存。因此,如果新进程要求页面映射到与前一个进程相同的物理地址(并且prev进程现在已交换到磁盘),则仍将缓存前一个进程的内容。当新进程尝试从物理映射的缓存中访问其内存部分时,新进程是否会访问它们?

caching operating-system virtual-memory
1个回答
1
投票

如果新进程的虚拟内存映射到相同的物理地址作为上一个。

对于大多数现代操作系统,您的问题的答案是Paging

假设您的操作系统的可寻址内存为4GB,但是系统上安装的物理内存仅为2GB。进一步假定有一个1.5GB内存需求的进程处于活动状态,因此它看起来如下所示。

enter image description here

因为有足够的物理内存,所以此过程的完整虚拟地址空间已映射到物理内存。

现在说一个具有1.5GB内存需求的新进程进入系统。由于两个进程的物理内存不足,因此,考虑到第二个进程主动需要其整个1.5GB的空间,第一个进程的地址空间可能会映射到磁盘(分页)。因此现在情况如下。

enter image description here

请注意,从第一步的角度来看,一切都和以前一样,一旦它变为活动状态并使用其虚拟空间,操作系统就会将其存储在磁盘上的内存空间回滚到物理内存。

我知道上下文切换不会刷新缓存。所以如果新的过程要求页面映射到与之前的过程(现在将上一个过程交换到磁盘上),先前进程的内容仍将缓存在内存中保护。

您的前提不完全正确,您在哪里读到缓存将不被刷新?

使上下文切换上的缓存无效的问题取决于因素,其中一些不受操作系统的控制。

某些操作系统实现确实会清除缓存(请参阅下文),而没有这样做的缓存则需要硬件的特殊支持。无论哪种方式,任何值得其努力的操作系统都将确保不会将无效数据提供给任何进程。

以下是一些非常好的操作系统书籍中的相关文本。

来自Understanding the Linux Kernel

表2-11。与体系结构无关的TLB无效方法

方法名称-flush_tlbDescription-刷新非全局的所有TLB条目当前进程拥有的页面通常用于-执行过程切换

如果CPU切换到使用相同组的另一个进程,页表作为要替换的内核线程,内核调用_ _flush_tlb()使所有非全局TLB条目无效CPU。

来自Modern Operating Systems

缓存和MMU的存在可能对性能。在多程序系统中,程序到另一个,有时称为上下文切换,它可能是从缓存中清除所有修改的块并更改MMU中的映射寄存器。

和来自Operating System - three easy pieces

一种方法是简单地在上下文切换上刷新TLB,因此在运行下一个进程之前将其清空。基于软件系统,这可以通过显式(和特权)完成硬件说明;如果使用硬件管理的TLB,则刷新可能是更改页表基本寄存器时制定(请注意,操作系统必须更改上下文切换上的PTBR)。无论哪种情况,冲洗该操作只是将所有有效位设置为0,基本上清除了TLB的内容。通过刷新每个上下文开关上的TLB,我们现在有了可行的解决方案,因为流程永远不会意外在TLB中遇到错误的翻译。

另一方面,为减少这种开销,某些系统添加了硬件支持在上下文切换之间共享TLB]。在特别是某些硬件系统提供地址空间标识符TLB中的(ASID)字段。您可以将ASID视为一个过程标识符(PID),但通常它的位数更少(例如,ASID与32位(对于PID)。如果我们以上面的TLB为例并添加ASID,很明显,进程可以轻松共享TLB:仅需要ASID字段来区分其他相同的字段翻译。

© www.soinside.com 2019 - 2024. All rights reserved.