2017-05-30 129 views
-2

如果Windows 2012 R2服務器上運行的每個進程都有自己的堆,那麼是不是有可能讓一個進程損壞了另一個進程的堆?我認爲這是可能的,因爲所有堆都存儲在「全局」地址空間中,但是當一個進程嘗試從其地址空間外的內存中寫入或從內存中讀取時發生AV,這樣可以防止堆進程損壞擁有地址空間?堆損壞對Windows 2012 R2服務器的影響

+0

一個進程永遠不會意外地損壞另一個進程的內存。對於[Windows NT](https://en.wikipedia.org/wiki/Windows_NT)系列中的每個Windows版本都是如此。近25年,現在。 – IInspectable

回答

2

您需要詳細瞭解virtual memory的工作原理。沒有包羅萬象的地址空間。

有物理RAM地址和物理磁盤地址,它們不因進程而異。但用戶模式代碼從不直接使用這些代碼。

而是,內存管理單元提供從虛擬地址到物理地址的映射。由於頁表是特定於進程的,因此該映射對每個進程都是唯一的。只有環0(內核模式)代碼可以繞過映射步驟,這是在硬件中強制執行的。對於用戶進程,如果沒有映射導致特定的物理地址,則無法從該上下文訪問,因爲無法使用虛擬地址命名該物理位置。並沒有導致頁表本身的映射。

這是內存管理單元和其較小的兄弟內存保護單元之間的區別。使用內存保護單元的體系結構確實有一個全局尋址機制,硬件強制允許位只能通過特權代碼進行修改。

你問的事情有關

一個進程試圖從[原文]寫入或從存儲器中讀取外面的(原文如此)地址空間

根本就不存在。這就像問我的車的電話號碼是什麼。我的車由VIN和車牌識別,但這兩者都不允許您通過電話系統與其通話。

當進程嘗試從自己的地址空間的未映射部分寫入,讀取或執行,或者顯式設置爲陷阱訪問嘗試的頁面時,會發生訪問衝突(有時也稱爲段錯誤)(對於堆棧可能擴展,或者寫時複製)。一個進程的所有內存訪問都是在其地址空間內定義的。