使驱动程序可分页

默认情况下,链接器将“.text”和“.data”等名称分配给驱动程序映像文件的代码和数据部分。 加载驱动程序时,I/O 管理器会将这些部分设置为非分页。 非分页部分始终驻留在内存中。

驱动程序开发人员可以选择使驱动程序的指定部分可分页,以便 Windows 可以在这些部件未使用时将这些部件移动到分页文件。 若要使代码或数据节可分页,驱动程序开发人员会向节分配以“PAGE”开头的名称。 I/O 管理器在加载驱动程序时检查部分的名称。 如果节名称以“PAGE”开头,则 I/O 管理器使分区可分页。

在 IRQL >= DISPATCH_LEVEL 下运行的代码必须驻留在内存中。 也就是说,此代码必须位于不可分页的段中,或位于内存中锁定的可分页段中。 如果在 IRQL >= DISPATCH_LEVEL 下运行的代码导致页面错误,则会发生 bug 检查。 驱动程序可以使用 PAGED_CODE 宏来验证是否仅在适当的 IRQL 中调用可分页函数。

如果代码或数据节可分页,则驱动程序可以通过调用 MmLockPagableCodeSectionMmLockPagableDataSection 例程将分区锁定在内存中。 在驱动程序调用 MmUnlockPagableImageSection 例程来解锁它之前,节将保持锁定状态。 当可分页节被锁定时,它的行为与非分页节相同。

有关如何为代码和数据部分分配名称的信息,请参阅 MmLockPagableCodeSectionMmLockPagableDataSection

本节包括下列主题:

代码和数据何时应可分页?

使驱动程序代码或数据可分页