2011年7月1日 星期五

Paged Section

將 code/data 設定為 pageable, 可縮減 driver image 在 kernel memory 中的 size. 當 pageable code/data 沒用到時, 就可以將他們晾在一邊, 而有需要用到時, 才將該 paged section 取出來使用.

在程式中, 可以用 #pragma alloc_text(<section name>, <function>) 將指定的 function 設定為 pageable, 放至特定的 section. 常看到的 section 有 INIT 及 PAGE:

  • INIT 是較特別的一個 section, 它只會在 DriverEntry 被呼叫時會被取出使用, 並且在 DriverEntry 返回後被拋棄, 因此如果在 DriverEntry 裡宣告了常數形態的 buffer, 日後存取其位址, 便會發生 page fault.
  • 與 INIT 不同, PAGE 這個 section 會在有需要時, 被取出使用, 之後視情況又會被晾在一邊, 等下次有需要時再取用.
  • 另外, section name 可以自定義, 依 PAGEXXXX 格式 -- 大寫的 PAGE 接著 1~4 個字元, 如 PAGELKK, PAGEA1, 並以 MmLockPagableCodeSection 等相關 API 控制該 section.

要將一整個 data module 設定在特定的 section, 可以分別用 #pragma data_seg (<section name>) 及 #pragma data_seg () 在 module 的前後.

我需要將某某 function 設定為 pageable 嗎?
如果這個 function 在執行時期, 大部份時間都不會用到, 而且當它被使用時, 不會在 IRQL >= DISPATCH_LEVEL, 那就可考慮將它設定為 pageable. 在 IRQL >= DISPATCH_LEVEL 時, Windows 是沒辦法幫你自動取用 paged section 的.

沒有留言:

張貼留言