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


Специальный пул

Функция "Специальный пул " настраивает Windows для запроса выделения памяти из зарезервированного пула памяти, если память выделена с помощью указанного тега пула или находится в пределах заданного диапазона размера.

Сокращение

Spp

Шестнадцатеричное значение

(нет)

Символическое имя

(нет)

Назначение

Запись реестра для всей системы

(Windows Vista и более поздние версии) Запись реестра для всей системы, флаг ядра

Выбор тега пула

При запросе специального пула для определенного тега пула убедитесь, что драйвер или другая программа режима ядра использует уникальный тег пула.

Кроме того, при создании тега пула (например, с помощью ExAllocatePoolWithTag) рекомендуется вводить символы тега в обратном порядке. Например, если тег — Fred, рекомендуется ввести его как derF (0x64657246). Теги пула хранятся в реестре и отображаются в отладчике и других средствах в обратном (нижнем байтовом) порядке. Если ввести их в обратном порядке, они отображаются в порядке пересылки (0x46726564).

Если вы подозреваете, что драйвер использует весь специальный пул, рассмотрите возможность использования нескольких тегов пула в коде. Затем можно протестировать драйвер несколько раз, назначив специальный пул одному тегу пула в каждом тесте.

Кроме того, выберите тег пула с шестнадцатеричным значением, превышающим размер страницы в системе. Для кода режима ядра, если ввести тег пула со значением меньше PAGE_SIZE, Gflags запрашивает специальный пул для всех выделений, размер которых находится в пределах соответствующего диапазона, и запрашивает специальный пул для выделения с эквивалентным тегом пула. Например, при выборе размера 30 специальный пул будет использоваться для всех выделений размером от 17 до 32 байт, а также для выделений с тегом пула 0x0030.

Выбор размера выделения

Используйте следующие рекомендации, чтобы выбрать размер выделения для функции "Специальный пул".

На компьютере с процессором x86 PAGE_SIZE 0x1000, а диапазоны размеров выделения — 8 байт. Чтобы настроить функцию "Специальный пул" для всех выделений с размерами в этом диапазоне, введите число, равное максимальному значению этого диапазона плюс 8. (Это число всегда кратно 8.) В следующей таблице показаны эти значения:

Диапазон размеров Введите это число

От 1 до 8 байт

10 (десятичное число 16)

От 9 до 16 байт

18 (десятичное число 24)

От 17 до 24 байт

20 (десятичное число 32)

...

...

0xFE9 в 0xFF0 байтах

FF8 (decimal 4088)

На компьютере с процессором AMD x86–64 PAGE_SIZE 0x1000, а диапазоны размеров выделения — 16 байт. Чтобы настроить функцию "Специальный пул" для всех выделений с размерами в этом диапазоне, введите число, равное максимальному значению этого диапазона плюс 16. (Это число всегда кратно 16.) В следующей таблице показаны эти значения:

Диапазон размеров Введите это число

От 1 до 16 байт

20 (десятичное число 32)

От 17 до 32 байт

30 (десятичное число 48)

От 33 до 48 байт

40 (десятичное число 64)

...

...

0xFD1 на 0xFE0 байт

FF0 (десятичное число 4080)

На компьютере с любым процессором можно использовать звездочку ( * ) или 0x2A (десятичное число 42), чтобы настроить функцию "Специальный пул" для всех выделений памяти в системе.

Комментарии

Сведения о настройке функции специального пула в диалоговом окне Глобальные флаги см. в разделе Настройка специального пула. Сведения о настройке функции "Специальный пул" в командной строке см. в разделе Команды GFlags. Пример см. в разделе Пример 14. Настройка специального пула.

Функция специального пула Gflags позволяет Windows запрашивать выделение памяти из зарезервированного пула памяти, если память выделена с помощью указанного тега пула или находится в пределах указанного диапазона размера. Чтобы запросить специальный пул для всех выделений определенным драйвером, используйте средство проверки драйверов. Дополнительные сведения см. в разделе "Специальный пул" раздела "Средство проверки драйверов" комплекта драйверов Windows (WDK).

Специальные функции пула Gflags и Driver Verifier помогают обнаруживать и определять источник ошибок при использовании пула ядра, например запись за пределами выделенного пространства памяти или ссылка на память, которая уже была освобождена.

Выполняются не все специальные запросы пула. Каждое выделение из специального пула использует одну страницу физической памяти, не доступную для страниц, и две страницы виртуального адресного пространства. Если специальный пул исчерпан, память выделяется из стандартного пула до тех пор, пока специальный пул снова не станет доступным. При заполнении специального запроса пула из стандартного пула запрашивающая функция возвращает состояние успешного выполнения. Он не возвращает ошибку, так как выделение прошло успешно, даже если оно не было заполнено из специального пула.

Размер специального пула увеличивается с объемом физической памяти в системе; в идеале это значение должно быть не менее 1 Гигабайт (ГБ). На компьютерах x86, так как используется виртуальное (в дополнение к физическому) пространство, не используйте параметр загрузки /3 ГБ при использовании специального пула. Также рекомендуется увеличить минимальное или максимальное количество файлов подкачки в два или три раз.

Вы также можете настроить функцию "Специальный пул", чтобы выровнять выделение памяти для обнаружения ссылок на память перед выделением ("недостаточное выполнение") или ссылки на память за пределами выделения ("переполнение"). Эта функция доступна только в диалоговом окне Глобальные флаги во всех версиях Windows. Дополнительные сведения см. в разделе Обнаружение переполнения и недостаточного выполнения.

В Windows Vista и более поздних версиях Windows компонент "Специальный пул" можно настроить как параметр реестра, который требует перезагрузки, но остается в действии до тех пор, пока вы не измените его, или как параметр флага ядра, который не требует перезагрузки, но действует только до перезагрузки или завершения работы Windows. В более ранних версиях Windows специальный пул доступен только в качестве параметра реестра.

В Windows Vista и более поздних версиях Windows функцию "Специальный пул" можно настроить с помощью диалогового окна Глобальные флаги или в командной строке. В более ранней версии Windows эта функция доступна только в диалоговом окне Глобальные флаги.