Programming

[OS] 운영체제 만들기 / (1) 부트 로더

MOONCO 2023. 3. 28. 16:21

해당 내용을 이해하려면, 어셈블리와 레지스터에 관한 지식이 필요합니다

 

[프로그래밍] 어셈블리어, 어셈블러란? ( feat.레지스터 )

기계어는 0과 1로 이루어졌기에, 간단한 프로그램도 코드가 매우길고, 읽기도 힘들다. 코드의 길이를 줄이고, 사람이 읽기 편하게 "어셈블리어"를 만들었다. 👉 어셈블리어 기계어를 사람이 읽

defineall.tistory.com


목적

운영체제가 하는 역할에 대해서 이해함으로써,

C, Rust, Zig같은 고급언어의 장단점을 확실히 알 수 있고,

해당 언어를 어떤 방식으로 사용해야하는지 아는 것!

 

부트로더란?

컴퓨터가 맨처음 실행하는 프로그램

 

특징

  • 512 byte로 이루어져 있다.
  • 마지막 2byte는, 무조건 0x55aa 로 끝난다. 

 

부트로더 만들기 ( x86 어셈블리 )

# 블로그 편의상 # 주석을 사용합니다. 실제로는 ";"(세미콜론)을 사용하세요.

# some boot code in hear

times 510-($-$$) db 0  ; db : define byte
# times : repeat the following command n times
# $ : current memory location
# $$ : start location
# 510-($-$$) : 510 - (current location - start location)

db 0x55, 0xaa 
# last two bytes of the file must be 0x55 and 0xaa (boot signature)

코드가 늘어나더라도, 512 byte를 유지하기 위해

현재 위치($)부터 시작 위치($$)를 뺀 부분인, 510 - ($ - $$) 를 0 으로 채운다.

마지막을 0x55, 0xaa 로 채운다.

 

부트로더 실행하기

# make object file
nasm -f bin boot.asm -o boot.bin

# run qemu ( emulator ) & start boot.bin
qemu-system-x86_64 boot.bin

어셈블리를 기계어로 번역하기 위한 nasm 어셈블러를 사용.

최종적으로 만든 실행파일을, qemu 가상환경에서 실행.

 

부팅 완료

 

실제 프로그램을 Hex 데이터로 보면, 마지막에 부트로더를 의미하는 0x55aa가 저장되어있는 것을 알 수 있고,

이제 이 내부에, 부팅시 실행해야하는 프로그램을 작성하는 것이다.

반응형