共用方式為


程式代碼和數據在何時應該是可分頁化的?

您可以將驅動程式的所有或部分設為可分頁。 分頁驅動程式代碼可以減少驅動程式載入映像的大小,從而釋放系統空間以用於其他用途。 對於零星使用的裝置的驅動程式,例如數據機和CD-ROM,或很少呼叫的驅動程式部分而言,這是最實用的。

執行以下任一動作的驅動程式代碼必須常駐記憶體。 也就是說,此程式代碼必須位於非分頁區段中,或是在程式代碼執行時鎖定在記憶體中的分頁區段中。

  • 在 IRQL = DISPATCH_LEVEL以上執行。

  • 取得自旋鎖。

  • 呼叫任何核心的物件支援例程,例如 KeReleaseMutexKeReleaseSemaphore,其中 Wait 參數會設定為 TRUE。 如果核心在以 Wait 設定為 TRUE 的狀態下被呼叫,呼叫返回時的 IRQL 將會處於 DISPATCH_LEVEL。

當驅動程式代碼執行任何可能引發頁錯的操作時,必須在 IRQL < DISPATCH_LEVEL 執行。 如果程式代碼執行下列任何動作,可能會導致頁面錯誤:

  • 存取未鎖定在記憶體中的分頁集區。

  • 呼叫可分頁的例程。

  • 存取使用者線程內容中解除鎖定的用戶緩衝區。

一般而言,如果所有可分頁程式碼(或數據)的總計至少為 4 KB,您應該將區段設為可分頁。 盡可能將純可分頁的程式代碼(或數據)隔離到程式代碼(或數據)的個別區段,這些區段有時可以是可分頁,但有時必須鎖定。 例如,將純可分頁代碼與按需鎖定的代碼結合起來,會導致為合併區段鎖定的系統空間超過必要的程度。 不過,如果驅動程式含有小於 4 KB 的可能可分頁程式代碼(或數據),您可以將該程式代碼(或數據)與鎖定隨選程序代碼(或數據)合併成一個區段,以節省系統空間。