2013-03-06 127 views
1

據我所知,內核模式代碼可以訪問任何可用的地址(高特權),但是如果我將用戶模式指針傳遞給內核模式函數,在使用它之前它會被更改嗎?我的意思是:它會像尋呼/分段系統一樣解決(或只是尋找長模式),就像在用戶模式下一樣?內核模式 - 是否可以訪問用戶模式?

回答

2

首先,你不「提供一個指向內核模式函數的指針」。內核調用不是簡單的跳轉,它們是特殊指令或軟件中斷。內核函數調用約定也與通常的函數調用不同。

無論如何,從內核上下文訪問用戶內存的工作方式取決於所討論的操作系統。內核通常擁有自己的(虛擬)地址空間。這可以是與用戶進程空間(例如32位OSX)完全獨立的地址空間,也可以位於特殊區域(在許多操作系統中分割爲高/低地址)。在高/低模式中,內核通常可以在指向該用戶空間的指針取消引用的同時在該進程的上下文中執行該指針。在一般情況下,內核可以顯式查找用戶虛擬地址引用的底層物理內存,然後將其映射到其自己的虛擬地址空間中。

由於用戶空間可能惡意提供壞指針,因此如果沒有首先檢查有效性,內核就不能使用它們。對於用戶進程的內存映射,這個和後續的訪問必須是原子的,否則進程可能會在內核的指針有效性檢查和實際讀取/寫入內存之間的時間範圍內。由於這個原因,大多數內核都有助手函數,在用戶空間和內核空間之間本質上是安全的memcpy,在無效指針的情況下保證安全或返回錯誤。

在任何情況下,內核代碼都必須明確地做到這一點,沒有什麼是「自動」的。當然,您的系統調用可能會通過抽象層,在到達內核模塊之前自動執行此操作。

更新:現代硬件支持SMAP(管理員模式訪問阻止),旨在防止從內核意外/惡意取消指向用戶地址空間的指針。各種操作系統已經開始啓用該功能,因此在這些情況下,您絕對必須通過訪問用戶內存的特殊內核功能。

相關問題