Драйвер устройства: как обойти фрагментацию памяти в невыгружаемом пуле? - PullRequest
1 голос
/ 14 марта 2012

У меня проблема с платой PCI Express в 32-битной среде Windows 7. Эта плата представляет собой устройство для захвата аудио / видео, которое выполняет кодирование H.264 в реальном времени для 32 отдельных аналоговых видео каналов SD. Он использует DMA для доставки сжатых кадров в драйвер хоста Win7.

При загрузке системы драйвер платы выделяет буферы DMA из невыгружаемого пула, используя функцию AllocateCommonBuffer объекта DmaAdapter. Все буферы должны находиться в одном физическом диапазоне адресов 256 МБ, чтобы быть сопоставленными с платой. Это распределение всегда происходит успешно при загрузке хост-системы win7.

На плате нет резидентной прошивки, кроме простого загрузчика; требуется загрузка образа микропрограммы (через драйвер) на плату во время выполнения приложения. Однако, как часть этого процесса загрузки микропрограммного обеспечения, приложение Windows должно выполнить ioctl BOARD_RESET через драйвер, чтобы перевести плату в известное состояние. К сожалению, когда плата получает команду сброса, она на короткое время «исчезает» из вида диспетчера Win7 PnP, который считает, что произошло событие SURPRISE_REMOVAL. Впоследствии драйвер платы вынужден освободить все свои выделенные буферы DMA обратно в невыгружаемый пул и ожидать события StartDevice от диспетчера PnP.

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

Я ищу программный обходной путь для этой ситуации. Можно ли как-то приостановить узел устройства во время сброса платы, чтобы PnP-менеджер не обнаружил его как удаление? Существует ли конфигурация PnP, которая может переопределить обнаружение удаления устройства? Есть ли способ повесить буферы DMA, которые драйвер успешно получил при первом запуске? Есть ли способ зарезервировать диапазоны страниц в невыгружаемом пуле для использования только этим драйвером? Буферы DMA довольно велики: 200 буферов, каждый по 634880 байт, и все они должны приходить из одного и того же диапазона 256 МБ (т. Е. На границах 0x10000000). У меня есть полный исходный код для драйвера платы и я могу внести любые необходимые изменения; это часть купленного эталонного дизайна у поставщика. Это мое первое знакомство с драйверами устройств Windows.

...