본문 바로가기
운영체제/[ecourse] Windows Programming

5-1. Virtual Address Space

by 헛둘이 2022. 9. 16.
가상 메모리
  • 물리 메모리 (RAM)는 한정적이고 비싸기 때문에 HDD를 사용한다.
  • 필요할 때는 HDD에서 물리 메모리로 다시 불러온다. (보관 -> 복구를 반복)
  • HDD 안에 물리 메모리를 보관하는 공간을 페이징 파일이라고 한다.
  • 가상 메모리는 실제 설치된 물리 메모리보다 더 큰 공간을 사용할 수 있다.
Physics Storage란?
=> 물리 메모리 + 페이징 파일
=> 실행 파일과 DLL을 일컫는다.

 

 

 

페이지
  • 운영체제가 메모리를 관리할 때 사용하는 최소 단위
  • CPU별로 크기가 다르다 ( 인텔 CPU는 32/64bit 모두 4K )
  • 메모리를 관리할 때 페이지 단위로 관리한다.
  • 예를 들어 10바이트 메모리를 요청하면 OS는 4K (1페이지) 를 할당한다.
  • malloc 같은 메모리 할당 함수들이 할당받는 메모리는 그 4K에서 나눠주는 것.

 

 

 

 

프로세스 가상 주소 공간
  • 프로세스는 자기만의 가상 주소를 사용하고 OS가 실제 주소에 매핑한다.
#include <iostream>
#include <Windows.h>

int main()
{
	SYSTEM_INFO si = { 0 };
	GetSystemInfo(&si);

	printf("PAGE SIZE : %d\n", si.dwPageSize); // 페이지 크기

	MEMORYSTATUSEX mse = { 0 };
	mse.dwLength = sizeof(mse);

	GlobalMemoryStatusEx(&mse);

	printf("Total Phy Mem : %lld\n", mse.ullTotalPhys); // 물리 메모리 크기

	return 0;
}
  • 물리 메모리 크기 구하는 예제

 

 

 

 

 


가상 주소 공간
  • 32bit OS는 32bit 프로그램만 실행 가능하다.
  • 64bit OS는 32bit 뿐만 아니라 64bit 프로그램 둘 다 실행 가능하다.

 

32비트 어플리케이션의 한계점

32비트 어플리케이션은 포인터 크기가 32비트인데,
32비트로 표현할 수 있는 크기는 4G이고 0x0000'0000 ~ 0xFFFF'FFFF까지다.
그래서 아무리 물리 메모리가 많아도 4GB밖에 사용할 수 없다.
그래서 DB같이 큰 용량의 프로그램을 만드려면 64비트로 개발해야 한다.
64비트 어플리케이션은 16EB 가상 주소 공간을 사용할 수 있으니까.

 

 

가상 주소 공간의 파티션
  • OS 코드나 디바이스 드라이버는 가상 주소의 윗부분에 매핑됨 (0x8000'0000 ~ 0xFFFF'FFFF, 2GB)
  • 이 상위 2GB를 커널 모드 파티션이라고 한다. (일반 프로그램으로는 접근 불가 영역)
  • 그 아래 영역을 유저 모드 파티션이라고 하는데, 온전히 다 쓸 수 있는 것은 아님
  • 널 포인터 접근 금지 영역이 있음 (0x0000'0000 ~ 0x0001'0000, 64KB)
  • nullptr을 0으로 쓰려면 실제로 그 주소가 사용할 수 없는 주소여야 하기 때문
  • 커널 메모리 접근 금지 영역이 또 있음 (0x7FFF'0000 ~ 0x8000'0000, 64K)
  • 이 부분은 커널 모드 파티션에 접근할 수 없도록 하는 펜스 같은 역할 

 

유저모드 파티션에서 사용 가능한 최소/최대 주소 확인하기
  1. SYSTEM_INFO 구조체를 만든다.
  2. GetSystemInfo 함수를 통해 시스템 정보를 받아옴
  3. 그 구조체에 접근해서 lpMaximumApplicationAddress 멤버에 접근하면 사용 가능 최대 주소가 나옴
  4. lpMinimumApplicationAddress 멤버는 반대로 최소 주소





 

'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글

5-3. Heap Memory  (0) 2022.09.18
5-2. Virtual Memory Allocation  (0) 2022.09.18
4-2. Process ID & Handle  (0) 2022.09.13
4-1. Kernel Object  (0) 2022.09.13
3-3. 가상 주소 공간과 DLL  (0) 2022.09.12

댓글