Search

'CLKH64 OS'에 해당되는 글 37건

  1. 2013.01.22 System Descriptor 1

System Descriptor

CLKH64 OS/12장 2013. 1. 22. 16:49 Posted by 알 수 없는 사용자

[시스템 세그먼트 디스크립터]

디스크립터 타입에서 S 필드가 클리어이면, 시스템 디스크립터다.

 

- LDT 세그먼트 디스크립터

- TSS 디스크립터

- Call-gate 디스크립터

- Interrupt-gate 디스크립터

- Trap-gate 디스크립터

- Task-gate 디스크립터

 

이런 디스크립터들은 두가지,

시스템 세그먼트 디스크립터게이트 디스크립터로 나눌 수 있다.

 

1. 시스템 세그먼트 디스크립터는 그 자체로 세그먼트를 가리키는 화살표고

2. 게이트 디스크립터는 그 자체로서 게이트다. 다시말해서 코드 세그먼트의 Procedure Entry Point를 가리키고 있다. 이를테면 Call, Interrupt, trap 게이트가 그렇다.

Task 게이트의 경우에는 TSS를 위한 세그먼트 셀렉터를 가지고 있다.

그리고 내가 알기로 이러한 디스크립터가 '게이트'라 불리는 이유는 CPL을 뛰어넘어 더 높은 수준의 DPL을 가진 코드 세그먼트에 접근할 수 있도록 해주기 때문이다.

 

 

타입의 두번째 로우비트, 즉 TYPE(9)는 Busy다. 책에도 나와있다.

 

 

[세그먼트 디스크립터 테이블]

세그먼트 디스크립터 테이블은 세그먼트 디스크립터들의 배열이다.

그리고 8192개의 8byte 디스크립터들을 담을 수 있다. 두종류의 디스크립터 테이블이 있는데.

- GDT

- LDT

(왜 IDT는 없지? IDT는 디스크립터 테이블이 아닌가? 맞는거같은데.)

-> 그냥 갑자기 든 생각인데, 엄밀히 말해서 IDT 내에 존재하는것은 Trap, Call, Task 게이트들이므로 디스크립터 테이블이라고 표현하기는 어려움이 있지 않나 싶다. 실제 이름은 Interrupt Descriptor Table임에도 불구하고.

 

GDT는 시스템에 하나 있어야 하지만, LDT는 optional이다. 한개 이상의 LDT가 시스템 내에 존재할 수 있다.

- 그리고 하나의 LDT가 task마다 존재할 수 있고 아니면

- 모든 task 가 동일한 LDT를 공유하거나

- 몇개의 task만 동일한 LDT를 공유할수도 있다.

 

GDT의 시작 주소는 반드시 8바이트 경계로 정렬되어야 한다. 그래야 프로세서의 성능을 최고로 이끌어 낼 수 있기 때문이다.

(align 8, db 8)

(dw 0x0000) - 188p 부분 의문점 해결

그리고 널 디스크립터를 0번째 인덱스에 위치하게 하고, 이를 사용하면 #GP 를 만들어 냄으로써, 의도치 않은 세그먼트 레지스터의 사용을 막을 수 있다. (0번째에 다른 세그먼트 레지스터가 있었다면 잘못 사용될 수도 있다는 뜻)

 

LDT는 LDT 타입의 시스템 세그먼트에 위치 해 있다. 다시말해서, LDT는 세그먼트다. (그러나 GDT는 세그먼트가 아니다.) 그리고 LDT를 사용한다면 GDT는 반드시 LDT를 가리키는 디스크립터를 포함하고 있어야 한다. 다시 말해서, LDT를 위한 LDT 디스크립터가 GDT 내에 존재 해야 한다는 말이다.

만약 시스템이 다수개의 LDT를 지원한다면, 그 갯수만큼의 세그먼트 셀렉터를 사용하고 세그먼트 디스크립터가 GDT내에 존재해야 한다.

 

 

위 그림에서 GDT는 세그먼트가 아니고 LDT는 세그먼트인 이유를 알 수 있다. 애초에 LDT는 디스크립터가 존재한다. 다시말해서, 세그먼트란 뜻이다.

 

그리고 매번 일어나는 선형 주소 변환을 피하기 위해서 시스템은 LDT나 TSS와 같은 세그먼트의 주소, 리밋을 TR, LDTR에 로드한다.

 

새로운 Task 스위치가 일어날때, 새로운 Task를 위한 LDT의 베이스, 리밋과 세그먼트 셀렉터가 자동으로 LDTR에 로드된다.

(이 의미는, Task마다 LDT를 가질 수도 있다는 소리다.)

그리고 이전의 LDTR의 내용물들은 자동으로 저장되지 않는다.

 

 

 

[16바이트 세그먼트 디스크립터]

아래에 나열된 종류의 디스크립터들은 16바이트까지 확장될 수 있다

- Call gate 디스크립터

- IDT gate 디스크립터 (IDT gate는 Interrupt 또는 Trap 게이트를 지칭한다.)

- LDT, TSS 디스크립터

 

 

 

 

 

 

'CLKH64 OS > 12장' 카테고리의 다른 글

GDT 32비트, 64비트 모든 세그먼트 구현 코드  (0) 2013.01.27
I/O Bitmap  (0) 2013.01.27
Task Management  (0) 2013.01.24