WINDOWS/운영체제

[Windows] 윈도우의 메모리 구조

14J 2024. 6. 15. 15:47

 

 

 

 

1. 프로세스의 가상 주소 공간

모든 프로세스는 자신만의 가상 주소 공간을 가질 수 있습니다.

이는 가상 메모리를 활용하여 각 프로세스가 서로의 메모리 영역에 영향을 주지 않고 독립적으로 실행될 수 있게 합니다. 가상 주소 공간은 프로세스마다 고유하며, 이를 통해 메모리 보호와 격리를 구현할 수 있습니다.

 

32비트 운영체제에서는 4GB(기가 바이트) 메모리 공간을 가질 수 있습니다. 

  • 2 ^ 32  = 4,294,967,296 
  • 1GB    = 1,073,741,824

64비트 운영체제에서는 16EB(엑사 바이트) 메모리 공간을 가질 수 있습니다.

  • 2 ^ 64  = 18,446,744,073,709,551,616
  • 0부터 2 ^ 64 만큼의 주소 공간을 사용할 수 있다는 말이겠죠.

 

 

이는 프로세스 별로 가질 수 있는 가상 주소 공간입니다.

가상 메모리를 활용하여 프로세스마다 독립적인 영역으로 사용하게 할 수 있습니다.

또한 실제로 모든 영역을 물리 메모리로 할당 받은 것이 아닙니다. 메모리는 실제로 16EB가 아니기 때문입니다.

 

( 가상 메모리와 물리 메모리 )

https://devoteoneself.tistory.com/15

 

가상 메모리 시스템에서는 모든 가상 주소가 물리 메모리에 직접 매핑되지 않습니다. 대신, 필요한 부분만 물리 메모리에 매핑되어 사용됩니다. 이 기법을 통해 메모리 사용의 효율성을 높이고, 시스템의 메모리 용량 이상을 사용하는 것처럼 보이게 할 수 있습니다.

 

프로세스의 주소크기 가상 주소 범위
32비트 0x00000000 ~ 0xFFFFFFFF (4GByte) 
64비트 0x00000000'00000000 ~ 0xFFFFFFFF'FFFFFFFF (16EByte)

 

2. 가상 주소 공간의 분할

그러나 이는 너무 큰 공간입니다. 

이에 윈도우 운영체제는 OS 차원에서 사용가능한 메모리 영역을 파티션이라는 공간으로 분리해줍니다.

 

윈도우 10, 서버 2016

파티션 x86 32비트 윈도우 x64 64비트 윈도우
NULL 포인터 할당 0x00000000 ~ 0x0000FFFF 0x00000000'00000000 ~ 0x00000000'0000FFFF
유저 모드 0x00010000 ~ 0x7FFEFFFF 0x00000000'00010000 ~ 0x000007FF'FFFEFFFF
64KB 접근 금지 0x7FFF0000 ~ 0x7FFFFFFF 0x000007FF'FFFF0000 ~ 0x000007FF'FFFFFFFF
커널 모드 0x80000000 ~ 0xFFFFFFFF 0x00000800'00000000 ~ 0xFFFFFFFF'FFFFFFFF

 

 

 

2-1 널 포인터 할당 파티션

 

nullptr에 대한 엑세스를 시도하였을 때 접근 위반을 알리기 위한 영역

int* ptr = nullptr;

*ptr = 100;

 

 

 

nullptr 참조

 

 

2-2 유저 모드 

 

지금까지 프로그램을 만들고 부여 받은 메모리는 모두, 이 유저 영역에 적재되어 사용되었습니다.

프로세스가 사용하는 코드, 데이터, 힙, 스택 등의 메모리 모두 유저 영역의 메모리입니다.

( 하나의 프로그램 = 하나의 프로세스 )

 

조금 더 자세히 말하면, 해당 프로세스가상 주소 공간에 위치한 유저 영역 메모리입니다.

( 두 개의 프로세스가 있다고 할 때, Process 1의 0x1234, Process 2의 0x1234는 서로 다른 가상 주소 공간입니다. )

 

CPU 아키텍처 주소 범위 사용가능한 유저모드 크기
x86 0x00010000 ~ 0x7FFEFFFF ~ 2GB
x86 w/3GB 0x00010000 ~ 0xBFFEFFFF ~ 3GB
x64 0x00000000'00010000 ~ 0x000007FF'FFFEFFFF ~ 8192GB
IA-64 0x00000000'00010000 ~ 0x000006FB'FFFEFFFF ~ 7152GB

 

각 프로세스가 가질 수 있는 가상 주소 공간의 유저 영역의 메모리 번지입니다. 

 

 

2-3 커널 영역

해당 파티션에는 운영체제가 사용하는 메모리 영역입니다.

일반 프로세스는 직접적인 형태로는 이 영역에 접근할 수 없습니다.

 

이 영역은 운영체제가 하드웨어 제어를 포함한 스레드 스케줄링, 메모리 관리, 파일시스템 지원, 네트워크 지원들을

구현하는 모든 코드와 모든 디바이스 드라이버들이 커널 모드 파티션에 로드됩니다.

 

또한 커널 영역은 모든 프로세스가 공유하는 가상 주소 공간의 일부입니다.

프로세스 A와 프로세스 B 모두 동일한 커널 주소 공간을 참조합니다.

( 가리키는 대상이 같을 뿐, 가상 주소 공간에서 번지수는 서로 다를 수 있습니다. )

 

  • 그럼 어떤 상황에서 커널 영역에 접근할까요?

 

만약 유저 영역에서 커널의 지원을 받아야 할 경우가 생긴 경우, 시스템 콜(System Call)을 호출합니다.

시스템 콜 인터럽트(예: int 0x80 혹은 syscall 명령어)가 발생합니다.

 

 

이 과정에서 프로세스의 현재 상태(레지스터, 프로그램 카운터)를 저장하고,

CPU는 커널 모드(Ring 0)의 상태로 전환해야 합니다.

( 즉 CPU Protection Rings 개념은  CPU가 지원하는 기능입니다. ) 

 

이후에 커널 영역에 적재된 운영체제가 활용하는 코드에 접근할 수 있습니다.

 

요청된 작업을 모두 처리한 CPU는 다시 유저 모드(Ring 3) 상태로 전환하기 위해 

저장된 프로세스 상태를 복원합니다.

 

이 때문에 커널 모드로의 전환은 오버헤드가 더 발생합니다.  

 

 

 

적극 참조

 

https://jungwoong.tistory.com/44

 

[Window] 윈도우 메모리 구조

프로세스의 가상 주소 공간 모든 프로세스는 자신만의 가상 주소공간을 가지는데 32비트 프로세스는 32비트 사이즈의 주소공간을 가지고 64비트 프로세스는 64비트 사이즈의 주소공간을 가집니

jungwoong.tistory.com