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

你可以使驱动程序的全部或部分可分页。 分页驱动程序代码可以减小驱动程序的加载映像的大小,从而释放系统空间供其他用途使用。 它最适用于零星使用设备(如调制解调器和 CD-ROM)的驱动程序,或很少调用的部分驱动程序。

执行以下任一操作的驱动程序代码必须驻留在内存中。 也就是说,此代码必须位于非分页节中,或者在代码运行时锁定在内存中的分页节中。

  • 在 IRQL = DISPATCH_LEVEL 或更高位置运行。

  • 获取旋转锁。

  • 调用内核的任何对象支持例程,例如 KeReleaseMutexKeReleaseSemaphore,其中 Wait 参数设置为 TRUE。 如果在 将 Wait 设置为 TRUE 的情况下调用内核,调用将在 DISPATCH_LEVEL 返回 IRQL。

当代码执行可能导致页面错误的任何操作时,驱动程序代码必须在 IRQL < DISPATCH_LEVEL上运行。 如果代码执行以下任一操作,则可能会导致页面错误:

  • 访问未在内存中锁定的分页池。

  • 调用可分页例程。

  • 在用户线程的上下文中访问未锁定的用户缓冲区。

通常,如果所有可分页代码 (或数据) 的总量至少为 4 KB (KB) ,则应将分区设置为分页。 应尽可能将纯可分页代码 (或数据) 隔离到代码 (或数据) 中,这些部分有时可以分页,但有时必须锁定。 例如,将纯可分页代码和锁定的按需代码组合在一起会导致锁定组合部分的系统空间超出必要。 但是,如果驱动程序的可分页代码 (或数据) 少于 4 KB,则可以将代码 (或数据) 与锁定的按需代码 (或数据) 合并到一个部分,从而节省系统空间。