MBR Code를 만들었다면 다음으로 실제 OS를 위한 Kernel을 만들어야 한다.
정말 간단한 문자를 출력하는 Kernel을 만들어보자.
es=1000 ip=0000이 되어 1000:0000이며 이것은 실제 메모리 주소는 0x10000에 커널을 적재 시킨다.
중요한 포인트는 Bios interrupt call 이다.
우선 리눅스와 비슷하게 메모리의 0x10000 지점에 커널을 적재할 수 있도록 지정을 해 준다.
int 0x13, ah=0x02 Bios interrupt call을 이용하여 Drive로부터 Sector을 읽어들인다.
al값을 이용하여 읽을 섹터수를 지정하고 다른 레지스터를 이용하여 인자값을 준 후 interrupt를 건다.
만약 실패(Flag Register CF비트가 1로 set)하면 아래의 .end로 가서 대기상태로 만들고 만약 성공한다면 0x10000으로 이동하게 한다.
실제 Kernel Code는 2번째 Sector에 존재하기 때문에 이 sector를 불러 들이는 작업을 하는 것이다.
위 그림은 실제 두번째 sector안에 들어갈 asm code 이다.
특별하게 하는 일은 없고 단순히 "Kernel program in 2 Sector"을 출력해 주는 일을 한다.
실제 동작하는 것에 대한 확인 작업을 해 보자.
Prompt>> nasm -fbin -o mbr.bin boot.asm
Prompt>> nasm -fbin -o kernel.bin kernel.asm
각각에 대한 컴파일을 한다.
두개의 파일을 하나의 바이너리 파일로 만드는 작업이다.
앞에서 사용했던 것과 조금 다르게 인자를 줄수 있게 sys.argv[1]을 이용하였다.
Prompt>> python mbr.py os.img kernel
os.img에 아까 합쳐서 만들어 두었던 kernel의 code를 넣고 있는 것이다.
성공 했다면 bochs를 실행하여 실제 동작이 되는지 확인해 보자.
가장 중요한 포인트 Bios interrupt call 부분만 바뀌고 나머지 부분은 크게 변동된 점이 없다.
두번재 sector에 적재될 kernel code를 넣고 sector를 읽어들인 다음 그 주소로 jump 시키고 있을 뿐이다. (실제 MBR도 비슷한 원리)
'Operating Systems > OS 만들기 프로젝트' 카테고리의 다른 글
OS 만들기 -6- (IDT) (0) | 2010.09.14 |
---|---|
OS 만들기 -5- (GDT) (0) | 2010.09.08 |
OS 만들기 -4- (Protected Mode) (3) | 2010.09.08 |
OS 만들기 -2- (MBR) (2) | 2010.09.02 |
OS 만들기 -1- (bochs) (1) | 2010.09.02 |