가상 주소 공간
Virtual Address Space(원본 Microsoft Learn 링크)
가상 주소 공간(Virtual Address Spaces)
프로세서는 메모리 위치에 대해 읽기/쓰기 작업을 수행할 때 가상 주소를 사용한다. 이 과정에서 프로세서는 가상 주소를 실제 물리 주소로 변환한다.
가상 주소를 사용하면 다음과 같은 이점이 있다.
- 프로그램이 연속된 가상 주소 범위를 사용해 실제로는 비연속적인 물리 메모리에 있는 큰 버퍼에 접근할 수 있다.
- 프로그램이 실제 물리 메모리보다 큰 버퍼를 사용할 수 있다. 메모리가 부족할 경우 메모리 관리자는 4KB 페이지 단위로 디스크 파일에 페이지를 저장하고 필요할 때 다시 불러온다.
- 서로 다른 프로세스는 서로 격리된 가상 주소 공간을 사용한다. 한 프로세스는 다른 프로세스나 운영체제의 메모리를 임의로 수정할 수 없다.
이렇게 프로세스가 사용할 수 있는 가상 주소의 범위를 프로세스의 가상 주소 공간(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
- 절대 페이징 아웃되지 않는다
- 커널 모드 코드가 언제든 접근 가능해야 하는 중요한 데이터가 여기에 할당된다

댓글남기기