가상 주소 공간

프로세서는 메모리 위치를 읽거나 쓸 때 가상 주소를 사용합니다. 이러한 작업 중에 프로세서는 가상 주소를 실제 주소로 변환합니다.

가상 주소를 사용하여 메모리에 액세스하는 데는 다음과 같은 몇 가지 이점이 있습니다.

  • 프로그램은 연속된 범위의 가상 주소를 사용하여 실제 메모리의 크고 인접하지 않은 메모리 버퍼에 액세스할 수 있습니다.

  • 프로그램은 다양한 가상 주소를 사용하여 사용 가능한 실제 메모리보다 큰 메모리 버퍼에 액세스할 수 있습니다. 실제 메모리가 부족하면 메모리 관리자는 실제 메모리 페이지(일반적으로 크기가 4KB)를 디스크 파일에 저장합니다. 시스템은 필요에 따라 실제 메모리와 디스크 간에 데이터 또는 코드 페이지를 이동합니다.

  • 서로 다른 프로세스에서 사용하는 가상 주소는 격리됩니다. 한 프로세스의 코드는 다른 프로세스 또는 운영 체제에서 사용되는 실제 메모리를 변경할 수 없습니다.

프로세스에서 사용할 수 있는 가상 주소 범위를 프로세스의 가상 주소 공간이라고 합니다. 각 사용자 모드 프로세스 에는 고유한 프라이빗 가상 주소 공간이 있습니다.

  • 32비트 프로세스에는 일반적으로 0x7FFFFFFF 통해 0x00000000 2기가바이트 범위 내에 가상 주소 공간이 있습니다.

  • 64비트 Windows의 64비트 프로세스에는 0x7FFF'FFFFFFFF를 통해 128테라바이트 범위 0x000'000000000 내의 가상 주소 공간이 있습니다.

가상 주소의 범위를 가상 메모리 범위라고도 합니다. 자세한 내용은 메모리 및 주소 공간 제한을 참조하세요.

다음 다이어그램에서는 가상 주소 공간의 몇 가지 주요 기능을 보여 줍니다.

Notepad.exe 및 MyApp.exe 두 개의 64비트 프로세스에 대한 가상 주소 공간을 보여 주는 다이어그램

다이어그램은 Notepad.exe 및 MyApp.exe 두 개의 64비트 프로세스에 대한 가상 주소 공간을 보여줍니다. 각 프로세스에는 0x000'00000000부터 0x7FF'FFFFFFFF까지 고유한 가상 주소 공간이 있습니다. 음영 처리된 각 블록은 가상 또는 실제 메모리의 한 페이지(4KB 크기)를 나타냅니다. 메모장 프로세스는 0x7F7'93950000부터 세 개의 연속된 가상 주소 페이지를 사용합니다. 그러나 이러한 세 개의 연속된 가상 주소 페이지는 실제 메모리의 인접하지 않은 페이지에 매핑됩니다. 또한 두 프로세스 모두 0x7F7'93950000부터 가상 메모리 페이지를 사용하지만 이러한 가상 페이지는 실제 메모리의 다른 페이지에 매핑됩니다.

사용자 공간 및 시스템 공간

Notepad.exe 및 MyApp.exe 같은 프로세스는 사용자 모드에서 실행됩니다. 핵심 운영 체제 구성 요소와 많은 드라이버가 더 권한 있는 커널 모드에서 실행됩니다. 프로세서 모드에 대한 자세한 내용은 사용자 모드 및 커널 모드를 참조하세요.

각 사용자 모드 프로세스에는 고유한 프라이빗 가상 주소 공간이 있지만 커널 모드에서 실행되는 모든 코드는 시스템 공간이라는 단일 가상 주소 공간을 공유합니다. 사용자 모드 프로세스의 가상 주소 공간을 사용자 공간이라고 합니다.

32비트 Windows에서 사용 가능한 총 가상 주소 공간은 2^32바이트(4기가바이트)입니다. 일반적으로 하위 2기가바이트는 사용자 공간에 사용되며 상위 2기가바이트는 시스템 공간에 사용됩니다.

32비트 Windows에서 사용 가능한 총 가상 주소 공간을 사용자 공간 및 시스템 공간으로 분할하는 다이어그램

32비트 Windows에서는 부팅 시 사용자 공간에 2기가바이트 이상을 사용할 수 있도록 지정할 수 있습니다. 그러나 이는 시스템 공간에 사용할 수 있는 가상 주소가 적다는 것을 의미합니다. 사용자 공간의 크기를 최대 3기가바이트까지 늘릴 수 있으며 시스템 공간에는 1기가바이트만 남습니다. 사용자 공간의 크기를 늘리려면 BCDEdit /set increaseuserva를 사용합니다.

64비트 Windows에서 가상 주소 공간의 이론적 크기는 2^64바이트(16 exabytes)이지만 16-exabyte 범위의 작은 부분만 실제로 사용됩니다.

사용자 모드에서 실행되는 코드는 사용자 공간에 액세스할 수 있지만 시스템 공간에는 액세스할 수 없습니다. 이 제한은 사용자 모드 코드가 보호된 운영 체제 데이터 구조를 읽거나 변경하는 것을 방지합니다. 커널 모드에서 실행되는 코드는 사용자 공간과 시스템 공간 모두에 액세스할 수 있습니다. 즉, 커널 모드에서 실행되는 코드는 현재 사용자 모드 프로세스의 시스템 공간 및 가상 주소 공간에 액세스할 수 있습니다.

커널 모드에서 실행되는 드라이버는 사용자 공간의 주소에서 직접 읽거나 쓸 때 주의해야 합니다. 다음 시나리오에서는 이유를 보여 줍니다.

  1. 사용자 모드 프로그램은 디바이스에서 일부 데이터를 읽는 요청을 시작합니다. 프로그램은 데이터를 수신할 버퍼의 시작 주소를 제공합니다.

  2. 커널 모드에서 실행되는 디바이스 드라이버 루틴은 읽기 작업을 시작하고 해당 호출자에게 컨트롤을 반환합니다.

  3. 나중에 디바이스는 현재 실행 중인 스레드를 중단하여 읽기 작업이 완료되었음을 나타냅니다. 커널 모드 드라이버 루틴은 임의 프로세스에 속하는 이 임의 스레드의 인터럽트를 처리합니다.

  4. 이 시점에서 드라이버는 1단계에서 사용자 모드 프로그램이 제공한 시작 주소에 데이터를 작성해서는 안 됩니다. 이 주소는 요청을 시작한 프로세스의 가상 주소 공간에 있으며 현재 프로세스와 동일하지 않을 수 있습니다.

페이징된 풀 및 비페이지 풀

사용자 공간에서는 필요에 따라 모든 실제 메모리 페이지를 디스크 파일로 페이징할 수 있습니다. 시스템 공간에서는 일부 실제 페이지를 페이징할 수 있고 다른 페이지는 페이징할 수 없습니다. 시스템 공간에는 메모리를 동적으로 할당하기 위한 두 영역인 페이징 풀과 비페이지 풀이 있습니다.

페이징 풀에 할당된 메모리는 필요에 따라 디스크 파일로 페이징할 수 있습니다. 페이지가 지정되지 않은 풀에 할당된 메모리는 디스크 파일로 페이징할 수 없습니다.

페이징된 풀의 메모리 할당 간 차이를 보여 주는 다이어그램

디바이스 노드 및 디바이스 스택

사용자 모드 및 커널 모드