가상 주소 공간
Virtual Address Space(원본 Microsoft Learn 링크)
아래는 위 문서의 번역이다.
가상 주소 공간(Virtual Address Spaces)
프로세서는 메모리 위치를 읽거나 쓸 때 가상 주소를 사용한다. 이러한 동작 동안 프로세서는 가상 주소를 물리 주소로 변환한다.
가상 주소를 사용하여 메모리에 접근하는 데에는 여러 가지 이점이 있다:
- 프로그램은 물리 메모리에서 크고 비연속적인 메모리 버퍼에 접근하기 위해 연속된 범위의 가상 주소를 사용할 수 있다.
- 프로그램은 사용 가능한 물리 메모리보다 큰 메모리 버퍼에 접근하기 위해 가상 주소 범위를 사용할 수 있다. 물리 메모리가 부족할 때 메모리 관리자는 물리 메모리의 페이지(일반적으로 4킬로바이트 크기)를 디스크 파일에 저장한다. 시스템은 필요에 따라 데이터 또는 코드 페이지를 물리 메모리와 디스크 사이에서 이동시킨다.
- 서로 다른 프로세스가 사용하는 가상 주소는 분리되어 있다. 한 프로세스의 코드는 다른 프로세스나 운영 체제가 사용 중인 물리 메모리를 변경할 수 없다.
이렇게 프로세스가 사용할 수 있는 가상 주소의 범위를 프로세스의 가상 주소 공간(Virtual Address Space)이라고 부른다. 모든 유저 모드 프로세스는 자신만의 가상 주소 공간을 가진다.
- 32비트 프로세스의 가상 주소 공간: 0x00000000 ~ 0x7FFFFFFF (약 2GB)
- 64비트 Windows의 64비트 프로세스: 0x000’00000000 ~ 0x7FFF’FFFFFFFF (약 128TB)*
가상 주소 범위는 때때로 가상 메모리(Virtual Memory)라고도 불린다.
예시: 64비트 프로세스의 가상 주소 공간

- Notepad.exe와 MyApp.exe는 각각 독립적인 가상 주소 공간을 가진다.
- Notepad가 0x7F7’93950000부터 3개의 연속된 가상 페이지를 사용한다고 해도, 이 페이지들은 물리 메모리에서는 연속적이지 않을 수 있다.
- 두 프로세스가 동일한 가상 주소를 사용하더라도, 각자 다른 물리 페이지로 매핑된다.
유저 공간(User Space)과 시스템 공간(System Space)
- 응용 프로그램(Notepad.exe, MyApp.exe 등)은 유저 모드(User Mode)에서 실행된다.
- 핵심 OS 구성 요소 및 많은 드라이버는 커널 모드(Kernel Mode)에서 실행된다.
- 유저 모드 프로세스는 각자 독립적인 유저 공간(User Space)을 가지지만, 커널 모드에서 실행되는 코드는 하나의 공용 시스템 공간(System Space)을 공유한다.

32비트 Windows
- 전체 가상 주소 공간: 4GB
- 기본 구성
- 하위 2GB → 유저 공간
- 상위 2GB → 시스템 공간
BCDEdit /set increaseuserva로 유저 공간을 최대 3GB까지 늘릴 수 있다. (그만큼 시스템 공간은 줄어든다.)
64비트 Windows
- 이론상 16EB까지 가상 주소 사용 가능하나 실제로는 일부만 사용된다.
접근 가능 범위
- 유저 모드 코드: 유저 공간만 접근 가능
- 커널 모드 코드: 유저 공간 + 시스템 공간 모두 접근 가능
드라이버는 유저 공간 주소를 직접 다룰 때 특히 주의해야 한다.
- 유저 모드 프로그램이 디바이스 읽기를 요청하며 버퍼 주소를 제공한다.
- 드라이버는 읽기를 시작하고 즉시 반환한다.
- 나중에 인터럽트가 발생하면, 커널 모드 드라이버가 현재 실행 중인 임의의 프로세스 문맥에서 인터럽트를 처리한다.
- 이 때 유저 공간 주소에 바로 쓰면 안 된다.
- 해당 주소는 요청을 보낸 프로세스의 주소 공간이며, 현재 프로세스의 주소 공간이 아닐 가능성이 높기 때문이다.
Paged Pool과 Nonpaged Pool
시스템 공간은 두 종류의 동적 메모리 영역을 가진다.
1. Paged Pool
- 필요 시 디스크로 페이징 아웃 가능
- 물리 메모리에 항상 있을 필요가 없다
2. Nonpaged Pool
- 절대 페이징 아웃되지 않는다
- 커널 모드 코드가 언제든 접근 가능해야 하는 중요한 데이터가 여기에 할당된다

댓글남기기