2 분 소요

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비트 프로세스의 가상 주소 공간

virtualmemoryspace

  • 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)을 공유한다.

userspaceandsystemspace

32비트 Windows

  • 전체 가상 주소 공간: 4GB
  • 기본 구성
    • 하위 2GB → 사용자 공간
    • 상위 2GB → 시스템 공간
  • BCDEdit /set increaseuserva로 사용자 공간을 최대 3GB까지 늘릴 수 있다. (그만큼 시스템 공간은 줄어든다.)

64비트 Windows

  • 이론상 16EB까지 가상 주소 사용 가능하나 실제로는 일부만 사용된다.

접근 가능 범위

  • 사용자 모드 코드: 사용자 공간만 접근 가능
  • 커널 모드 코드: 사용자 공간 + 시스템 공간 모두 접근 가능

드라이버는 사용자 공간 주소를 직접 다룰 때 특히 주의해야 한다.

  1. 사용자 모드 프로그램이 디바이스 읽기를 요청하며 버퍼 주소를 제공한다.
  2. 드라이버는 읽기를 시작하고 즉시 반환한다.
  3. 나중에 인터럽트가 발생하면, 커널 모드 드라이버가 현재 실행 중인 임의의 프로세스 문맥에서 인터럽트를 처리한다.
  4. 이 때 사용자 공간 주소에 바로 쓰면 안 된다.
    • 해당 주소는 요청을 보낸 프로세스의 주소 공간이며, 현재 프로세스의 주소 공간이 아닐 가능성이 높기 때문이다.

Paged Pool과 Nonpaged Pool

시스템 공간은 두 종류의 동적 메모리 영역을 가진다.

1. Paged Pool

  • 필요 시 디스크로 페이징 아웃 가능
  • 물리 메모리에 항상 있을 필요가 없다

2. Nonpaged Pool

  • 절대 페이징 아웃되지 않는다
  • 커널 모드 코드가 언제든 접근 가능해야 하는 중요한 데이터가 여기에 할당된다

pool

댓글남기기