IT, 소프트웨어

5장. 메모리 관리 (Memory Management)

꿈있는 내일 2011. 1. 27. 17:57

 

Chapter 5  메모리 관리 (Memory Management)

 

80386 은 논리 주소 (즉, 프로그래머가 볼 수 있는 주소)를 물리적 주소 (즉, 물리적 메모리상의 주소)로 두 단계를 커쳐 변환한다.

 

l        세그먼트 변환, 즉 논리 주소(세그먼트 선택기와 세그먼트 오프셋으로 구성된)가 선형 주소로의 변환l        페이지 변환, 선형 주소에서 물리적 주소로의 변환. 이 단계는 선택적이고 시스템-소프트웨어 디자이너의 선택에 달려 있다.

 

이러한 변환은 애플리케이션 프로그래머에게는 보이지 않게 수행된다. 그림 5-1은 고도로 추상화된 두 변환을 보여준다.

 

그림 5-1 과 이 장의 나머지는 단순화된 80386 주소 메커니즘을 보여준다. 실제로는 주소화 메커니즘은 메모리 보호 특성도 포함한다. 하지만 단순화하기 위해 보호 주제는 다른 장인 6장에서 다룬다.

 

그림 5-1.  주소 변환도

 

 

 

5.1 세그먼트 변환

 

그림 5-2는 보다 상세하게 프로세서가 논리 주소를 선형 주소로 변환하는 방법을 보여준다.

 

이러한 변환을 하기 위해 프로세서는 다음 데이터 구조를 사용한다:

 

l        기술자(Descriptors)l        기술자 테이블(Descriptor tables)l        선택기(Selectors)l        세그먼트 레지스터

 

 

5.1.1 기술자(Descriptors)

 

세그먼트 기술자는 논리 주소를 선형 주소로 매핑하는 데 필요한 데이터를 프로세서에 제공한다. 기술자는 애플리케이션 프로그래머가 아니라 컴파일러, 링커, 로더, 혹은 OS가 생성한다. 그림 5-3은 두 가지 일반 기술자 형식을 나타낸다. 모든 세그먼트 기술자 타입은 이들 중 하나이다. 세그먼트-기술자 필드들은:

 

BASE: 4 기가 바이트 선형 주소 공간 내의 세그먼트 위치를 정의한다. 프로세서는 단일 32비트 값을 만들기 위해 베이스 주소 세 조각을 연결한다.

 

LIMIT: 세그먼트 크기를 정의한다. 프로세서가 한계 필드의 두 부분을 연결할 때, 20비트 값이 나온다. 프로세서는 한계 필드를 입상도(granunarity) 비트 셋팅에 따라 둘 중 하나로 해석한다.

 

1.       한 바이트 단위로 1 MB 까지 한계를 정의2.       4 KB 단위로 4 기가 바이트까지 한계를 정의. 한계는 적재될 때 12 비트 왼쪽으로 시프트되고 낮은 자리수로 값이 1인 비트들이 삽입된다.

 

입상도 비트(Granunarity bit): LIMIT 필드가 해석되는 단위를 지정. 해당 비트가 비어 있으면 한계는 1 바이트 단위로 해석된다; 셋팅되면 한계는 4 KB단위로 해석된다.

 

TYPE: 여러 기술자들을 구분한다.

 

DPL (Descriptor Privilege Level): 보호 메카이즘에서 사용된다( 6장 참조).

 

세그먼트-존재 비트: 만일 이 비트가 0이면 기술자는 주소 변환에서 무의미하다; 프로세서는 기술자선택기가 세그먼트 레지스터로 적재되었을 때 예외 신호를 발생시킨다. 그림 5-4는 세그먼트-존재 비트가 0일 때 기술자 형식을 나타낸다. OS는 AVAILABLE로 표시된 위치는 자유로이 사용할 수 있다. 세그먼트-기반 가상 메모리를 지원하는 OS는 아래 방법 중 하나로 세그먼트-존재 비트를 비운다.

 

l        세그먼트로 나누어진 선형 공간이 페이징 메커니즘에 의해 매핑되지 않았을 때l        세그먼트가 메모리에 있지 않을 때

 

접근된 비트(Accessed bit): 프로세서는 세그먼트가 접근된 경우 이 비트를 셋팅한다; 즉, 기술자 선택기가 세그먼트 레지스터에 적재되었거나 선택기 테스트 인스트럭션이 사용할 떄이다. 세그먼트 레벨에서 가상 메모리를 지원하는 OS는 주기적으로 이 비트를 테스팅하고 비움으로써 세그먼트 사용 빈도를 관찰한다.

 

기술자 생성과 유지는 시스템 소프트웨어의 역할이고, 대개 컴파일러, 프로그램 로더 혹은 시스템 빌더 그리고 빈도체크 시스템의 조력을 필요로 한다.

 

 

그림 5-2.  세그먼트 변환

 

 

 

 

 

 

그림 5-3.  일반적인 세그먼트-기술자 형식

 

 

 

 

 

 

5.1.2 기술자 테이블

 

세그먼트 기술자는 다음 두 가지 기술자 테이블 중 하나에 저장된다.

 

l        GDT (The global descriptor table)l        LDT (a local descriptor table)

 

기술자 테이블은 단순히 그림 5-5에서 보는 것처럼 기술자들을 포함한 8바이트 메모리 배열이다. 기술자 테이블은 길이는 가변이고 8192 (2^13) 까지 기술자를 포함할 수 있다. 하지만 GDT의 첫 진입점(INDEX=0)은 프로세서에서 사용되지 않는다.

 

프로세서는 GDT와 메모리에 있는 LDT를 GDTR과 LDTR 레지스터를 사용해서 배치한다. 이 레지스터들은 선형 주소 공간에서 테이블의 베이스 주소를 저장하고 세그먼트 한계를 저장한다. LGDT 와 SGDT 인스트럭션으로 GDTR 레지스터에 접근할 수 있다; LLDT와 SLDT로 LDTR 에 접근할 수 있다.

 

그림 5-4.  존재하지 않는 기술자 형식

 

 

 

 

그림 5-5.  기술자 테이블

 

 

 

 

 

5.1.3 선택기

 

논리 주소의 선택기 부분은 기술자 테이블을 명시하고 테이블 내의 기술자를 인덱싱함으로써 한 기술자를 나타낸다. 선택기는 애플리케이션 프로그래머에게 포인터 변수내 일부 필드로써 보일 것이지만, 선택기의 값들은 대개 (고정적으로) 링커나, 링커 로더에서 할당한다. 그림 5-6에서 선택기의 형식을 보여준다.

 

Index: 기술자 테이블에서 8192 기술자 중 하나를 선택한다. 프로세서는 단지 이 인덱스에 8을 곱하고(기술자 길이), 테이블에 있는 적절한 세그먼트 기술자에 접근하기 위해 결과값을 기술자 테이블의 베이스 주소에 더한다.

 

Table Indicator: 선택기가 참조하는 기술자 테이블을 명시한다. 0은 GDT를 나타낸다; 1은 LDT를 나타낸다.

 

Requested Privilege Level: 보호 메커니즘에서 사용한다( 6장 참조).

 

GDT의 첫 진입점은 프로세서가 사용하지 않기 때문에, 인덱스가 0이거나 테이블 지시기(Table Indicator)가 0(즉 GDT의 첫 진입점을 가리키는 선택기)인 선택기는 공(null) 선택기로 사용될 수 있다. 프로세서는 세그먼트 레지스터(CS나 SS가 아닌)에 공 선택기가 적재되었을 때, 예외를 발생하지 않는다. 하지만 세그먼트 레지스터가 메모리에 접근하려할 때 예외를 발생시킨다. 이런 특성은 우발적인 참조를 감시하기 위해 사용되지 않는 세그먼트 레지스터를 초기화할 때 유용하다.

 

그림 5-6.  선택기 형식

 

 

 

 

그림 5-7.  세그먼트 레지스터

 

 

 

 

 

5.1.4 세그먼트 레지스터

 

80386은 세그먼트 레지스터의 기술자에서 정보를 적재한다, 그래서 메모리에 접근할 때마다 매번 기술자 테이블을 참조하는 것을 막을 수 있다.

 

그림 5-7에서처럼, 모든 세그먼트 레지스터에는 “가시영역(visible)”과 “비가시영역(invisible)”이 있다. 세그먼트 주소 레지스터의 가시 영역은 마치 16비트 레지스터인 것처럼 프로그래머에 의해서 조작된다. 비가시영역은 프로세서에 의해서 조작된다.

 

이러한 레지스터를 적재하는 연산은 일반적인 프로그램 인스트럭션들( 이전 3장에서 설명한)이다. 인스트럭션들은 두 부류가 있다:

 

1.       직접적인 적재 인스트럭션; 예를 들면 MOV, POP, LDS, LSS, LGS, LFS. 이 인스트럭션은 명시적으로 세그먼트 레지스터를 참조한다.

2.       암묵적 적재 인스트럭션; 예를 들면 far CALL과 JMP. 이 인스트럭션은 내부적으로 CS 레지스터를 참조하고 그 곳에 새로운 값을 적재한다.

 

이러한 인스트럭션을 사용해서 프로그램은 16비트 선택기로 세그먼트 레지스터의 가시영역을 적재할 수 있다. 프로세서는 자동적으로 베이트 주소, 한계, 타입, 그리고 그 밖의 필요한 정보들을 기술자 테이블에서 읽어서 세그먼트 레지스터의 비가시영역에 적재한다.

 

대부분 인스트럭션은 세그먼트 레지스터에 이미 적재된 선택기의 세그먼트에 있는 데이터를 참조하기 떄문에, 프로세서는 추가 부하없이 세그먼트 베이스 주소에 인스트럭션에서 제공하는 세그먼트관련 오프셋을 더할 수 있다.

 

 

5.2 페이지 변환( Page Translation)

 

주소 변환의 두 번째 단계에서, 80386은 선형 주소를 물리 주소로 변환한다. 이 주소 변환단계는 페이지 기반 가상 메모리 시스템과 페이지-레벨 보호에 필요한 기본 특성들을 구현한다.

 

페이지-변환 단계는 선택적이다. 페이지 변환은 CR0의 PG비트가 셋팅되었을 때만 유효하다. 이 비트는 특히 소프트웨어 초기화 단계에서 OS에 의해 셋팅된다. PG 비트는 OS가 다중 가상 8086 태스크, 페이지-기반 보호, 혹은 페이지-기반 가상 메모리를 구현한다면 셋팅되어야 한다.

 

 

5.2.1 페이지 프레임(Page Frame)

 

페이지 프레임은 4K 바이트 단위의 연속된 물리 주소 공간이다. 페이지는 1바이트의 경계가 있고 크기는 고정이다.

 

 

5.2.2 선형 주소(Linear Address)

 

선형 주소는 페이지 테이블, 페이지 테이블 내의 패이지, 페이지 내의 오프셋을 명시함으로써 물리 주소를 간접적으로 참조한다. 그림 5-8은 선형 주소의 형식을 보여준다.

 

그림 5-9는 프로세서가 어떻게 선형 주소의 DIR, PAGE 그리고 OFFSET 필드를 두 레벨의 페이지 테이블을 참조해서 문리적 주소로 변환하는지를 보여준다. 주소화 메커니즘은 DIR 필드는 페이지 디렉토리의 인덱스로 사용하고, PAGE 필드를 페이지 디렉토리에서 결정된 페이지 테이블의 인덱스로 사용하고, OFFSET 필드를 페이지 테이블에서 결정된 페이지 내의 바이트를 주소화 하는 데 사용한다.

 

그림 5-8.  선형 주소 형식

 

 

 

 

그림 5-9.  페이지 변환

 

 

 

 

 

5.2.3 페이지 테이블

 

페이지 테이블은 단순히 페이지를 지정하는 32비트 배열이다. 페이지 테이블은 그 자체로 페이지이고, 따라서 4K 바이트의 메모리 혹은 최대 1K 32비트 진입점을 포함하고 있다.

 

테이블의 두 레벨은 메모리 페이지를 주소화 하는 데 사용된다. 페이지 디렉토리는 보다 고레벨에 있다. 페이지 디렉토리는 두 번째 레벨의 1K 페이지 테이블까지 주소화한다. 따라서 한 페이지 디렉토리에서 주소화된 모든 테이블은 1M 페이지(2^20)까지 주소화할 수 있다. 각 페이지는 4K 바이트(2^12)바이트까지 포함할 수 있기 때문에, 한 페이지 디렉토리의 테이블들은 80386의 전체 물리적 공간을 포함할 수 있다(2^12의 2^20 회 = 2^32).

 

현재 페이지 디렉토리의 물리적 주소는 페이지 디렉토리 기본 레지스터(PDBR)라 불리는 CPU 레지스터 CR3에 저장된다. 메모리 관리는 소프트웨어는 모든 태스크에 대해 하나의 페이지 디렉토리를 사용하고, 각 태스크에 대해 하나의 페이지 디렉토리를 사용하거나, 이 둘의 일부를 혼용할 것인지에 대해 선택할 수가 있다. CR3 초기화에 관한 자세한 정보는 10장을 참조하라. 각 태스크에 대해 CR3을 변경하는 법에 관해서는 7장을 참조하라.

 

 

5.2.4 페이지 테이블 진입점 (Page-Table Entries)

 

페이지 테이블의 어느 레벨이든 진입점은 동일한 형식을 가지고 있다. 그림 5-10은 이 형식을 나타낸다.

 

 

5.2.4.1 페이지 프레임 주소 (Page Frame Address)

 

페이지 프레임 주소는 물리적인 페이지의 시작 주소를 나타낸다. 페이지들은 4K 경계로 되어 있기 때문에, 낮은 자리수 12비트는 항상 0이다. 페이지 디렉토리에서 페이지 프레임 주소는 페이지 테이블의 주소이다. 두 번째 레벨 페이지 테이블에서 페이지 프레임 주소는 원하는 메모리 피연산자가 있는 페이지 프레임의 주소이다.

 

 

5.2.4.2 존재 비트(Present Bit)

 

존재 비트는 페이지 테이블 진입점이 주소 변환에서 사용될 수 있는지를 나타낸다. P=1이면 진입점이 사용되 수 있음을 나타낸다.

 

어느 레벨의 페이지 테이블에서든 P=0이면 진입점은 주소 변환에 사용할 수 없고 그 진입점의 나머지는 소프트웨어 용도이다; 진입점의 다른 어떤 비트들도 하드웨어에가 테스트하지 않는다. 그림 5-11은 P=0일 때 페이지 테이블 진입점의 형식을 나타낸다.

 

주소 변환을 위해 페이지 테이블을 사용하려고 시도할 때 어느 레벨의 페이지 테이블이든간에 P=0이면, 프로세서는 페이지 예외를 발생시킨다. 페이지 가상 메모리를 지원하는 소프트웨어 시스템에서 ‘페이지 존재하지 않음 ‘(page-not-present) 예외 처리기가 필요한 페이지를 물리 메모리를 가져 온다. 예외를 발생시킨 인스트럭션은 다음에 재 실행될 수 있다. 예외 처리기에 관한 보다 자세한 정보는 9장을 참조하라.

 

페이지 디렉토리 자체에 존재 비트는 없다는 것을 명심하라. 페이지 디렉토리는 관련된 태스크가 일시 정지한 동안 페이지 디렉토리는 존재하지 않을 수도 있다. 하지만 태스크가 배정(dispatch)되기 전에 OS에서 TSS에 있는 CR3 이미지가 가리키는 페이지 디렉토리가 물리적 메모리에 있는지 확인해야 한다. TSS와 태스크 배정에 관한 설명은 7장을 참조하라.

 

그림 5-10.  페이지 테이블 진입점 형식

 

 

 

 

그림 5-11.  유효하지 않은 페이지 테이블 진입점

 

 

 

 

 

 

5.2.4.3 접근된, 그리고 더티(Accessed and Dirty) 비트

 

이들 비트는 두 레벨의 페이지 테이블에서 페이지 사용에 관한 데이터를 제공한다. 페이지 디렉토리진입점에 있는 더티 비트를 제외하고는 하드웨어적으로 셋팅된다; 하지만 프로세서는 이들 비트 어느 것도 비우지 못한다.

 

프로세서는 두 레벨의 페이지 테이블에서 페이지 읽기나 쓰기 동작 이전에 해당 접근 비트를 1로 셋팅한다.

 

프로세서는 페이지 테이블 진입점이 가리키는 주소에 쓰기 전에 두 번째 레벨의 페이지 테이블에 있는 더티 비트를 1로 셋팅한다. 디렉토리 진입점에서 더티 비트는 정의되지 않는다.

 

페이지 가상 메모리를 지원하는 OS는 요청한 메모리가 가용 물리 메모리를 넘어 섰을 때 어떤 페이지를 물리 멤리에서 제거할 것인지 결정하기 위해 이 비트들을 사용한다. OS가 이러한 비트를 테스팅하고 비우는 역할을 한다.

 

 

5.2.4.4 읽기/쓰기 그리고 일반 사용자/관리자(User/Supervisor) 비트

 

이러한 비트는 주소 변환에 사용되지는 않지만, 페이지 레벨의 보호에 사용되는데, 프로세서는 주소 변환과 동시에 수행한다. 자세한 것은 보호가 설명된 6장을 참조하라.

 

 

5.2.5 페이지 변환 캐시(Page Translation Cache)

 

주소 변환의 효율 극대화를 위해, 프로세서는 가장 최근에 사용한 페이지 테이블의 데이터를 칩내부의 캐시에 저장한다. 필요한 페이징 정보가 캐시에 없을 떄에만 두 레벨의 페이지 테이블이 참조되어야 한다.

 

페이지 전환 캐시가 존재 하는지는 애플리케이션 프로그래머는 볼 수가 없지만 시스템 프로그래머는 볼 수 있다; OS 프로그래머는 페이지 테이블이 바뀔 때마다 캐시를 비워(flush)줘야 한다. 페이지 변환 캐시는 아래 둘 중 하나로 비워질 수 있다:

 

1.       CR3을 MOV 인스트럭션을 사용해서 재적재; 예를 들면 MOV CR3, EAX

2.       현재 TSS와는 다른 CR3 이미지를 가진 TSS로 태스크 전환. (태스크 전환에 관한 보다 자세한 정보는 7장 참조.)

 

 

5.3 세그먼트와 페이지 전환의 조합

 

그림 5-12는 페이징이 가능할 때, 논리 주소에서 물리 주소로 주소 변환을 요약하기 위해 두 가지 그림 5-2와 그림 5-9를 조합한 것이다. 두 상태에 관련한 적절한 옵션과 파이미터의 선택을 해서 메모리 관리 소프트웨어는 몇가지 다른 종류의 메모리 관리를 구현할 수 있다.

 

 

5.3.1 “Flat” 아키텍쳐

 

80386 이 세그먼트화되지 않은 아키텍쳐에 디자인된 소프트웨어를 실행하는 데 사용할 때, 80386의 세그먼트 특성을 “turn off”하는 것이 효율적일 것이다. 80386은 세그먼트를 불가능하게 하는 모드가 없지만, 전체 32비트 선형 주소 공간을 포함하는 기술자 선택기들을 초기에 적재함으로써 동일한 효과를 만들 수 있다. 한 번 적재되면 세그먼트 레지스터는 변경될 필요가 없다. 80386 인스트럭션에서 사용하는 32비트 오프셋은 전체 선형 공간을 주소화하는 데 적합하다.

 

 

5.3.2 몇 개의 페이지로 나누어진 세그먼트(Segments Spanning Several Pages)

 

80386 구조에서 한 페이지 크기(4 KB)보다 크거나 작게 세그먼트를 하는 것이 가능하다. 예를 들면 한 세그먼트가 132 KB를 차지하는 큰 데이터 구조를 주소화하고 보호하는 데 사용된다고 가정하라. 페이지된 가상 메모리를 지원하는 소프트웨어 시스템에서 전체 구조가 메모리에 동시에 있을 필요는 없다. 데이터 구조는 33 페이지로 나두어지고 이 중 몇 개만 있으면 된다. 애플리케이션 프로그래머는 가상 메모리의 부분 시스템이 이러한 방식으로 페이징하는 것을 알 필요는 없다.

 

 

그림 5-12.  80386 주소화 메커니즘

 

 

 

 

5.3.3 몇 개의 세그먼트를 사용하는 페이지

 

반면에, 세그먼트가 페이지 크기보다 작을 수 있다. 예를 들면 세마포어 같은 작은 데이터를 생각해 보라. 보호와 세그먼트가 제공한 공유( 6장 참조)때문에 각 세마포어당 별도의 세그먼트를 생성해야 하는 것이 유용할 것이다. 하지만 시스템은 많은 세마포어를 사용하기 때문에 각각에 페이지를 할당하는 것은 비효율적이다. 따라서 페이지 내의 많은 관련 세그먼트들을 모으는 것은 유용할 것이다.

 

 

5.3.4 정렬되지 않은 페이지와 세그먼트 경계(Non-Aligned Page and Segment Boundaries)

 

80386 구조는 페이지와 세그먼트 경계에 관련해서 제한을 두지 않는다. 페이지가 한 세그먼트의 끝과 다른 세그먼트의 시작을 포함하는 것도 환벽히 가능하다. 마찬가지로 한 세그먼트가 한 페이지의 끝과 다른 페이지의 시작을 포함할 수도 있다.

 

 

5.3.5 정렬된 페이지와 세그먼트 경계(Aligned Page and Segment Boundaries)

 

하지만 메모리 관리 소프트웨어는 페이지와 세그먼트간에 약간의 제약을 둔다면 보다 단순해질 수 있다. 예를 들면 세그먼트들이 한 페이지 단위로만 할당된다면 세그먼트와 페이지 할당 과 관련된 논리는 합쳐질 수 있다. 부분 페이지 사용에 관한 논리적 고려를 할 필요가 없다.

 

 

5.3.6 세그먼트당 페이지 테이블(Page-Table per Segment)

 

훨씬 단순한 공간 관리 소프트웨어를 제공하기 위한 공간 관리 접근법은 세그먼트 기술자와 페이지 디렉토리 진입점들간 1 대 1로 대응하도록 하는 것이다. 그림 5-13 참조. 각 기술자는 낮은 자릿수 22비트가 0인 베이스 주소를 가진다; 다른 말로 하면 베이스 주소가 페이지 테이블의 첫 진입점에 매핑된다. 세그먼트는 1에서 4 메가바이트까지 어떤 제약이 없다. 제약에 따라 세그먼트는 1 에서 1K 페이지 프레임에 포함될 것이다. 한 태스크는 그래서 1K 세그먼트로 제한되고(많은 애플리케이션에 충분한 수), 각각은 4 MB까지 포함할 수 있다. 페이지 디렉토리에 해당하는 기술자와 해당 페이지 페이블은 동시에 할당되고 해제될 수 있다.


 

그림 5-13.  페이지 테이블당 기술자

 

 

 

'IT, 소프트웨어' 카테고리의 다른 글

8장. 입출력(Input/Output)  (0) 2011.02.18
7. 멀티태스킹(Multitasking)  (0) 2011.02.11
시스템 아키텍쳐  (0) 2011.01.27
애플리케이션 인스트럭션: II  (0) 2011.01.24
웹의 단점  (0) 2011.01.05