OS 만들기 -3- (Kernel)

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


 

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

각각에 대한 컴파일을 한다.

Prompt>> copy mbr.bin+kernel.bin /b kernel

두개의 파일을 하나의 바이너리 파일로 만드는 작업이다.

 

 

 

앞에서 사용했던 것과 조금 다르게 인자를 줄수 있게 sys.argv[1]을 이용하였다.

 

Prompt>> python mbr.py os.img kernel

os.img에 아까 합쳐서 만들어 두었던 kernel의 code를 넣고 있는 것이다.

 

성공 했다면 bochs를 실행하여 실제 동작이 되는지 확인해 보자.

 

Prompt>> bochs -q

 

 

 

가장 중요한 포인트 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
AND