2장. 80386 프로세서 (3/3) 


2.5. 보호모드

 보호 모드의 특징은 새로운 주소 지정 메커니즘과 보호 수준이다. 새로운 주소 지정 방식에는 세그먼테이션 방식과 페이징이 사용되며, 이는 가상 메모리(virtual memory)지원 하게 된다. 가상 메모리란, 프로세서가 무제한의 물리 메모리를 가지고 있다고 생각하도록 만드는 기술이다. 두 방법 모두 필요에 따라 하드디스크와 사용자 메모리 블록을 교체(swapping)한다.

 보호 모드의 마지막 특징은 개별 프로그램(Task)에 특권 수준(Privilege level)을 부여하는 기능이다. 하위 특권 수준의 프로그램은 상위 특권 수준의 프로그램을 엑세스 할 수 없다. 실제로 운영체제가 가장 높은 특권 수준을, 주로 사용자가 사용하는 응용프로그램에 가장 낮은 특권 수준이 부여 되어 운영체제를 엑세스 할 수 없게 만든다. (물론 게이트란 특별한 형태의 디스크립터로 낮은 특권 수준의 프로그램이 높은 특권 수준의 데이터나 다른 프로그램을 엑세스 할 수 있게 한다.)



2.5.1. 세그먼테이션

 실제 모드와 마찬가지로 보호모드에서도 세그먼트가 존재한다. 하지만 각 세그먼트의 크기는 1바이트에서 4GB(386의 전체 주소 공간 크기)까지 가변적이다. (실제 모드에서의 세그먼트의 크기는 64KB(2의16승)로 고정되어있다.) 그리고 보호모드의 세그먼트 레지스터는 바로 세그먼트의 시작주소를 가리키지 않고  디스크립터 테이블(Descriptor table)을 가리키는 포인터(Pointer)로 사용된다. 386의 메모리 세그먼트는 보호모드에서 동작할 때가 실제 모드에서 동작할 때 보다 유연성이 크다.



보호모드 메모리 세그먼트의 특징

1) 고정된 64KB의 크기 대신 1바이트에서 부터 4GB까지 원하는 크기를 가질 수 있다.

2) 각 메모리 세그먼트에는 보호수준이 부여된다.(하위 보호수준으로 동작하는 프로그램은 상위 보호수준의 세그먼트를 엑세스할 수 없다.)

3) 16,384개의 서로 다른 세그먼트를 정의할 수 있다. (GDT, LDT 포함)

4) 곧바로 디스크로 교체되어 나갈 수 있어, 가상 메모리를 지원한다. (선택된 세그먼트가 메모리에 있는지, 디스크에있는지는 상태 비트를 통해 알 수있다.)

5) 세그먼트는 코드와 데이터 보호를 위해 읽기전용(read-only)로 설정할 수 있다.



용어 정리

1) 셀렉터(Selector)

 보호모드에서는 세그먼트 레지스터가 디스크립터 테이블을 선택하기 때문에 셀렉터라고 부른다.


2) 디스크립터(Descriptor)

 디스크립터의 크기는 8바이트이다. 이 8바이트를 사용하여 해당 세그먼트의 시작주소, 세그먼트의 크기(한계), 세그먼트의 속성들을 설정한다. 하나의 디스크립터당 하나의 물리주소의 세그먼트를 가지고 있다.


3) 디스크립터 테이블(Descript table)

 이런 디스크립터들이 여러개 모인 것을 디스크립터 테이블이라고 한다.(386에는 GDT, LDT, IDT 3종류의 디스크립터 테이블이있다.)


4) 특권 수준(Privilege Level) 

 4단계의 특권 레벨이 존재한다. Level 0이 가장 특권 레벨이 높고, Level 3이 가장 낮다. 레벨의 숫자가 클 수록 특권 수준은 낮다. 특권 수준이 낮으면 높은 특권 수준의 태스크에 접근 할 수 가 없다.



셀렉터와 디스크립터

 보호 모드 메모리 세그먼트를 지정하기 위해서는 세그먼트의 시작주소, 크기, 속성을 알아야 한다. 하지만 16비트 세그먼트 레지스터는 이러한 목적으로 사용하기엔 그 크기가 충분치 않다. 그렇기 때문에 보호모드에서의 세그먼트 레지스터는 디스크립터를 선택하는데 사용된다. 이 선택된 디스크립터 안에 세그먼트의 시작주소, 크기, 속성들이 저장되어 있다.



디스크립터 테이블(Descriptor Tables)
 디스크립터 테이블은 전역 디스크립터 테이블(Global Descriptor Table), 지역 디스크립터 테이블(Local Descriptor Table) 그리고 인터럽트 디스크립터 테이블(Interrupt Descriptor Table)이 존재한다. 모든 디스크립터 테이블들은 가변 길이 메모리 배열이다.(정의된 세그먼트에 따라 테이블의 크기가 가변적이다.) 이 테이블들은 8바이트에서 64KB까지의 크기를 가질 수 있다. 각 테이블은 8,192개의 8바이트 크기를 가진 디스크립터들을 가질 수 있다.



3종류의 디스크립터 테이블

1) 전역 디스크립터 테이블 (GDT, Global Descriptor Table)

 이 디스크립터 테이블의 항목은 시스템의 모든 태스크가 사용할 수 있는 세그먼트들을 기술한다.


2) 지역 디스크립터 테이블 (LDT, Local Descriptor Table) 

 이 디스크립터 테이블의 항목은 주어진 태스크와 관련된 세그먼트를 기술한다. 각 태스크는 별도의 LDT를 가질 수 있다.


3) 인터럽트 디스크립터 테이블 (IDT, Interrupt Descriptor Table)

 이 디스크립터 테이블의 항목은 최고 256개의 서로 다른 인터럽트 서비스 루틴의 시작 주소를 가리킨다.



디스크립터(Descriptor)

 세그먼트의 인덱스가 가리키는 곳을 디스크립터라고 부른다. 디스크립터의 크기는 8바이트이며 이 안에 선형 주소의 블럭에 대한 속성들이 저장되어 있다. 디스크립터는 크게 가리키는 세그먼트의 시작주소(base address), 세그먼트의 크기(한계), 그리고 기타 속성들로 나누워 진다. [그림 2-5-1-1]은 디스크립터의 구성이다.


1) 세그먼트의 시작 주소

Segment Base Address 31~24 비트 (byte 7)

Segment Base Address 23~16 비트 (byte 4)

Segment Base Address 15~ 8 비트 (byte 3)

Segment Base Address   7~ 0 비트 (byte 2)


2) 세그먼트의 크기

Segment Size Limit 19~16 비트(byte 6)

Segment Size Limit 15~8 비트 (byte 1)

Segment Size Limit 7~0 비트(byte 0)


[그림 2-5-1-1] 디스크립터 비트 구성




세그먼트 레지스터(셀렉터)의 구성

 [그림 2-5-1-2]을 참고하면서 설명을 듣자.

세그먼트 레지스터의 2번 비트 가 0일 경우 GDT(Global Descriptor Table)이고, 1일 경우에 LDT(Local Descriptor Table)을 가리킨다. 가리킬 디스크립터 테이블의 인덱스 번호(디스크립터 번호)는 상위 13비트(15~3)를 가지고 결정한다. 총 2의 13(8,192)개의 디스크립터 테이블 인덱스가 존재 한다. 이 상위 13비트로 디스크립터를 선택할 때 디스크립터 테이블의 시작 주소가 저장되어있는 GDTR이나 LDTR과 더한다. (디스크립터 테이블의 시작 주소에 인덱스 번호를 더하면 해당 디스크립터의 시작 주소를 가리킨다. [그림 2-5-1-2] 참고) 마지막으로 하위 2비트(0,1 번째 비트)들은 요청할 특권 수준(RPL, Requestor Privilege Level)을 말한다.


[그림 2-5-1-2] 세그먼트 레지스터 비트 구성

 


세그먼테이션 4단계

1) 세그먼트 레지스터의 두번 째 비트가 0이면 전역 디스크립터 테이블, 1이면 지역 디스크립터 테이블을 가리킨다.


2) 세그먼트 레지스터의 상위 13비트를 시스템 GDTR 또는 LDTR에 더하여 특정 디스크립터를 선택한다. ([그림 2-5-1-2] 참조)


3) 세그먼트 레지스터의 0,1번 비트의 특권 수준이 디스크립터의 특권수준(DPL, [그림 2-5-1-1]의 byte 5에 있는 DPL 참조)과 비교하여 낮으면 Fault(인터럽트)를 일으킨다. (접근할려고 하는 세그먼트 보다 특권 수준이 낮으면 접근 불가)


4) 요청된 특권 수준이 디스크립터의 특권 수준과 같거나 높으면 세그먼트의 32비트 시작 주소([그림 2-5-1-1]의 byte 2, 3, 4, 7 Segment Base Address 참조)에 32비트 offset을 더하여 엑세스할 데이터의 32비트 물리 주소를 얻는다. ([그림 2-5-1-3]  참조)


[그림 2-5-1-3] 세그먼테이션 과정

 



2.5.2. 페이징

 세그먼테이션은 메모리 단편화라는 단점이 있다. 메모리 단편화는 컴퓨터가 가변 길이의 메모리 세그먼트를 관리하려할 때 발생한다. (인터넷에서 메모리 단편화 라고 검색해보자. 자세한 설명이 많이 나온다.) 이 단점을 극복하기 위해 페이징 방식을 도입 하였는데, 이는 가용 메모리 공간을 4KB의 동일한 블럭(페이지)로 나눔으로써 메모리 단편화를 막을 수 있다. 이 페이지는 비교적 크기가 작고 동일한 크기를 가지므로 OS는 좀더 효율적으로 사용 할 수 있다. 고정길이의 페이지가 가변 길이의 세그먼트보다 관리하기가 쉬우므로 OS가 빠르게 반응한다.

 페이징 방식은 제어레지스터 CR0의 31번째 비트를 1로 셋 시키면 enable 되며, 32비트의 선형 주소를 별도의 페이지 디렉토리 표(Page Directory Table)와 페이지 변환표(Page Translation Table 또는 Page Table)를 통하여 4KB 페이지 프레임 내의 새로운 물리주소를 계산하게 한다. ([그림 2-5-2-1]을 참고하자.)



주소변환의 3단계 

[그림 2-5-2-1]을 참고 하면서 읽어 나가자.

1) 선형 주소의 상위 10비트(Dir)을 오프셋으로 하여, CR3 레지스터(페이지 디렉토리의 시작주소를 가지고 있다.)의 주소와 더해져 해당 페이지 디렉토리의 항목을 정한다. 해당 페이지 디렉토리 항목엔 페이지 변환표의 시작 주소가 들어있다. (페이지 디렉토리 각 항목은 해당 페이지 변환표를 가리키고 있다.)


2) 선형 주소의 중간 10비트(Table)는 Dir에서 지정된 페이지 디렉토리의 항목과 더해져 해당 페이지 변환표의 항목을 정한다. 이 항목엔 물리 메모리에서 나누워진 어떤 4KB 블럭의 시작 주소를 가지고 있다.


3) 페이지 변환표에서 얻은 4KB의 시작 주소에 선형 주소의 Offset 부분을 더해 물리 주소를 구하게 된다.


[그림 2-5-2-1] 페이징 

 



2.5.3. 세그먼테이션과 페이징의 혼합

 세그먼테이션방식과 페이징의 혼합된 방식이다. 실제 이 방식으로 구현이 되어있으며, 페이징 기능을 사용하지 않을 때(CR0 레지스터의 31번째 비트가 0일 경우)는 세그먼테이션으로 나온 프로세서의 선형 공간이 프로세서의 물리 주소 공간으로 바로 매핑(mapping)된다. 페이징 기능을 사용할 경우엔 세그먼테이션으로 얻어진 선형 주소가 페이징 방식에 필요한 32비트 선형 주소가 된다. 그 이후 변환과정은 앞에서 설명한 페이징 방식과 동일하다.


[그림 2-5-2-2] 세그먼테이션 과 페이징




2.5.4. 특권 규칙 

 멀티 태스킹 OS에서는 실행되는 프로그램은 절대로 특권이 높은 데이터나 프로그램(태스크, Task)을 엑세스해서는 안된다. 그렇지 않으면 운영체제를 포함한 다름 모든 태스크들을 다운시킬 수 있다. 386은 3가지 특권 수준(PL : Privilege Level)을 제공하는데 0(2진수 00)에서 3(2진수 11)까지 있다. 낮은 특권 수준은 주로 사용자의 응용 프로그램에 부여되며, 높은 특권 수준은 OS의 커널에 부여된다. 사용되는 경우는 세그먼테이션 4단계에서 설명 했다.

'80x86 프로세서' 카테고리의 다른 글

3장. 일반적인 개념들  (0) 2010.04.12
2장. 80386 프로세서 (2/3)  (0) 2010.04.12
2장. 80386 프로세서 (1/3)  (0) 2010.04.12
1장. 8086/8088 프로세서 (2/2)  (2) 2010.04.12
1장. 8086/8088 프로세서 (1/2)  (3) 2010.04.12

+ Recent posts