SAN 프록시 드라이버에 대한 메모리 할당 및 해제

프록시 드라이버는 Windows 소켓 스위치가 제어 메시지를 전송하고 RDMA 작업을 수행할 수 있도록 사용자 버퍼에 대한 액세스를 설정해야 합니다. 이러한 유형의 버퍼 액세스를 요청하기 위해 프록시 드라이버는 디바이스 개체의 Flags 멤버에서 조금 DO_DIRECT_IO 설정합니다. 또한 프록시 드라이버는 요청이 있을 때마다 메시지 전송 및 RDMA에 사용되는 메모리를 할당하거나 해제해야 합니다. Windows 소켓 스위치가 SAN 서비스 공급자에게 메모리를 등록하거나 해제하도록 요청하면 SAN 서비스 공급자는 프록시 드라이버에 각각 실제 메모리를 할당하거나 해제하도록 요청합니다. 버퍼 액세스 설정 및 메모리 할당 및 해제에 대한 자세한 내용은 메모리 관리버퍼 관리를 참조하세요.

RDMA에 대한 메모리 부족 할당

프록시 드라이버는 RDMA 작업에 액세스할 수 있는 메모리를 할당해야 합니다. 프록시 드라이버는 4GB 미만의 실제 메모리를 할당할 수 없도록 구성된 시스템에서도 RDMA 작업에 낮은 메모리를 할당할 수 있습니다. 이를 NOLOWMEM 구성이라고 합니다. 프록시 드라이버는 MmAllocateContiguousMemorySpecifyCache 함수 또는 자체 DMA AllocateCommonBuffer 함수를 호출하여 낮은 메모리를 검색합니다.

DMA AllocateCommonBuffer 함수에 대한 포인터를 검색하기 위해 프록시 드라이버는 다음 단계를 수행합니다.

  1. 0은 DEVICE_DESCRIPTION 구조를 초기화한 다음 해당 SAN NIC에 대한 관련 정보를 이 구조체에 씁니다.

  2. IoGetDmaAdapter를 호출하여 SAN NIC의 DMA 어댑터 구조에 대한 포인터를 검색합니다. 이 호출에서 드라이버는 채워진 DEVICE_DESCRIPTION 구조체에 대한 포인터를 전달합니다. IoGetDmaAdapterDMA_OPERATIONS 구조체에 대한 포인터를 포함하는 DMA 어댑터 구조체에 대한 포인터를 반환합니다. DMA_OPERATIONS 시스템 정의 DMA 함수 집합에 대한 포인터를 포함합니다. 이러한 함수 중 하나는 물리적으로 연속된 DMA 버퍼를 할당하는 AllocateCommonBuffer입니다.