티스토리 뷰

OS 개발

#4 보호 모드 커널로 진입

K.Nero 2019. 2. 7. 23:39

앞에서 설명하지 않은 부분은 OS 의 모드 변경이다. 처음 OS 가 부팅이 되면 리얼모드로 시작되고 이 부분은 16비트 환경이다. 지금 공부 중인 책은 64비트 OS 를 목표로 진행되기는 하지만 64비트로 가기 전 OS 는 32비트 보호 모드를 거쳐서 가야한다. 그래서 이번에는 앞에서 만든 테스트용 가상 OS 소스를 보호 모드로 전환하는 소스로 변경하려고 한다.

우선 리얼 모드에서 보호 모드로 전환하기 위해서느는 6단계를 거쳐야 한다.

1. 세그먼트 디스크립터 생성
(보호 모드 코드와 데이터용 세그먼트 디스크립터 생성)

2. GDT 정보 생성
(세그먼트 디스크립터의 시작 어드레스와 디스크립터의 전체 크기 저장)

3. 프로세서에 GDT 정보 설정
(GDTR 레지스터에 GDT의 시작 어드레스와 크기 설정)

4. CR0 컨트롤 레지스터 설정
(CR0 컨트롤 레지스터의 PE 비트=1, PG 비트=0)

5. jmp 명령으로 CS 세그먼트 셀렉터 변경과 보호 모드로 전환
(jmp 0x08: 보호 모드 커널의 시작 어드레스)

----------------위로 16비트 아래는 32비트-----------------

6. 각종 세그먼트 셀렉터 및 스택 초기화
(DS, ES, FS, GS, SS 세그먼트 셀렉터와 ESP, EBP 레지스터 초기화)

7. 보호 모드 커널 실행

이 순서데로 소스를 작성한다.
https://github.com/KNero/os-study/blob/master/01.Kernel32/Source/EntryPoint.s

그리고 

https://github.com/KNero/os-study/blob/master/00.BootLoader/BootLoader.asm

여기에서 기존 BootLoader.asm 에서 TOTALSECTORCOUNT 이 값을 1로 변경해 준다. (새로운 소스는 512 바이트만 있기 때문에 한 섹터만 읽으면 된다.)

오타만 주의 한다면 make 파일을 수정하고 쉽게 구동되는 것을 볼 수 있다.

수정할 make 파일은 2개이다.
https://github.com/KNero/os-study/blob/master/01.Kernel32/makefile
https://github.com/KNero/os-study/blob/master/makefile

make 실행 후 아래명령어를 통해 실행하면 구동 된 화면을 볼 수 있다.

qemu-system-x86_64 -L . -m 64 -fda ./Disk.img -localtime -display curses


'OS 개발' 카테고리의 다른 글

#3 floppy disk 로 부터 OS 이미지 읽기  (0) 2019.01.22
#2 makefile 생성, BootLoader.asm 작성, qemu 실행  (0) 2018.12.22
#1 개발환경 세팅 1  (0) 2018.12.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함