MmProbeAndLockPages 란

VOID MmProbeAndLockPages(
  [in, out] PMDL            MemoryDescriptorList,
  [in]      KPROCESSOR_MODE AccessMode,
  [in]      LOCK_OPERATION  Operation
);

유저가 넘겨준 버퍼(포인터 주소)가 유효한지 확인하고, 락을 건다.. 윈도우 기준(x64) 기본 페이지 단위인 4KB단위로 lock. (해당 페이지 전체) 이때 락은 데이터 접근 금지 락이 아니라 Page-Out 락이다. (고정:pinning)

MmUnlockPages를 명시적으로 호출 할때가지 메모리페이지를 pin한다.

(이 함수는 유저모드에서는 호출불가능)

page pin이 필요한 이유

실제 프로그래밍 시(유저모드) 램의 물리주소에는 절대 접근하지 못하며, 가상메모리 체계를 통해서 접근한다. 하지만 하드웨어(NIC)에서는 DMA(Direct Memory Access) 전송을 하기 때문에 PageOutLock이 필요하게 되는 것.

즉, virtual address 와 Physical address의 연결고리를 I/O완료시까지 변하지않게 고정하는 역할을 한다.

함수의 두 가지 역할

1. Probe (조사/검증)

유저모드에서 전달한 버퍼의 주소 범위가 실제로 접근 가능한지 확인. (Access Violation 방지)

2. Lock (잠금/고정)

IOCP에서 오버헤드가 되는 이유

IOCP는 비동기 모델로, WSASendWSARecv를 호출할 때마다 매번 이 과정을 거쳐야 한다. 즉, 아래와 같은 오버헤드가 I/O시마다 활성화 된다.

다만, 이러한 페이지 잠금 작업이 수만 개의 동시 접속자가 수시로 패킷을 주고받는 병렬 환경에서 발생한다면, 커널 내부의 전역 자원인 PFN(Page Frame Number) 데이터베이스Working Set Pushlock에 대한 극심한 Lock Contention(경합)을 유발한다.