Когда код и данные должны быть доступны для страниц?

Вы можете сделать все или часть драйвера страничной. Код драйвера подкачки может уменьшить размер образа нагрузки драйвера, тем самым освобождая системное пространство для других видов использования. Это наиболее удобно для драйверов периодически используемых устройств, таких как модемы и CD-ROM, или для частей драйверов, которые называются редко.

Код драйвера, который выполняет любое из следующих действий, должен быть резидентом памяти. То есть этот код должен находиться либо в несгружаемом разделе, либо в разделе с разбивкой на страницы, который блокируется в памяти при выполнении кода.

  • Выполняется со значением IRQL или выше = DISPATCH_LEVEL.

  • Получает спиновые блокировки.

  • Вызывает любую подпрограмму поддержки объекта ядра, например KeReleaseMutex или KeReleaseSemaphore, в которой параметр Wait имеет значение TRUE. Если ядро вызывается с параметром Wait имеет значение TRUE, вызов возвращается с irQL в DISPATCH_LEVEL.

Код драйвера должен выполняться на DISPATCH_LEVEL IRQL < , когда код выполняет любые действия, которые могут привести к сбою страницы. Код может вызвать ошибку страницы, если он выполняет одно из следующих действий:

  • Обращается к выстраившемся пулу, который не заблокирован в памяти.

  • Вызывает подпрограмму с возможностью страничного просмотра.

  • Обращается к разблокированных пользовательским буферам в контексте потока пользователя.

Как правило, раздел следует выстраив, если общий объем всего страничного кода (или данных) составляет не менее 4 килобайт (КБ). По возможности следует изолировать чисто страничный код (или данные) в отдельный раздел от кода (или данных), который иногда может быть доступным для страниц, но иногда должен быть заблокирован. Например, сочетание чисто страничного кода и кода, заблокированного по запросу, приводит к тому, что для объединенного раздела будет заблокировано больше системного пространства, чем требуется. Однако если драйвер имеет менее 4 КБ возможного страничного кода (или данных), вы можете объединить этот код (или данные) с заблокированным по запросу кодом (или данными) в один раздел, экономя место в системе.