Поделиться через


Постраничный и сбрасываемый код в драйвере протокола

Разработчики драйверов должны по возможности помечать код как страничный, освобождая системное пространство для кода, который должен постоянно находиться в памяти. Вы можете пометить функции как страницы с помощью макроса NDIS_PAGEABLE_FUNCTION. Некоторые функции, такие как IRQL, особенности управления ресурсами и другие характеристики, могут делать функцию неподходящей для страничного обмена.

Каждая функция ProtocolXxx выполняется в IRQL в диапазоне от PASSIVE_LEVEL до DISPATCH_LEVEL. Функции, работающие только на IRQL = PASSIVE_LEVEL, должны быть помечены как страничные.

Функция драйвера, которая выполняется в IRQL = PASSIVE_LEVEL, может быть выполнена на страницу до тех пор, пока она не вызывается ни какой-либо функцией, которая выполняется в IRQL >= DISPATCH_LEVEL-например, функция, которая получает блокировку спина. Получение спин-блокировки приводит к повышению IRQL потока, который её захватывает, до уровня DISPATCH_LEVEL. Функция драйвера, например ProtocolBindAdapterEx, которая выполняется в IRQL = PASSIVE_LEVEL не должна вызывать какие-либо функции NdisXxx, выполняемые в IRQL >= DISPATCH_LEVEL, если эта функция драйвера помечена как код, доступный для страниц. Дополнительные сведения об IRQL для каждой функции NdisXxx смотрите в функциях библиотеки NDIS .

Функция DriverEntry драйверов протоколов NDIS, а также код, вызываемый только из DriverEntry, должен быть указан в качестве кода только для инициализации с помощью макроса NDIS_INIT_FUNCTION. Предполагается, что код, который идентифицируется с помощью этого макроса, выполняется только один раз во время инициализации системы, а в результате сопоставляется только в течение этого времени. После того как функция, помеченная как предназначенная только для инициализации, завершает выполнение, она удаляется.