|
ncloader
0.1
|
Global Descriptor Table에 대한 협력 다이어그램:Protected Mode 로 진입하기 위해서는 몇 가지 주요 정보를 CPU 가 참조할 수 있도록 준비해야 한다.
그 중 하나가 Descriptor Table 이다.
Real Mode 와 달리, Protected Mode 에서는 Segment 에 대한 정의를 할 수 있다. Segment 정보를 담고 있는 것을 Descriptor Table 이라고 하며, Global Descriptor Table 과 Local Descriptor Table 이 있다.
Global Descriptor Table 은 Segment 에 대한 정보를 담고 있는 Descriptor 들의 연속으로 구성된다. 4KB 의 Memory 가 할당되며, 하나의 Segment Descriptor 당 8 Bytes 가 할당된다. 4KB 의 Descriptor Array 의 시작 주소를 GDTR 이라고 하는 GDT Register 에 저장한다.
Descriptor Array(table) 의 첫번째 descriptor 는 NULL Descriptor 라고 해서, 모든 값이 0으로 초기화 되어 있어야 한다.
| 32 Bits Linear Address | 16 Bits Table Limit |
GDTR
CPU 는 Segment:Offset 을 통해 주소를 접근할 때, GDTR 에 저장된 주소를 이용하게 된다. 주소를 표현할 때 Segment:Offset 에서 Segment 는 Segment Selector 를 통해 접근하게 된다.
Segment Selector 는 GDTR 이 가리키고 있는 Descriptor Array(Table) 의 Index 를 가지고 있다. 주로 CS, DS, ES, FS, GS, SS 같은 Register 가 Segment Selector 들이다.
Segment Selector 의 Index 와 GDTR 의 Descriptor Table 을 이용해, Segment Descriptor 를 얻게 되고, Segment Descriptor 안에 정의되어 있는 Base address 와 Limit(크기) 를 통해 해당 Segment 의 시작 위치와 크기 및 각종 접근 정보를 참조하게 된다.
즉 CPU 가 접근해야 하는 Linear Address 를 Segment:Offset 으로 얻어 오기 위해 GDT 가 필요한 것이다.
Stage 2 에서 Kernel 을 적재하고 실행시키기 전에 CPU 를 Protected Mode 로 변경 할 것이며, 모드 변경을 위해 Dummy Descriptor 를 만들게 된다. 좀 더 세밀한 정보는 Kernel 에서 해야 하는 숙제이고, Stage 2 에서는 Kernel 이 시작할 수 있는 최소한의 역할을 하도록 한다.