2013-02-23 88 views
0

一般而言,我知道一個進程無法寫入一個不允許寫入的保護(在其地址空間中)的內存。 但是檢查過程是否可以做到這一點?任何彙編指令是否通過操作系統?它是如何工作的?對操作系統的內存保護

回答

4

在最現代的CPU(英特爾的x86,ARM大多數口味),它的CPU本身,做檢查。 CPU在其中一個寄存器中存儲指定存儲器佈局的數據結構的地址(「頁表」) - 具體地說,哪些地址是可讀的,哪些是可寫的,哪些是可執行的。

當程序試圖對相應的頁表項不允許的內存位置執行某些操作時,CPU會生成一個異常(中斷),並且操作系統得到控制。進一步的操作取決於操作系統。

頁表由操作系統維護,對用戶級代碼不(通常)可見。 OS中的相關部分取決於硬件。

1

頁表,它們具有當前正在執行的進程內存空間的所有信息。當您嘗試訪問只讀寫入內存的內存或訪問不屬於您的內存時,處理器無法找到映射(或者看不到您的寫入),並向操作系統發出頁面錯誤。然後,操作系統決定它是否是寫入頁面上的副本,如果您訪問的頁面完全屬於您,但尚未映射,或者您剛剛訪問了錯誤空間並相應地進行處理(通常會使用段錯誤如果你訪問不好的空間)。

2

當硬件支持此功能時,通常在描述指定是否可以執行內存塊的分配內存塊的信息中有一點。

在英特爾處理器上,這稱爲NX(從不執行)位,而AMD稱爲XD(執行禁用)位。

NX位具體指的是頁表中的64位條目的位號63(即最高有效位)。如果該位設置爲0,則代碼可以從該頁面執行;如果設置爲1,則代碼不能從該頁面執行,並且駐留在那裏的任何內容都假定爲數據。

http://en.wikipedia.org/wiki/NX_bit

的位由操作系統加載的可執行代碼到存儲器後進行設置。它只能由特權代碼(例如OS或驅動程序)設置。

參見:

http://en.wikipedia.org/wiki/Executable_space_protection