驅動中PAGED_CODE的作用


參考:http://blog.csdn.net/broadview2006/article/details/4171397

里面的內容出自<Windows內核情景分析>

 

簡而言之,Windows並沒有將運行在Ring 0的代碼全部視為內核,而是區分為Kernel和Executive,Executive可以理解為“管理層”的意思,解釋為“執行體”不合理。

其中,Kernel是狹義的內核,里面的代碼包括用到的數據,都是常駐在物理內存中的,不支持分頁機制。

而除此之外的代碼和數據,是支持分頁機制的,並且可以被交換到pagefile中,即並非總是在物理內存中的。

 

對於驅動來說,應該屬於后者,因此在驅動中的函數的頭部都會使用PAGED_CODE來判斷一下,

#define PAGED_CODE() PAGED_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
#define PASSIVE_LEVEL 0             // Passive release level
#define LOW_LEVEL 0                 // Lowest interrupt level
#define APC_LEVEL 1                 // APC interrupt level
#define DISPATCH_LEVEL 2            // Dispatcher level
#define CMCI_LEVEL 5                // CMCI handler level

#define PROFILE_LEVEL 27            // timer used for profiling.
#define CLOCK1_LEVEL 28             // Interval clock 1 level - Not used on x86
#define CLOCK2_LEVEL 28             // Interval clock 2 level
#define IPI_LEVEL 29                // Interprocessor interrupt level
#define POWER_LEVEL 30              // Power failure level
#define HIGH_LEVEL 31               // Highest interrupt level

#define CLOCK_LEVEL                 (CLOCK2_LEVEL)

如果當前的中斷請求級別(IRQL)太高(DPC以上),那么很可能屬於Kernel部分,因此需要避免這種情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM