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