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

Heap Corruption's effect on a Windows 2012 r2 server

如果 Windows 2012 r2 服务器上的每个进程 运行 都有自己的堆,那么是否不可能让一个进程破坏另一个进程的堆?我认为这是可能的,因为所有堆都存储在 "global" 地址 space 中,但是当一个进程试图从其地址 space 之外的内存写入或读取时,会发生 AV。 .这样可以防止拥有地址 space?

的进程发生堆损坏

您需要阅读 virtual memory 的工作原理。没有包罗万象的地址space.

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

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

这就是内存管理单元和它的小弟弟内存保护单元的区别。使用内存保护单元的架构确实有一个单一的全局寻址方案,硬件强制许可位只能由特权代码修改。

你问的事情

one process attempts to write from [sic] or read from memory outside it's [sic] address space

根本不存在。这就像问我的车的 telephone 号码是多少。我的车由 VIN 和车牌识别,但它们都不允许您通过 phone 系统与其对话。

当进程试图写入、读取或执行其自身地址 space 的未映射部分或已明确设置为陷阱的页面时,会发生访问冲突(有时也称为分段错误)访问尝试(可能用于堆栈扩展或写时复制)。根据定义,进程的所有内存访问都在其地址 space.

内解释