7.1 Virtual Memory
컴퓨터에는 RAM이라고 불리는 물리 메모리가 있다는 것을 알고 있을 것입니다. 그러나 이 메모리는 어떻게 액세스할까요?
물론 주소를 갖고 있지만 불행히도 그렇게 간단하지는 않습니다.
- 시스템에서 여러 프로세스가 실행중인 경우 각 프로세스의 메모리 영역을 지정하는 방법이 필요합니다.
- 또한 공간 문제가 발생하기 시작합니다. 4GB의 물리 메모리를 가지고 있지만 실행하려는 프로세스에 6GB가 필요한 경우 어떻게합니까?
- 프로그램이 실행될 때마다 동일한 주소 공간에 프로그램이 로드되지 않으면 하드 코드된 주소는 작동하지 않습니다.
- 조각화는 어떻습니까? 작은 프로그램이 종료되고 이제는 사용 가능한 메모리 영역에 새 프로세스를 위한 공간이 충분하지 않으면, 그것은 낭비된 공간입니다.
프로세스가 공간에 맞도록 충분히 작음에도 불구하고 같은 크기가 아니라면 여전히 사용되지 않은 메모리가 남아 있게됩니다.
이러한 문제와 다른 많은 문제를 해결하기 위해 모든 프로세스가 시스템상의 유일한 프로세스인 것처럼 실행될 수 있다면 어떨까요?
이것이 가상 메모리가 들어오는 위치입니다
What Is Virtual Memory
가상 메모리를 사용하면 모든 프로세스가 환상 아래에서 유일하게 실행되도록 하며
시스템 메모리의 모든 것에 접근할 수 있도록 합니다.
이러한 착시 현상을 발생시키기 위해 물리 메모리에서 실제로 로드된 위치에 관계없이 프로세스는 0x40000000과 같은 특정 주소에 로드된 것처럼 실행됩니다.
프로세스들 자신들이 놓여있다고 생각하는 장소이자 메모리를 가상 메모리라고 합니다.
프로세스가 메모리에 액세스하려고하면 가상 메모리에 액세스합니다.
프로세스가 액세스하려는 주소는 MMU (Memory Management Unit)에 의해 가상 주소에서 실제 주소로 변환됩니다.
Example:
프로세스는 실제로 0x20005000 (물리 메모리)에 있을 때 0x40000000 (가상 메모리)에서 실행되고 있다고 생각합니다.
프로그램이 가상 주소 0x40000124에 액세스하려고하면 MMU는이 주소를 실제 주소 0x20005124로 변환합니다.
이것은 프로세스가 오프셋 0x124에 위치한 주소에 접근하려고 한다는 것을 시스템이 인식하기 때문에 수행됩니다.
이를 통해 프로그램은 메모리의 어느 곳에나 로드될 수 있으며(또 다른 프로세스가 그곳에 로드되지 않는 한)
유일한 프로세스인 것처럼 메모리를 사용하도록 합니다.
가상 메모리의 또 다른 멋진 점은 프로세스를 청크로 매핑 할 수 있다는 것입니다.
예를 들어, 프로세스의 일부는 0xB0004500에서 0xB000F000에 있을 수 있고 또 다른 일부는 0xD0100000에서 0xD010C000에 있을 수 있습니다.
또 다른 프로세스는 0xC0000000에서 0xD0000000과 같은 두 청크 사이에 위치 할 수 있습니다.
Pages
모든 물리적 메모리 주소를 가상 메모리 주소에 개별적으로 매핑하는 것은 아이러니하게도 너무 많은 메모리를 차지합니다.
대신에, 물리 메모리는 보통 가상 주소에 매핑되는 페이지라고 불리는 청크에 4KB로 나뉩니다.
이런 페이지들과 해당 정보는 페이지 테이블에 저장됩니다. 페이지는 매우 복잡하지만 우리의 목적을 위해 간단한 이해가 필요합니다.
또한, 각각 4KB와 2MB인 작고 큰 페이지들이 있습니다. 큰 페이지들은 일반적으로 핵심 Windows 컴포넌트 및 I/O에 사용됩니다.
물리적 주소에서 가상 주소로 이러한 페이지를 매핑하는 작업을 MMU (Memory Management Unit)에 의해 수행됩니다.
MMU는 통상적인 데스크톱 컴퓨터의 프로세서 안에 상주하는 물리적인 하드웨어 조각입니다.
Address Translation
이제 재미있는 부분은 가상 주소가 실제 주소에 어떻게 매핑되는지입니다.
- 이 과정에서 세부 사항에 들어가는 것은 무의미하고 혼란을 더하기 때문에 실제로 일어나는 일의 단순화된 버전입니다.
각 테이블 항목은 두 부분으로 나뉩니다. 하단 12비트는 페이지 오프셋입니다.
나머지는 가상 페이지 번호입니다. 하단 12비트는 변환되지 않고 오프셋으로 처리됩니다.
~~그림~~
다음은 예입니다 (간단하고 완전하지 않으므로 이해하기 쉽습니다)
~~그림~~
1. 프로세스가 0x0002150에 액세스하려고 합니다.
2. 페이지 테이블 (가상 페이지 번호)에서 조회 할 주소는 0x0002입니다.
3. 오프셋은 0x150입니다.
4. 페이지 테이블에서 0x0002가 조회되고 0x0109로 번역됩니다.
5. 0x0109부터 오프셋 0x150이 추가됩니다.
6. 결과는 0x0109150입니다.
실제 주소 목록 아래에 "DISK"가 있음을 알 수 있습니다.
물리 메모리가 충분하지 않으면 페이지를 디스크에 넣을 수 있기 때문입니다.
가상 메모리의 기본 사항이 있습니다. 바라건데, 너무 고통스럽지 않길!
'강의정리 > Z0FCourse_Re' 카테고리의 다른 글
CURRENTLY IN DEVELOPMENT (Chapter 7 - Windows) (0) | 2020.02.04 |
---|---|
[x64] DLL/6.09 ImplementingPlayer + 6.10 Final Notes.md (0) | 2020.02.04 |
[x64] Chapter 6 - DLL/6.08 MysteryFunc.md (0) | 2020.02.03 |
[x64] Chapter 6 - DLL/6.7 PrintPlayerStats.md (0) | 2020.01.31 |
[x64] Chapter 6 - DLL/6.6 InitializePlayer.md (0) | 2020.01.30 |