據我所知,內核模式代碼可以訪問任何可用的地址(高特權),但是如果我將用戶模式指針傳遞給內核模式函數,在使用它之前它會被更改嗎?我的意思是:它會像尋呼/分段系統一樣解決(或只是尋找長模式),就像在用戶模式下一樣?內核模式 - 是否可以訪問用戶模式?
1
A
回答
2
首先,你不「提供一個指向內核模式函數的指針」。內核調用不是簡單的跳轉,它們是特殊指令或軟件中斷。內核函數調用約定也與通常的函數調用不同。
無論如何,從內核上下文訪問用戶內存的工作方式取決於所討論的操作系統。內核通常擁有自己的(虛擬)地址空間。這可以是與用戶進程空間(例如32位OSX)完全獨立的地址空間,也可以位於特殊區域(在許多操作系統中分割爲高/低地址)。在高/低模式中,內核通常可以在指向該用戶空間的指針取消引用的同時在該進程的上下文中執行該指針。在一般情況下,內核可以顯式查找用戶虛擬地址引用的底層物理內存,然後將其映射到其自己的虛擬地址空間中。
由於用戶空間可能惡意提供壞指針,因此如果沒有首先檢查有效性,內核就不能使用它們。對於用戶進程的內存映射,這個和後續的訪問必須是原子的,否則進程可能會在內核的指針有效性檢查和實際讀取/寫入內存之間的時間範圍內。由於這個原因,大多數內核都有助手函數,在用戶空間和內核空間之間本質上是安全的memcpy
,在無效指針的情況下保證安全或返回錯誤。
在任何情況下,內核代碼都必須明確地做到這一點,沒有什麼是「自動」的。當然,您的系統調用可能會通過抽象層,在到達內核模塊之前自動執行此操作。
更新:現代硬件支持SMAP(管理員模式訪問阻止),旨在防止從內核意外/惡意取消指向用戶地址空間的指針。各種操作系統已經開始啓用該功能,因此在這些情況下,您絕對必須通過訪問用戶內存的特殊內核功能。
相關問題
- 1. printf是否以內核模式或用戶模式運行?
- 2. 從內核模式執行用戶模式可執行文件
- 3. C++可能訪問內核模式註冊表項訪問?
- 4. 從內核模式訪問WinUSB設備
- 5. 用戶模式和內核模式爲用戶提供保護?
- 6. 如何訪問用戶模式內存?
- 7. LdrLoadDll是否有內核模式回調?
- 8. 用戶模式和內核模式之間的共享內存
- 9. 如何從用戶模式調用/掛鉤內核模式API?
- 10. 從用戶模式進入內核模式的不同方式是NETLINK Socket嗎?
- 11. 內核如何知道CPU是處於用戶模式還是kenel模式?
- 12. 內核/用戶模式下的CPU
- 13. 用戶到內核模式的大圖?
- 14. 內核模式和用戶模式驅動程序
- 15. 如何做混合用戶模式/內核模式調試?
- 16. 發送從內核模式價值到用戶模式
- 17. Windows過濾平臺用戶模式或內核模式?
- 18. 從用戶模式切換到內核模式
- 19. 用戶模式與內核模式的回調函數
- 20. 內核模式到用戶模式通信
- 21. 如何從Windows內核模式啓動用戶模式程序
- 22. 如何從用戶模式切換到內核模式?
- 23. Windows如何實現用戶模式/內核模式?
- 24. 如何在WinCe7中訪問用戶模式應用程序中的內核模式內存
- 25. 特權模式,內核模式和超級用戶模式之間的區別
- 26. 傳遞從用戶模式可變長度結構來內核模式
- 27. 是否可以使用WCF與Windows內核模式軟件進行通信?
- 28. Windows XP:我的程序是否以內核模式運行?
- 29. 是否可以動態訪問模塊模式中的私有變量?
- 30. MySQL進程在用戶模式還是內核模式下運行?