VOID MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
유저가 넘겨준 버퍼(포인터 주소)가 유효한지 확인하고, 락을 건다.. 윈도우 기준(x64) 기본 페이지 단위인 4KB단위로 lock. (해당 페이지 전체) 이때 락은 데이터 접근 금지 락이 아니라 Page-Out 락이다. (고정:pinning)
MmUnlockPages를 명시적으로 호출 할때가지 메모리페이지를 pin한다.
(이 함수는 유저모드에서는 호출불가능)
실제 프로그래밍 시(유저모드) 램의 물리주소에는 절대 접근하지 못하며, 가상메모리 체계를 통해서 접근한다. 하지만 하드웨어(NIC)에서는 DMA(Direct Memory Access) 전송을 하기 때문에 PageOutLock이 필요하게 되는 것.
즉, virtual address 와 Physical address의 연결고리를 I/O완료시까지 변하지않게 고정하는 역할을 한다.
1. Probe (조사/검증)
유저모드에서 전달한 버퍼의 주소 범위가 실제로 접근 가능한지 확인. (Access Violation 방지)
2. Lock (잠금/고정)
MmUnlockPages가 호출될 때까지 절대로 디스크로 페이지 아웃되지 않음.IOCP는 비동기 모델로, WSASend나 WSARecv를 호출할 때마다 매번 이 과정을 거쳐야 한다. 즉, 아래와 같은 오버헤드가 I/O시마다 활성화 된다.
다만, 이러한 페이지 잠금 작업이 수만 개의 동시 접속자가 수시로 패킷을 주고받는 병렬 환경에서 발생한다면, 커널 내부의 전역 자원인 PFN(Page Frame Number) 데이터베이스나 Working Set Pushlock에 대한 극심한 Lock Contention(경합)을 유발한다.