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


Выделение ресурсов общей памяти

Чтобы выделить ресурсы общей памяти для очереди виртуальных машин, драйвер мини-порта вызывает функцию NdisAllocateSharedMemory . Например, драйвер мини-порта выделяет общую память при получении OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID. Кроме того, драйвер мини-порта может выделить общую память для очереди по умолчанию во время инициализации сетевого адаптера. Дополнительные сведения о выделении очередей см. в статье Выделение очереди виртуальной машины.

Драйвер мини-порта может выделить больше памяти для очереди, пока очередь не будет освобождена. Дополнительные сведения об освобождении очереди см. в статье Освобождение очереди виртуальных машин.

Структура NDIS_SHARED_MEMORY_PARAMETERS указывает параметры общей памяти для запроса на выделение общей памяти. Драйверы miniport передают эту структуру в функцию NdisAllocateSharedMemory . NDIS передает эту структуру в функцию NetAllocateSharedMemory (то есть точку входа ALLOCATE_SHARED_MEMORY_HANDLER).

Когда драйвер мини-порта выделяет общую память, он указывает следующее:

  • Идентификатор очереди.

  • Общая длина памяти.

  • Как используется общая память. Например, драйвер мини-порта указывает NdisSharedMemoryUsageReceive , если общая память будет использоваться для буферов получения.

Если флаг NDIS_SHARED_MEM_PARAMETERS_CONTIGOUS не задан в элементе Flags , общая память может быть указана в списке точечного сбора, который содержится в несмежной памяти.

Перечисление NDIS_SHARED_MEMORY_USAGE указывает, как используется общая память. Перечисление NDIS_SHARED_MEMORY_USAGE используется в структурах NDIS_SHARED_MEMORY_PARAMETERS и NDIS_SCATTER_GATHER_LIST_PARAMETERS . Сведения о параметрах общей памяти в буферах получения данных VMQ см. в разделе Общая память в буферах приема.

Функция NdisAllocateSharedMemory предоставляет вызывающей объекту следующие возможности:

  • Виртуальный адрес выделенной памяти.

  • Точечный собирающийся список.

  • Дескриптор общей памяти — для индикации получения.

  • Дескриптор выделения — используется для идентификации памяти позже.

Драйверы минипорта вызывают функцию NdisFreeSharedMemory , чтобы освободить общую память для очереди. Если драйвер мини-порта выделил общую память для очереди без определенной очереди, он освобождает общую память в контексте OID_RECEIVE_FILTER_FREE_QUEUE OID, пока освобождает очередь. Драйверы мини-портов освобождают общую память, выделенную для очереди по умолчанию в контексте функции MiniportHaltEx .