OS 만들기 -5- (GDT)

Operating Systems/OS 만들기 프로젝트 2010. 9. 8. 07:47 Posted by 알 수 없는 사용자




GDT(Global Descriptor Table)은 각 Segment에 대한 내용이 저장되어 있다.

 

사용할 코드/데이터/스택 등등의 영역(Segment)에 대한 정보를 기술하는 디스크립터(Descriptor)이며, 모아 놓은 것은 Descriptor Table이라 한다.

 

 

 

 BASE Address = Segment의 시작 주소. 하위 16bit 상위 16bit로 나누어서 저장.


 Limit = Segment의 한계점. Offset은 이 한계를 넘을 수 없다.

 G = 1일때는 Segment의 Limit 단위가 4KB(0xFFF)

  ex) 0xFFFFF 이고 G=1 이라면 Limit=0xFFFFFFFF

 DPL = CPU 레벨은 0~3값이 있지만 현재 0과 3만을 이용하고 있다. 보통 0이면 Kernel Level, 3이면 User Level이라 한다.

 S = System Segment(0), Code or Data Segment(1)

 Type = Code, Data 구별. Access bit, etc.

 

 

가장 첫 부분에는 항상 NULL Descriptor가 설정이 된다.

 

 

 

SysDataSelector Descriptor

Limit는 G 비트가 1이므로 0xFFFFF*FFF=0xFFFFFFFF이 되고, Base Address는 0x00010000이다.

DPL이 0이므로 커널레벨이라는 것을 알 수 있고, 네번째 줄의 0x9(1001) 첫번째 비트가 1이므로 Code Segment 이다.

 

위 그림처럼 CPU가 알 수 있도록 GDT를 등록해 놓는다.

GDTR Register 가 있는데 16bit Limit 와 32bit GDT Address 총 48bit를 가지고 있다.

두 가지 값을 알고 있다면 Memory 공간의 어느곳에 있는지 CPU가 알아 낼 수 있기 때문에 GDTR이라는 Register를 사용하고 있다.

 

위 Code에서 'gdtr:' 부분에서 dw(Word 16bit)로 Limit를 설정해주고 dd(Double Word 32bit)로 주소를 설정해 준다.

메모리 0x10000으로 불러들였기 때문에 이 주소와 GDT가 있는 Offset을 더하여 실제 메모리에 있는 주소를 구한다.

Limit는 GDT의 끝 부분과 처음 부분의 주소를 빼주어 그 크기 만큼으로 정하고 lgdt로 GDTR을 설정한다.

 

VideoSelector equ 0x18

이 부분은 간단하게 Index를 설정해 주는 것이라 보면 된다.

이 Index를 가지고 GDT의 어느 곳에 위치하고 있는 것인가를 알 수 있는 것이다.

실제 0~2bit는 TI, RPL이며 이 RPL은 DPL과 비교하는 bit이다. 나머지 bit 부분이 Index이다.

RPL와 DPL이 같다면 Index를 통하여 Offset을 구하고 GDTR에서 GDT의 시작주소를 더하게 되면 필요로 하는 Descriptor의 주소를 알 수 있다.

이 주소를 통하여 실제 메모리의 주소를 구할 수 있는 Segment Descriptor Register에 값을 설정해 줄 수 있다.

설정된 Segment Descriptor Register의 Base Address와 Segment안에 있는 Code의 Offset을 더하게 되면 실제 메모리의 주소가 된다.

 


 

 

 Protected Mode -> Segment Register : Segment Selector(16bit), Segment Descriptor Register(64bit)

 Segment Selector : CS, DS, ES, FS, GS, SS

 Descriptor Register : TYPE, Base Address, Limit

 

 

ex) VideoSelector Segment의 Base Address를 0x000B8020으로 변하게 되면

Base Address 0x000B8000


 

 Base Address 0x000B8020 

 

 20만큼 더 이동된 것을 확인 할 수 있다.


실제 msgPmode의 Data가 있는 Offset은 그대로지만 Base Address가 증가하였기 때문에 메모리 주소가 증가하였고 따라서 문자 출력도 바뀌게 된 것이다.


 다른 예로 DPL 값을 RPL과 틀리게 하면 DS Descriptor Register 설정이 안되어 메모리에 접근이 되지 않아 출력문이 나오지 않을 것을 확인 할 수 있다.


 (bochsdbg 로 확인 결과 SysDataSelector의 DPL을 0x11으로 바꿨더니 ss Selector 설정 부분에서 CPL[Current Privilege Level]과 DPL이 서로 다르다는 메시지가 뜨고 재부팅이 된다.)

 




'Operating Systems > OS 만들기 프로젝트' 카테고리의 다른 글

OS 만들기 -7- (Hardware Interrupt)  (0) 2010.10.26
OS 만들기 -6- (IDT)  (0) 2010.09.14
OS 만들기 -4- (Protected Mode)  (3) 2010.09.08
OS 만들기 -3- (Kernel)  (0) 2010.09.08
OS 만들기 -2- (MBR)  (2) 2010.09.02
AND