해당 내용을 이해하려면, 어셈블리와 레지스터에 관한 지식이 필요합니다
목적
운영체제가 하는 역할에 대해서 이해함으로써,
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가 저장되어있는 것을 알 수 있고,
이제 이 내부에, 부팅시 실행해야하는 프로그램을 작성하는 것이다.
반응형