一般而言,我知道一個進程無法寫入一個不允許寫入的保護(在其地址空間中)的內存。 但是檢查過程是否可以做到這一點?任何彙編指令是否通過操作系統?它是如何工作的?對操作系統的內存保護
0
A
回答
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或驅動程序)設置。
參見:
相關問題
- 1. 在內存保護操作系統中讀取內存
- 2. Java JVM保持對操作系統的內存分配
- 3. 互操作保護內存驗證
- 4. 內存泄漏和操作系統
- 5. Linux內核操作系統寄存器
- 6. 內存管理由操作系統
- 7. 操作系統內存分配地址
- 8. 操作系統內存分配
- 9. Firefox操作系統:進程,內存
- 10. 64位操作系統內存分配
- 11. 操作系統主內存碎片
- 12. Linux上的Nvidia信息泄露/內存漏洞和一般操作系統內存保護
- 13. 基於Linux的操作系統的一般保護錯誤
- 14. 在自定義操作系統中的一般保護
- 15. 對於操作系統的英特爾VT-d的保護測試
- 16. PHP內存vs操作系統分配的內存
- 17. MySQL操作系統緩存
- 18. 如何從內部保護系統(如內部工作)?
- 19. 數據執行保護:在x86操作系統中使用OptIn
- 20. 保存QueryString以保護URL操作
- 21. 操作系統內核是守護進程嗎?
- 22. 操作系統
- 23. 操作系統內部的GUI
- 24. 系統/操作系統緩存與應用程序緩存
- 25. 從操作系統內核訪問GPU內存
- 26. 內核內存在Windows操作系統中包含什麼?
- 27. Web服務器緩存 - 內存與操作系統
- 28. 保存圖像文件在SD卡中的Firefox操作系統
- 29. 命令在Linux操作系統上保存MATLAB中的文件
- 30. 操作系統在哪裏保存了幾分鐘內不使用的程序?