駆動中PAGED_コードの役割

1388 ワード

参考:http://blog.csdn.net/broadview2006/article/details/4171397
中身は
 
簡単に言えば、WindowsはRing 0で動作するコードをすべてカーネルとしてはなく、KernelとExecutiveに区分しています.Executiveは「管理層」の意味と解釈でき、「実行体」と解釈するのは不合理です.
その中で、Kernelは狭義のカーネルで、中のコードは使ったデータを含んで、すべて物理メモリの中で常駐したので、改ページの構造を支持しません.
これ以外のコードとデータは、改ページ機構をサポートしており、常に物理メモリにあるのではなく、pagefileに交換することができる.
 
駆動には後者のはずなので、駆動中の関数の頭にはPAGED_が使われます.コードで判断してください.
#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)
現在の中断要求レベルが高すぎると(DPC以上)Kernelの部分になりかねないので、このような状況は避ける必要があります.
転載先:https://www.cnblogs.com/long123king/p/3781902.html