SAN 프록시 드라이버에 대한 메모리 할당 및 해제
프록시 드라이버는 Windows 소켓 스위치가 제어 메시지를 전송하고 RDMA 작업을 수행할 수 있도록 사용자 버퍼에 대한 액세스를 설정해야 합니다. 이러한 유형의 버퍼 액세스를 요청하기 위해 프록시 드라이버는 디바이스 개체의 Flags 멤버에서 조금 DO_DIRECT_IO 설정합니다. 또한 프록시 드라이버는 요청이 있을 때마다 메시지 전송 및 RDMA에 사용되는 메모리를 할당하거나 해제해야 합니다. Windows 소켓 스위치가 SAN 서비스 공급자에게 메모리를 등록하거나 해제하도록 요청하면 SAN 서비스 공급자는 프록시 드라이버에 각각 실제 메모리를 할당하거나 해제하도록 요청합니다. 버퍼 액세스 설정 및 메모리 할당 및 해제에 대한 자세한 내용은 메모리 관리 및 버퍼 관리를 참조하세요.
RDMA에 대한 메모리 부족 할당
프록시 드라이버는 RDMA 작업에 액세스할 수 있는 메모리를 할당해야 합니다. 프록시 드라이버는 4GB 미만의 실제 메모리를 할당할 수 없도록 구성된 시스템에서도 RDMA 작업에 낮은 메모리를 할당할 수 있습니다. 이를 NOLOWMEM 구성이라고 합니다. 프록시 드라이버는 MmAllocateContiguousMemorySpecifyCache 함수 또는 자체 DMA AllocateCommonBuffer 함수를 호출하여 낮은 메모리를 검색합니다.
DMA AllocateCommonBuffer 함수에 대한 포인터를 검색하기 위해 프록시 드라이버는 다음 단계를 수행합니다.
0은 DEVICE_DESCRIPTION 구조를 초기화한 다음 해당 SAN NIC에 대한 관련 정보를 이 구조체에 씁니다.
IoGetDmaAdapter를 호출하여 SAN NIC의 DMA 어댑터 구조에 대한 포인터를 검색합니다. 이 호출에서 드라이버는 채워진 DEVICE_DESCRIPTION 구조체에 대한 포인터를 전달합니다. IoGetDmaAdapter 는 DMA_OPERATIONS 구조체에 대한 포인터를 포함하는 DMA 어댑터 구조체에 대한 포인터를 반환합니다. DMA_OPERATIONS 시스템 정의 DMA 함수 집합에 대한 포인터를 포함합니다. 이러한 함수 중 하나는 물리적으로 연속된 DMA 버퍼를 할당하는 AllocateCommonBuffer입니다.