NdisMAllocateSharedMemory 함수(ndis.h)
주의
ARM 및 ARM64 프로세서의 경우 NDIS 드라이버 작성기가 NDIS 분산/수집 DMA 대신 WDF DMA 또는 WDM DMA를 사용하는 것이 좋습니다.
WDF DMA에 대한 자세한 내용은 KMDF 드라이버에서 DMA 작업 처리를 참조하세요.
WDM DMA에 대한 자세한 내용은 드라이버에 대한 입력/출력 관리의 DMA 관련 자식 topics 참조하세요.
NdisMAllocateSharedMemory 는 호스트 시스템 및 DMA NIC 모두에서 메모리 범위에 동시에 액세스할 수 있도록 호스트 메모리 범위를 할당하고 매핑합니다.
구문
void NdisMAllocateSharedMemory(
[in] NDIS_HANDLE MiniportAdapterHandle,
[in] ULONG Length,
[in] BOOLEAN Cached,
[out] PVOID *VirtualAddress,
[out] PNDIS_PHYSICAL_ADDRESS PhysicalAddress
);
매개 변수
[in] MiniportAdapterHandle
MiniportInitializeEx에 대한 핸들 입력을 지정합니다.
[in] Length
할당할 바이트 수를 지정합니다.
[in] Cached
이 매개 변수는 무시됩니다(캐시된 메모리는 항상 x86 및 x64 시스템에서 사용됨).
[out] VirtualAddress
이 함수가 미니포트 드라이버에서 사용할 할당의 기본 가상 주소를 반환하는 호출자 제공 변수에 대한 포인터입니다. NdisMAllocateSharedMemory가 호출자를 충족할 수 없는 경우 NULL을 반환하여 메모리가 할당되지 않았음을 나타냅니다.
[out] PhysicalAddress
이 함수가 VirtualAddress에서 반환된 에 해당하거나 NULL을 반환하는 NIC에서 사용하기에 적합한 실제 주소를 반환하는 호출자 제공 변수에 대한 포인터입니다.
반환 값
없음
설명
NdisMAllocateSharedMemory 는 드라이버가 공유 메모리 블록에 액세스하는 데 사용하는 매핑된 가상 주소 범위와 NIC에서 사용하는 NDIS_PHYSICAL_ADDRESS 형식 범위를 모두 제공합니다. PhysicalAddress에서 반환되는 값은 시스템에서 두 배로 매핑할 수 있습니다. 즉, PhysicalAddress 및 Length 값으로 설명된 "물리적" 주소 범위는 가능한 모든 플랫폼에서 할당에 대한 호스트 물리적 주소와 일치하지 않는 매핑된 논리 주소 범위일 수 있습니다.
NdisMAllocateSharedMemory 는 MiniportInitializeEx에서만 호출할 수 있습니다. 요청할 할당의 크기는 NIC의 기능과 기능을 알고 있는 드라이버 작성기가 다음 성능과 크기 딜레마 간의 절충을 결정하는 방법에 따라 달라집니다.
-
네트워크 트래픽이 많은 기간 동안 미니포트 드라이버는 디바이스 액세스 가능 데이터 버퍼의 공유 메모리 공간이 부족한 경우 높은 I/O 처리량을 유지할 수 없습니다.
예를 들어 미니포트 드라이버는 수신의 홍수가 NIC에 들어올 때 바인딩된 프로토콜 드라이버에서 이러한 버퍼가 반환되는 것보다 더 빨리 공유 메모리의 수신 버퍼를 나타낼 수 있습니다. 미해결 수신 버퍼에서 모든 공유 메모리 공간을 사용하는 경우 미니포트 드라이버는 수신 버퍼에 사용할 수 있는 공유 메모리 공간이 있을 때까지 NIC에서 수신 인터럽트 수신을 사용하지 않도록 설정해야 할 수 있습니다.
- 반면, 최대 전송 수요를 예상하도록 선택한 Length를 사용하여 NdisMAllocateSharedMemory를 호출하면 매우 높은 I/O 수요의 드문 기간을 제외하고 드라이버의 이미지가 더 크고 리소스 사용량이 매우 비경제적입니다. 또한 시스템 메모리가 부족한 경우 NdisMAllocateSharedMemory 가 드라이버에 이러한 큰 블록을 제공하지 않아 드라이버가 초기화에 실패하도록 할 수 있습니다.
NdisMAllocateSharedMemory 및 NdisMAllocateSharedMemoryAsyncEx 는 가상 주소를 사용하는 드라이버와 해당 논리 주소를 사용하는 NIC 간에 공유되는 호스트 메모리를 할당하기 위해 호출할 수 있는 유일한 NdisXxx 함수입니다.
미니포트 드라이버는 DMA 중에 캐시 라인이 찢어지지도록 호스트 데이터 캐시 라인 경계의 정수에 있는 공유 캐시된 메모리에서 할당하는 버퍼를 정렬해야 합니다. 캐시 라인 분리는 드라이버에서 데이터 무결성 문제를 일으키거나 데이터 무결성을 유지하기 위해 과도한 데이터 캐시 플러시를 요구하여 드라이버의 I/O 성능을 저하시킬 수 있습니다. MiniportInitializeEx 는 NdisMGetDmaAlignment 를 호출하여 드라이버가 할당된 공유 메모리 범위 내에서 설정할 디바이스 액세스 버퍼에 대한 현재 플랫폼의 맞춤 경계를 결정할 수 있습니다.
미니포트 드라이버는 할당할 수 있는 공유 메모리의 양에 대한 제한을 설정해야 합니다. 이 제한은 드라이버 관련이며 드라이버가 버퍼가 부족하지 않도록 충분히 높아야 합니다. 시스템 성능을 저하시킬 수 있는 공유 메모리의 낭비가 발생할 수 있으므로 지나치게 높은 제한을 설정하지 마세요.
MiniportInitializeEx는 드라이버 작성기가 모든 SMP 컴퓨터가 워크스테이션보다 NIC에 대한 네트워크 전송 요구가 높은 네트워크 서버일 가능성이 높다는 가정 하에 다중 프로세서 머신에 더 큰 공유 메모리 블록을 할당하기로 결정한 경우 NdisMAllocateSharedMemory를 호출하기 전에 NdisSystemProcessorCount를 호출할 수도 있습니다.
NdisMAllocateSharedMemory에 대한 호출이 실패하면 MiniportInitializeEx는 더 작은 할당을 요청하는 를 다시 호출할 수 있습니다. 그러나 MiniportInitializeEx 가 NIC에 충분한 공유 메모리를 할당할 수 없는 경우 이미 할당한 모든 리소스를 해제하고 초기화에 실패해야 합니다.
미니포트 드라이버가 이후에 수신을 나타내는 경우 NdisMIndicateReceiveNetBufferLists는 공유 메모리 블록에서 NIC의 수신 버퍼를 매핑하는 버퍼 풀에서 일부 버퍼 설명자를 할당해야 합니다.
할당된 메모리가 캐시되어 전송 시 플러시되어야 하는 경우 미니포트 드라이버는 NdisAllocateMdl 을 호출하여 공유 메모리 범위에 대한 NDIS_BUFFER 형식 설명자를 할당해야 합니다. 미니포트 드라이버는 이러한 플러시를 수행하려면 이 버퍼 설명 자를 사용하여 KeFlushIoBuffers 를 호출해야 합니다.
미니포트 드라이버가 호출하는 경우 NdisMAllocateSharedMemoryAsyncEx 또는 NdisMAllocateSharedMemory, NIC가 제거될 때, 즉 MiniportHaltEx 함수가 호출될 때 NdisMFreeSharedMemory에 대한 하나 이상의 호출을 사용하여 모든 미해결 할당을 해제해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | NDIS 6.0 이상에서 지원됩니다. |
대상 플랫폼 | 유니버설 |
헤더 | ndis.h(Ndis.h 포함) |
라이브러리 | Ndis.lib |
IRQL | PASSIVE_LEVEL |