embelog

Chapter15. VirtualAlloc 본문

Windows Via C++

Chapter15. VirtualAlloc

길동마누라 2021. 3. 21. 19:09
   // Commit a page of storage 
  
  	PTSTR psZData = VirtualAlloc(
       				NULL, 		  	// 선호 어드레스 없음
                 		1024, 		 	// 1k byte 할당 요청
				MEM_RESERVE | 		// 가상 어드레스 공간 예약
				MEM_COMIT, 		// 물리적 저장소 할당
				PAGE_READWRITE  	// 읽기 쓰기 가능 페이지 속성
    				 );

1.  요청한 공간만큼의 가상 메모리 공간을 예약하고 커밋한다.

    (1k byte 요청하였으나, 페이지 단위로 라운드업(4k byte) 하여 페이지 할당)

 

<Virtual Alloc 함수 호출 시: 가상메모리 매핑 정보만 업데이트>

 

 여기서 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