embelog
Chapter15. VirtualAlloc 본문
// Commit a page of storage
PTSTR psZData = VirtualAlloc(
NULL, // 선호 어드레스 없음
1024, // 1k byte 할당 요청
MEM_RESERVE | // 가상 어드레스 공간 예약
MEM_COMIT, // 물리적 저장소 할당
PAGE_READWRITE // 읽기 쓰기 가능 페이지 속성
);
1. 요청한 공간만큼의 가상 메모리 공간을 예약하고 커밋한다.
(1k byte 요청하였으나, 페이지 단위로 라운드업(4k byte) 하여 페이지 할당)
여기서 MEM_RESERVE 는 가상 메모리 공간을 예약하는 것을 말하고,
MEM_COMIT 은 가상 메모리 공간에 물리적 저장소를 매핑하는 것을 말한다.
Virtualloc 함수 실행 후 해당 물리저장소는 페이징 파일을 이용한다.
// copy data
_tcscpy_s(pszData, 1024, szTestData);
2. 얻어진 가상메모리 주소 pszData로 메모리 복사를 시도한다. ( 메모리 접근 시도 )
하지만, 메모리 접근 시 가상 주소는 물리메모리에 매핑되어 있지 않고, Paging File(디스크 공간) 에 매핑되어 있으므로, 페이징 폴트를 일으킨다.
4. 이때, 페이지 핸들러가 동작하여, 해당 Paging File의 페이지를 물리 메모리공간에 로드한다.
이때 물리 메모리 페이지는 0으로 채워진다.
5. 페이지 핸들러는 가상 주소 <-> Paging File로 매핑되어 있던 페이지 테이블 정보를
가상 주소 <-> 물리 메모리 번지로 변경시킨다.
6. 메모리 접근을 재시도 한다. 이제는 가상 주소가실제 물리 메모리에 매핑이 되어 있으므로,
가상 주소로 접근 시 페이징 폴트가 발생하지 않는다.
따라서 가상 주소에서 실제 물리 메모리로 접근하여, 정상적인 읽기/ 쓰기가 가능해진다.
이처럼 매핑 정보 변경 뒤, Memcpy를 다시 수행하여, 메모리 복사를 완료한다.
7. Virtualloc 가상 메모리의 할당은 페이징파일(디스크)에서 이루어지고, 해당 주소로 접근 시에 비로소 페이징 파일의 페이지를 메모리에 로드(복사) 한 뒤 메모리에 재 접근한다.
이는 마치 메모리를 디스크의 캐시처럼 사용하는 방법이다.
'Windows Via C++' 카테고리의 다른 글
Chapter3. 커널 오브젝트1 (0) | 2021.05.03 |
---|---|
Chapter2. 문자와 문자열로 작업하기 (0) | 2021.04.18 |
Chapter1. 에러 핸들링 (0) | 2021.04.14 |