A Common Topic Explained - Sharing Memory Between Drivers and Applications
일일이 다 찾아서 확인하는 중.
요점은 DMA를 위한 공유 메모리 버퍼를 만들어놓고, 특정 프로세스의 컨텍스트에서 MmMapLockedPagesSpecifyCache를 호출하면 현재 프로세스에 매핑된 가상 주소를 얻을 수 있다는 것이다.
NdisMAllocateSharedMemory로 DMA 주소와 커널 가상 주소를 얻은 다음, 가상 주소를 넘겨서 IoAllocateMdl로 MDL 만들고, MmBuildMdlForNonPagedPool 호출해서 물리 주소를 얻은 다음, MmMapLockedPages를 이용해서 유저모드에 매핑하면 되는 것. 이렇게 하면 흔히 말하는 Zero Copy가 가능해진다.
단, 유저모드 프로세스 종료 시 해제하는 것을 잊으면 새 된다.
일일이 다 찾아서 확인하는 중.
요점은 DMA를 위한 공유 메모리 버퍼를 만들어놓고, 특정 프로세스의 컨텍스트에서 MmMapLockedPagesSpecifyCache를 호출하면 현재 프로세스에 매핑된 가상 주소를 얻을 수 있다는 것이다.
NdisMAllocateSharedMemory로 DMA 주소와 커널 가상 주소를 얻은 다음, 가상 주소를 넘겨서 IoAllocateMdl로 MDL 만들고, MmBuildMdlForNonPagedPool 호출해서 물리 주소를 얻은 다음, MmMapLockedPages를 이용해서 유저모드에 매핑하면 되는 것. 이렇게 하면 흔히 말하는 Zero Copy가 가능해진다.
단, 유저모드 프로세스 종료 시 해제하는 것을 잊으면 새 된다.




