2013-10-07 13 views
3

從MSDN:在內核模式下運行爲什麼在內核模式下的驅動程序必須非常小心直接讀取或寫入用戶空間中的地址?

驅動程序必須非常小心直接 閱讀或在用戶空間寫地址。此場景 說明了原因。

  1. 用戶模式程序啓動從設備讀取某些數據的請求。程序提供緩衝區的起始地址到 接收數據。
  2. 以內核模式運行的設備驅動程序例程啓動讀取操作並將控制權返回給其調用者。
  3. 稍後,設備將中斷當前正在運行的任何線程,以表示讀取操作已完成。該中斷由 在該任意線程上運行的內核模式驅動程序例程處理,其中 屬於任意進程。
  4. 此時,驅動程序不得將數據寫入用戶模式程序在步驟1中提供的起始地址。該地址爲 ,該地址在啓動 請求的進程的虛擬地址空間中可能與當前流程不一樣。

有人能解釋這個換句話說嗎?點2,3,4不是很清楚。 謝謝。

回答

0

每個進程都有自己的「執行環境」,其中包括用於虛擬到物理地址轉換的數據結構(頁表)。

在任何時間點,虛擬地址到物理地址映射都取決於當時正在執行的進程。

採取以下情形:

  1. 用戶模式程序(比方說「過程A」與單個螺紋)啓動一個讀請求,並將用戶空間緩衝區地址。

  2. 該讀取請求到達設備驅動程序例程,該例程在內核模式下運行。現在很可能,Device硬件的實際讀取操作需要一些時間才能完成。在這種情況下,Driver例程可能不會等待操作完成。相反,它只會從設備開始讀取操作,並立即返回。在此活動中,操作系統也會通知讀取操作已經開始但尚未完成。操作系統會將Process-A置於等待狀態,並安排其他進程(線程)執行。

  3. 稍後當Device完成讀操作時,它會引發一箇中斷來通知它。此時,任何任意進程(如「Process-B」)都將執行。那就是Page表格將反映出Process-B的虛擬到物理地址空間映射。調用此中斷的Driver例程將在Process-B的Context中運行。

  4. 此時,在步驟1訪問由用戶模式程序提供的虛擬地址將訪問與Process-B相對應的虛擬地址,而不是Process-A的虛擬地址。

爲不同approches參見"Methods for Accessing Data Buffers"到數據到用戶空間從內核模式例程轉移。

相關問題