본문 바로가기
OS

[32bit] 부트로더 작성하기

by 올리고당 2021. 7. 27.

목차

 


전체 코드

이전 코드에서 삭제된 부분은 line 20 ~ 41입니다. 추가된 부분은 아래 사진에서 // 로 표시된 line 22 ~ 37 부분입니다. 추가된 코드의 모든 부분이 int 13h 명령어( line 33 )에 대해 준비하고, 그 결과에 대한 처리를 하는 과정입니다.

 


BIOS 인터럽트

int 13h 명령어는 BIOS에서 제공하는 인터럽트 중 하나입니다.

 

인터럽트란, 특정 외부 입력이 들어오면 진행 중이던 절차( main program )를 잠시 멈추고, 외부 입력에 대응하는 절차( ISR : Interrupt Service Routine )를 수행한 후, 멈춘 부분( main program )으로 다시 돌아와서 진행하는 것입니다.

 

먼 옛날에는 하드웨어 동작에서 주로 쓰이는 용어였는데요, 소프트웨어 분야에도 인터럽트라는 개념이 생기면서, 조금 다른 의미를 가지게 되었습니다. 소프트웨어 인터럽트는 외부 입력이 아닌, 명령어( 코드 )에 의해 발생합니다. ( 함수 호출과 유사합니다. )

 

BIOS 인터럽트는 바이오스 롬( BIOS ROM )에 저장되어 있는 인터럽트 서비스 루틴( ISR )을 사용하는 인터럽트입니다.

 

직접 작성한 프로그램이 아닌데, ISR의 위치는 어떻게 알 수 있을까요? BIOS ROM에 저장되어 있는 IVT( Interrup Vector Table )와 int 명령어의 오퍼랜드( operand )를 이용해서 ISR의 주소 값을 알 수 있습니다.

 

IVT 예시

Interrupt Vector address
... ...
13H int 13h에 해당하는 ISR의 주소
... ...

 


코드 설명

int 13h

( line 23 ~ 32 )는 int 13h 명령어를 실행하기 전, 준비하는 과정입니다. int 13h 명령어는 특정 레지스터가 입력값( Parameter )의 역할을 하여, 레지스터의 상태에 따라 수행하는 동작이 달라집니다.

 

ah 레지스터의 값에 의해 어떤 기능을 수행할지 결정되고,

dl 레지스터의 값에 의해 기능을 수행할 때, 어떤 드라이브( drive )를 사용할지 결정됩니다.

 

int 13h 입력값

 

Q1. 2번째 섹터에 있다는 것을 어떻게 알 수 있을까?

플로피 디스크 1 섹터의 크기는 512바이트입니다. 위의 코드에서는 ( line 41, 42 )를 통해 512바이트로 크기를 맞춰주었습니다. 첫 섹터에 부트로더가 기록되어 있으니, 바로 다음 섹터에 부트로더가 불러올 OS 커널이 존재합니다.

 

결괏값은 다음 레지스터로 반환됩니다.

int 13h 반환값

 

이후 코드

jc : jcc 명령어 중 하나입니다. CF가 1이면 오퍼랜드로 점프하고, 아니면 다음 명령어를 실행합니다.

 

jmp 1000h:0000 : int 13h 명령어로 읽은 프로그램이 적재된 메모리( 램 ) 주소로 이동합니다.

 


실제 동작

 


BIOS 인터럽트 위키 문서

https://en.wikipedia.org/wiki/BIOS_interrupt_call

 

INT 13H 위키 문서

https://en.wikipedia.org/wiki/INT_13H

 


이번 글에서는 이전 글에서 작성한 부트로더 프로그램을 완성하였습니다.

다음 글에서는 이번 글에서 작성한 부트로더가 읽을 프로그램인 커널에 대해 알아보고 만들겠습니다.

 

감사합니다.