1. 가상 메모리 정의

가상 메모리란 물리적으로 존재 하지 않는 메모리를 말하며, OS가 만들어낸 논리적인 형태의 메모리를 말한다. 가상 메모리에 저장된 데이터라고 해서 가상으로 저장 되는 것이아니라 실제로는 물리메모리나 하드 디스크에 저장된다. 가상 메모리는 VAS라는 것을 OS로부터 할당 받는다.

※VAS(Virtual Address Space) : 가상 메모리에 할당되는 주소를 말하며 물리메모리 주소와 다른 주소이다.

 32bit 시스템의 경우 4GB 크기의 가상 메모리 영역을 할당 받고, 64bit 시스템의 경우 이론적으로 17EB의 가상 메모리 영역을 할당 받지만 그 영역의 크기가 너무 크고 비효율 적이여서 8TB정도로 제한을 하고 있다. 가상 메모리의 크기는 시스템의 bit수에 따라 정해져 있고 무조건적으로 정해진 크기가 할당된다.

프로세스마다 자신에게 할당된 가상메모리의 영역을 사용하므로 시스템마다 다른 메모리 크기의 한계를 느끼지 않고 실행한다.

가상메모리라고 하면 버퍼오버플로우를 공부하면서 아래와 같이 이해하고 있었다. 

그림1. Windows 98/ME 의 가상 메모리구조

버퍼오버플로우를 공부하면서 가상메모리의 구조라고 공부했던 그림1은 Windows 98/ME 에서 사용자 영역 3GB 커널 영역 1GB로 되어있다. 또한 버퍼오버플로우 공부를 할때 리눅스환경에서 했으므로 리눅스도 포함이 되겠다. 그리고 가상메모리안에 저렇게 꽉 차있는 것이아니라 '코드 영역, 데이터영역, 스택영역 등등'은 매우 작은 공간에 불과하며, 이외에도 많은 영역이 존재한다. 

그림2. 간단한 가상 메모리 구조

그림2 처럼 윈도우 2000계열은 사용자 영역 2GB 커널 영역 2GB로 나누어져 있다. 말했듯이 코드영역 데이터영역 이외의 많은 영역을 가지고 있다.


그림3. 세분화된 가상메모리 구조

아직 나도 세세한 부분은 모르지만 앞으로 공부를 할 예정이다. 

메모리 덤프를 하면 사용자영역에 있는 데이터들은 불완전한 형태로 덤프되는 경우가 있고 커널 영역은 온전한 형태로 덤프가 되는 경우가 있는데 이러한 경우는 가상 메모리에서 사용자 영역에서 데이터가 물리적 메모리와 페이지 파일을 오고 가기 때문이다. 프로세스가 사용하는 데이터가 오랫동안 사용되지 않을 경우 페이지 파일에 저장해두고 필요할 경우 다시 물리적 메모리에 적재해 사용하는 방식 때문에 불완전한 덤프가 된다.

반면에 커널 영역은 시스템에 필요한 데이터들이고 자주 사용되는 데이터이므로 페이지 파일에 저장하지 않고 물리메모리에 저장하기 때문에 온전한 덤프가 된다.

그림4. 두 개의 다른 가상메모리가 물리메모리 참조

같은 주소안에 값을 가지는 두개의 가상 메모리가 물리 메모리에 데이터를 쓸 때 데이터를 덮어씌우지 않는다. 물리 메모리의 다른 주소에 각 각 저장이 되므로 가상메모리의 같은 주소를 사용하더라도 문제가 되지 않는다. 


2. 가상 메모리와 물리적 메모리 사이의 주소 변환

가상메모리의 주소는 32bit 시스템에서 32bit 길이를 갖는다. 가상 주소가 물리주소로 변환 될 때에는 2개의 테이블과 한개의 오프셋을 거쳐 변환된다. 메모리는 페이지라는 단위로 불리는 일정 크기의 단위를 사용하여 물리적 메모리를 관리하는데 가상주소와 물리주소의 맵핑 또한 이 페이지를 기준으로 이루어 진다.


3. 가상주소를 이용해 물리주소 찾기

각각의 페이지는 첫 번째 페이지부터 0번호가 매겨지며, 이 번호를 페이지 프레임 넘버(Page Frame Number)라고 한다. 가상주소의 구조는 다음과 같다.

가상주소 = 페이지 디렉토리 인덱스(10bit) + 페이지 테이블 인덱스(10bit) + 바이트주소 인덱스(12bit) = 32bit


그림5. 가상주소를 이용하여 물리적 주소를 찾는 과정

1. 페이지 디렉터리의 주소를 저장하고 있는 특별한 레지스터인 CR3 레지스터로 부터 값을 읽어와 현재 프로세스의 페이지 디렉터리를 찾는다.

2. 가상 주소의 페이지 디렉터리 인덱스 값으로 부터 1번에서 찾은 페이지 디렉터리의 엔트리를 찾고 그 값을 읽는다 페이지 디렉터리 엔트리에는 페이지 테이블의 주소 정보가 들어가 있다. 

3. 2번에서 찾은 페이지 테이블 인덱스 값으로 페이지 테이블 엔트리를 찾아 그 값을 읽는다. 페이지 테이블 엔트리에는 물리적 주소의 페이지 프레임 주소가 들어있다. 

4. 3번에서 찾은 메모리의 실제 페이지 프레임 주소로 이동한 다음 가상 주소의 마지막 부분에 있는 바이트 인덱스를 이용해서 실제 찾고자 하는 물리적 메모리의 주소로 이동하고 필요한 만큼 데이터를 읽는다.

페이지 디렉터리는 프로세스마다 고유하고 물리적 주소는 KPROCESS 구조 안에 저장 되어있다가 CR3 레지스터로 복사된다. 즉

페이지 디렉터리 주소는 물리적 메모리에 미리 올라가있는 것이라 볼 수 있다. 그리고 나머지 테이블은 필요시 메모리에 적재한다.

여기까지 가상메모리!


'Forensic' 카테고리의 다른 글

하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
PE(Portable Executable)구조 분석-1  (0) 2014.12.25
슬랙공간이란?  (0) 2014.11.26
윈도우 부팅 절차  (0) 2014.11.25

+ Recent posts