OS 만들기 -4- (Protected Mode)

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






Real Mode 같은 경우 16bit로 0xFFFF:FFFF로 지정할 수 있는 최대 였기 때문에 실제 0x10FFEF 까지만 인식을 할 수 있다.

 

현재는 GB이상 Ram으로 맞추는 경우도 있기 때문에 32bit Protected Mode로 변환을 해야 한다.

 

이 변환을 위해 사용되는 것이 GDT(Global Descriptor Table) 이다.

 

이 GDT를 이용하면 0xFFFFFFFF(4GB) 까지 이용이 가능 하며, DPL값을 이용하여 권한 설정등을 할 수 있다.

 

 

 


 lgdt 명령어로 GDTR Register(16bit GDT Limit, 32bit GDT Address) 을 설정하고 있다.

 

Before

 

After

 

 Base가 0x00010081로 바뀌었다. 이것은 0x10000으로 커널을 적재 시켰기 때문에 GDT또한 이 곳에 있으며, Offset으로 0x81이기 때문에 더하여 GDT의 주소가 위 처럼 변하게 된다.  Limit같은 경우엔 Descriptor(8byte)*4개 -> 0x1f(0~31) 값이 나오게 된다.


GDB Hex

 

 55AA로 끝나는 부분(0x1FF)이 첫번째 Sector(MBR)가 되고 두번째 Sector 부터 실제 Kernel 부분 Code 이다.

 그 중 GDT가 있는 부분이 0x281인 것을 알 수 있다. 결국 Offset은 0x81이 되어 실제 메모리 부분에서 0x10000 + 0x81이 되어 0x10081이 GDT 시작주소이다.

 


 

 

Before

 

CR0은 Control Register로서 4개의 레지스터 중 하나이다.

현재 Protected Mode라는 것을 CPU에 알려주기 위해 PE bit를 1로 설정을 해주고 있다.

 

After

 


실제 CPU에는 각각의 유닛이 있는데 동기적으로 실행(CPU 파이프라인 구조)이 된다.

A, B, C 각각의 순서대로 들어온 instruction이 있다고 하면 C는 읽기, B는 해석, A는 실행 유닛에 각각 들어있다.

결국 A에서 Protected Mode로 바뀌게 되면 다음에 있는 B, C 같은 경우 Real Mode로 되고 있는 상태였기 때문에

JMP와 NOP로 프로그램 수행에 차질이 없도록 한다.

 

Protected Mode에서는 Extended Register를 사용해야 한다.

처음에 [bits 16] 이였기 때문에 바꿔주기 위해 입력을 했지만 현재의 NASM은 32bit Code 지원이 된다.

JMP DWORD SysCodeSelector:PM_Start

울 입력하여도 JMP가 가능하다.

 

 

 

 Protected Mode에서 각 Segment Register를 등록해 준다.

edi Register에는 출력할 위치를 정해주고 esi Register는 "We are in Protected Mode" 부분의 주소를 가져온다.

그리고 출력할 부분은 전 Code와 동일 하다.

 

 

 

 잘 되는 것을 확인 할 수 있다.

중요한 포인트는 Real Mode에서 Protected Mode로의 변환을 위해 GDT가 필요하기 때문에 GDT를 등록 시키고 GDT를 이용하여 메모리에 접근을 하고 있다.


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

OS 만들기 -6- (IDT)  (0) 2010.09.14
OS 만들기 -5- (GDT)  (0) 2010.09.08
OS 만들기 -3- (Kernel)  (0) 2010.09.08
OS 만들기 -2- (MBR)  (2) 2010.09.02
OS 만들기 -1- (bochs)  (1) 2010.09.02
AND