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 이 있다.

gdt.gif
Segment Descriptor

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 Address16 Bits Table Limit

GDTR

CPU 는 Segment:Offset 을 통해 주소를 접근할 때, GDTR 에 저장된 주소를 이용하게 된다. 주소를 표현할 때 Segment:Offset 에서 Segment 는 Segment Selector 를 통해 접근하게 된다.

segment_selector.png
Segment Selector

Segment Selector 는 GDTR 이 가리키고 있는 Descriptor Array(Table) 의 Index 를 가지고 있다. 주로 CS, DS, ES, FS, GS, SS 같은 Register 가 Segment Selector 들이다.

segmentation.png
Segmentation

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 이 시작할 수 있는 최소한의 역할을 하도록 한다.

bits 32
SECTION .data
; GDT Pointer
GLOBAL gdt_ptr
gdt_ptr equ $
dw end_gdt - begin_gdt - 1
dd begin_gdt
; Start of GDT
; GLOBAL begin_gdt
begin_gdt equ $
dd 0x00000000
dd 0x00000000 ; NULL Descriptor
; GLOBAL kernel_cs
kernel_cs equ $-begin_gdt
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
; GLOBAL kernel_ds
kernel_ds equ $-begin_gdt
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
; GLOBAL kernel_ss
kernel_ss equ $-begin_gdt
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
end_gdt equ $
; End of GDT