C++ 堆损坏';s对Windows 2012 r2服务器的影响

C++ 堆损坏';s对Windows 2012 r2服务器的影响,c++,winapi,heap-corruption,C++,Winapi,Heap Corruption,如果在Windows 2012 r2服务器上运行的每个进程都有自己的堆,那么一个进程不可能损坏另一个进程的堆吗?我认为这是可能的,因为所有堆都存储在一个“全局”地址空间中,但当一个进程试图从其地址空间之外的内存中写入或读取时,会发生AV…因此,这将防止拥有该地址空间的进程的堆损坏?您需要了解其工作原理。没有包罗万象的地址空间 有物理RAM地址和物理磁盘地址,它们不会因进程而异。但用户模式代码从不直接使用这些 相反,内存管理单元提供从虚拟地址到物理地址的映射。由于页表是特定于进程的,因此此映射对于

如果在Windows 2012 r2服务器上运行的每个进程都有自己的堆,那么一个进程不可能损坏另一个进程的堆吗?我认为这是可能的,因为所有堆都存储在一个“全局”地址空间中,但当一个进程试图从其地址空间之外的内存中写入或读取时,会发生AV…因此,这将防止拥有该地址空间的进程的堆损坏?

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

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

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

这就是内存管理单元和它的小兄弟内存保护单元之间的区别。使用内存保护单元的体系结构有一个单一的全局寻址方案,硬件强制的权限位也只能由特权代码修改

你问的那件事

一个进程试图从[sic]地址空间之外的[sic]写入或从内存读取

根本不存在。这就像问我车的电话号码一样。我的车是通过VIN和车牌来识别的,但这两个号码都不允许你通过电话系统与它通话


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

一个进程永远不会意外损坏另一个进程的内存。家族中的每个版本的Windows都是如此。差不多25年了,现在。