Почему мы выделяем из выгружаемого пула и используем прагмы для выделения функций в выгружаемых разделах? - PullRequest
0 голосов
/ 28 сентября 2010

Весь мой код драйвера в настоящее время делает это, главным образом потому, что я работал с очень старшим программистом драйверов в течение пары лет, который ранее работал в команде ядра Windows в течение 15 лет, и он потребовал этого. Я привык к этому и никогда не задавался вопросом «почему?»

Я знаю очевидные причины, такие как невыгружаемый пул по сравнению с выгружаемым пулем, и вы не можете делать предположения о целевой системе (например, сколько будет доступно нестраничной памяти). Но мы недавно унаследовали множество программистов драйверов Linux, которые начали работать с моим кодом драйвера (очевидно, в Linux такого различия нет), и они собрались в кучу, когда я сказал им, что код / ​​данные должны помещаться в выгружаемый пул всякий раз, когда возможно.

Итак, каковы реальные причины, по которым мы выделяем пейджинговый / нестраничный пул?

1 Ответ

4 голосов
/ 29 сентября 2010

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

Более длинная версия: любое невыгружаемое выделение должно оставаться в физической памяти до освобождения.Таким образом, эти выделения занимают виртуальное адресное пространство и физическую память.Виртуальные адреса очень ограничены в 32-битной системе, и поэтому распределение драйверов осуществляется из ограниченного пространства (так как распределения являются глобальными).В 64-битной системе Windows имеется достаточно места для виртуальной машины, и это не представляет особой проблемы.

Однако для каждого выделения все еще используется физическая память.Память, которая поэтому недоступна пользователю, может быть маленькой (около 2,5% в настоящее время на моей машине).Больше беспокойства возникает при работе в среде виртуальных машин, так как эти распределения накапливаются.Таким образом, уменьшение количества невыгружаемых выделений позволит запускать больше экземпляров виртуальных машин на физическом компьютере.

Размещенные выделения могут быть выгружены на диск и, следовательно, доступны только на уровне PASSIVE и APC, иначе вы можете увидеть синий экранпоскольку Windows не может обработать ошибку страницы при более высоких значениях IRQL.

Чтобы повторить:

  1. , если ваш драйвер работает с DPC или выше IRQL, определите разумный раздел вашего кода / данных.в разделы, необходимые для этих уровней, и сделайте их НЕПРОСТРАНЕННЫМИ.
  2. , если ваш драйвер не изменяет IRQL и не принимает прерывания, тогда сделайте все выделения PAGED хорошими гражданами и минимизируйте использование физической памяти.1015 *
...