堆损坏对Windows 2012 R2服务器的影响

问题描述:

如果Windows 2012 R2服务器上运行的每个进程都有自己的堆,那么是不是有可能让一个进程损坏了另一个进程的堆?我认为这是可能的,因为所有堆都存储在“全局”地址空间中,但是当一个进程尝试从其地址空间外的内存中写入或从内存中读取时发生AV,这样可以防止堆进程损坏拥有地址空间?堆损坏对Windows 2012 R2服务器的影响

+0

一个进程永远不会意外地损坏另一个进程的内存。对于[Windows NT](https://en.wikipedia.org/wiki/Windows_NT)系列中的每个Windows版本都是如此。近25年,现在。 – IInspectable

您需要详细了解virtual memory的工作原理。没有包罗万象的地址空间。

有物理RAM地址和物理磁盘地址,它们不因进程而异。但用户模式代码从不直接使用这些代码。

而是,内存管理单元提供从虚拟地址到物理地址的映射。由于页表是特定于进程的,因此该映射对每个进程都是唯一的。只有环0(内核模式)代码可以绕过映射步骤,这是在硬件中强制执行的。对于用户进程,如果没有映射导致特定的物理地址,则无法从该上下文访问,因为无法使用虚拟地址命名该物理位置。并没有导致页表本身的映射。

这是内存管理单元和其较小的兄弟内存保护单元之间的区别。使用内存保护单元的体系结构确实有一个全局寻址机制,硬件强制允许位只能通过特权代码进行修改。

你问的事情有关

一个进程试图从[原文]写入或从存储器中读取外面的(原文如此)地址空间

根本就不存在。这就像问我的车的电话号码是什么。我的车由VIN和车牌识别,但这两者都不允许您通过电话系统与其通话。

当进程尝试从自己的地址空间的未映射部分写入,读取或执行,或者显式设置为陷阱访问尝试的页面时,会发生访问冲突(有时也称为段错误)(对于堆栈可能扩展,或者写时复制)。一个进程的所有内存访问都是在其地址空间内定义的。