관리 메뉴

Jsecurity

가상메모리_정리 본문

포렌식/디지털 포렌식

가상메모리_정리

Great king 2019. 4. 9. 21:38

페이징 (paging)

페이징 방식에서는 가상메모리상의 주소공간을 일정한 크기의 페이지로 분할하게 되는데 실제 메모리 또한 가상메모리와 같은 크기로 페이지를 분할하게 된다. 페이지는 1Kbyte, 2Kbyte, 4Kbyte등으로 시스템에 따라 그 크기가 정해져 있지만 대부분의 경우 4Kbyte의 크기를 사용한다.

 

가상메모리란

메모리로서 실제 존재하지는 않지만 사용자에게 있어 메모리로써의 역할을 하는 가상의 메모리, 다시 말해 프로그램이 수용될 때는 가상메모리의 크기에 맞춰 수용되는 것이다. 그러나 가상메모리에 수용된 프로그램이 실행될 때는 실제 메모리를 필요로 하게 되는 것이다.

 

다음과 같은 예를 한번 들어보자.

우리가 컴퓨터를 전공하게 된다면 학습에 필요한 서적들은 아마도 수 백 권에 이를 것이다. 그러나 만약 책상에 보관할 수 있는 분량만큼의 서적을 구입할 수밖에 없다면 어떨까. 공부할 책들을 최소화하기 위해 몇 일 밤낮 고생을 해야 할지도 모르겠다. 그러나 책장을 마련해 그곳에 필요한 컴퓨터 관련 책들을 꽂아두고 당장 필요한 책들을 뽑아 책상으로 옮겨온다면 책상 크기에 맞춰 서적을 구입하는 문제는 해결될 것이다. 여기서 책들은 프로그램, 책장이 바로 가상메모리이고 책상은 실제 메모리가 되는 것이다.

 

가상 메모리와 실제 메모리의 관계

가상메모리 안에 프로그램이 실행될 때는 실제메모리에 머물러 있어야 한다.

그러나 프로그램 실행 시 반드시 프로그램 전체가 실제 메모리에 있을 필요는 없다. 현재 실행되어야 하는 부분만이 실제 메모리에 옮겨져 있으면 되는 것이므로 실제 메모리용량 보다 큰 프로그램이 가상 메모리의 등장으로 실행 가능한 것이다.

 

 

mapping이란

가상메모리에 프로그램이 실행될 경우 어떤 과정을 통해 실제 메모리로 옮겨지게 되는데 이를 mapping이라고 한다. 현재 mappingMMU라는 하드웨어에 의해 지원되고 있다.

 

paging이란

페이징 방식에서는 가상메모리상의 주소공간을 일정한 크기의 페이지로 분할하게 되는데 실제 메모리 또한 가상메모리와 같은 크기로 페이지를 분할하게 된다.

 

page table이란

페이지테이블은 가상메모리의 페이지넘버와 실제메모리의 페이지프레임이 하나의 순서쌍으로 저장하고 있는 도표이다. 이러한 도표를 사용하여 프로그램에서 사용되는 가상주소를 실제메모리주소로 변환되게 된다.

 

32bit의 가상주소비트

32bit의 가상주소비트가 보내지면 이중 20bit를 차지하는 가상페이지넘버를 가지고 실제 메모리상의 페이지프레임의 시작번지를 찾고 페이지내부주소(offset)를 가지고 현재 필요로 하는 데이터가 페이지프레임 내부 어디에 위치해 있나를 확인하게 된다. 바로 페이지프레임 시작번지에 내부 주소를 더해야만 실제 주소가 구해지는 것이다.

 

TLB ?

  일종의 page table cahe라고 볼 수 있다. 페이지 테이블은 메인 메모리에 저장되기 때문에, 프로그램에 의한 모든 메모리 접근은 최소 두 번 필요하게 된다. 실제 주소를 얻기 위한 메모리 주소 접근(cpu로 부터 생성된 가상주소를 메모리에 있는 page table을 통해 실제주소로 변환시킨다.) 한번과 데이터를 얻기위한 또한 번의 접근이 필요하다.

 

page out이란?

Page out은 기존에 사용중인 페이지프레임의 내용을 스왑 스페이스에 저장하고 그 페이지프레임을 현재 필요로 하는 다른 프로그램에 주는 것을 말한다. 반대로 page in은 스왑 스페이스에 머물러있는 내용을 다시 메모리로 불러들여 페이지프레임을 제공하는 것을 말한다. 프로그램이 수행될 때마다 재빠르게 매핑 시켜주기 위해선 다른 프로그램이 사용하지 않고 있는 free page가 필요한데 free page가 모자라게 되면 page out이 발생하는 것이다.

 

 

 swap out이란?

시스템안에 메모리가 부족하다면 메모리안에 사용빈도수가 적은 프로세스들을 내보내게 되는데 메모리가 상당히 많이 부족하다고 인식되면 프로그램을 통째로 swap space로 내보내게 되는 것이다. 바로 메모리에서 프로그램을 통째로 내보내는 것을 swap out이라고 한다.

 

 

 page fault?

page fault라는 것은 프로그램에서 접근하려고 하는 페이지프레임이 메모리에 없음을 뜻한다. 이렇게 되면 free page를 가져와 페이지 프레임 넘버를 가지고 PTE를 만들게 되는 것이다.

 

 

 Multilevel page table이란?

필요한 페이지 테이블 엔트리만을 구성하기 위해 레벌 1의 테이블에선 페이지 디렉토리를 통해 현재 필요한 페이지테이블 엔트리들의 주소를 갖게 되고 이를 통해 레벨 2의 테이블에선 현재 쓰일 페이지프레임 넘버만을 가진 페이지 테이블을 형성하게 된다.

 

 

1. 페이지 디렉토리와 페이지 테이블

페이징 기능을 사용하지 않았을 때 선형 주소는 물리주소와 같습니다. 그러나 페이징 기능을 사용하면, 논리 주소와 물리 주소의 사이에 선형 주소가 존재하고 따라서 주소를 변경해 주어야 합니다.

 

1) 페이지 디렉토리

-페이지 디렉토리는 1024개의 디렉토리 엔트리로 구성된 데이터 입니다. 시스템에 하나만 존재합니다.

-각각의 디렉토리 엔트리에는 페이지 테이블의 첫 주소, 페이지 테이블의 포인터를 가지고 있습니다. 따라서 시스템에는 1024개의 페이지 테이블이 존재한다고 볼수 있습니다.

 

2) 페이지 테이블

- 프로세스의 페이지 정보를 저장하고 각 프로세스의 메모리가 실제 메모리와 어떻게 맵핑되어 있는지를 나타내는 테이블

- 각각의 페이지 테이블은 또 1024개의 페이지 테이블 엔트리를 가지고 있고 디렉토리 엔트리와 비슷한 구조를 가지고 있습니다. 페이지 테이블의 엔트리는 4KB의 물리 주소, 즉 페이지의 포인터를 가지고 있습니다.

- 하나의 프로세스는 하나의 페이지 테이블을 갖는다.

- 페이지 테이블 엔트리로 구성되어 있다.

- 페이지 테이블의 인덱스는 페이지 번호를, 내용은 해당 페이지에 할당된 프레임의 시작 주소를 나타낸다.

인덱스 : 페이지 번호

내용 : 해당 페이지에 할당된 물리 메모리 시작주소

- 이 프레임의 시작주소와 페이지 주소를 결합하여 해당 페이지에 할당된 실제 물리적 메모리의 주소를 알 수 있다.

 

3). 선형주소를 물리주소로

세그먼트를 이용해 산출된 선형 주소는 1)최상위 10비트는 페이지 디렉토리에서 몇 번째 엔트리를 사용할지 결정하고, 2)그 다음 10비트는 페이지 테이블에서 몇 번재 엔트리를 사용할지 나타내며, 3)하위 12비트는 4KB 물리 페이지상에서 오프셋을 나타냅니다.

CR3 레지스터에는 페이지 디렉토리의 포인터가 저장되어 있습니다. 페이지 디렉토리의 포인터는 처음 페이지를 설정할 때 CR3 레지스터에 설정해 줍니다.

CPU는 프로그램에서 주소 지정을 하면 자동으로 세그먼테이션과 페이징을 수행하여 물리 주소를 계산 합니다. 위의 그림을 참고해주세요.

 

4).물리주소 계산

1) CR3를 참조하여 페이지 디렉토리 찾기

2) 주어진 선형 주소의 최상위 10비트를 참조하여 페이지 디렉토리의 엔트리 번호를 구해, 이 수에 4를 곱한 후 페이지 디렉토리의 포인터와 더해 페이지 디렉토리 내의 엔트리를 찾기

디렉토리 엔트리의 주소 = 선형주소의 최상위 10비트*4 + 페이지 디렉토리의 포인터

3) 찾아낸 엔트리를 참조하여 페이지 테이블의 물리 주소 찾기

4) 선형 주소의 중간 10비트를 이용하여 페이지 테이블 내의 엔트리 번호 찾기

5) 페이지 테이블에서 물리 페이지의 주소를 구하기

6) 선형 주소의 하위 12비트로 물리 페이지 내에서의 오프셋을 구하여 물리 주소에 접근

 

Comments