MDL이란?

MDL은 가상메모리 상에서 연속되어 보이지만, 실제 물리 메모리(RAM)에서는 흩어져있는 페이지들의 지도. 커널 메모리에 존재하는 작은 구조체이다.

사용자는 VA를 사용하고, NIC같은 하드웨어는 DMA(Direct Memory Access)를 통해 RAM에 직접 데이터를 쓰고 읽어야 하므로 가상주소를 알지 못함. 하드웨어에게 어느 물리주소를(PA)에 데이터를 넣어야 하는지 정확하게 알려주기 위해 커널이 작성하는 리스트가 바로 MDL.

MDL이 담고있는 정보

실제 데이터는 MDL에 들어있는게 아니라 사용자 버퍼 쪽 페이지에 그대로 들어있으며, I/O가 끝나면 MDL객체는 보통 해제되거나 재사용된다.

MDL 생성 시 발생하는 구체적인 부하

WSASendWSARecv를 호출할 때마다 MDL이 생성된다.

1. 커널 메모리 할당 (Non-paged Pool)

MDL 자체도 데이터를 담는 구조체이므로 메모리가 필요. 이때 커널은 스왑 아웃되지 않는 Non-paged Pool 영역에서 메모리를 할당한다.

2. 페이지 테이블 탐색 (Page Table Walking)

가상 주소가 어떤 물리 주소에 매핑되어 있는지 확인하려면, CPU는 **페이지 테이블(Page Table)**을 뒤져야 함.

3. 유저 버퍼 고정 (Locking & Pinning)