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


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

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

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

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

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

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

  • Длина общей памяти.

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

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

Перечисление 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.