-
[OS] 01. Boot Sector BareboneOS/OS from Scratch 2021. 6. 20. 14:14
서론
이번 강의에서는 가장 기본적인 Boot Sector의 뼈대를 만들어 보겠습니다. 해당 Github 강의는 다음과 같습니다.
https://github.com/cfenollosa/os-tutorial/tree/master/01-bootsector-barebones
cfenollosa/os-tutorial
How to create an OS from scratch. Contribute to cfenollosa/os-tutorial development by creating an account on GitHub.
github.com
이론
BIOS
BIOS는 부팅 시 하드웨어를 확인하는 역할을 합니다. 컴퓨터가 부팅할 때 짧게 벨소리가 들리는 것이 BIOS가 하드웨어에 문제가 없다는 것을 인식한 신호입니다.
Boot Sector
Boot Sector는 Kernel을 불러오는 역할을 합니다. Boot Sector는 디스크에서 가장 앞에는 512byte크기로 있습니다. Boot Sector의 마지막은 0xAA55로 돼있는데, 이는 BIOS가 디스크가 부팅 가능하다는 것을 확인할 수 있게 합니다. 이번 강의에서 다룰 가장 간단한 형태의 Boot Sector는 처음 3개 byte는 무한 루프를 의미하며, 마지막 2byte는 0xAA55입니다. 가운데 있는 값은 0으로 초기화 해줍니다.
가장 간단한 형태의 Boot Sector Little Endian
x86아키텍처를 사용하는 대부분의 컴퓨터는 Little Endian로 데이터를 저장합니다. Little Endian은 한 단위의 데이터가 메모리에 저장될때 거꾸로 배열되는 형태를 의미합니다. 위 그림과 같이 0xAA55를 저장하면 55 AA로 저장되는 것을 확인할 수 있습니다. 더 자세한 내용은 https://genesis8.tistory.com/37 을 참고하세요.
Assembly $, $$ 명령어
$는 Assembly에서 현재 주소를 의미하며, $$는 처음 시작 주소를 의미합니다.
times 510-($-$$) db 0
이를 기반으로 위 코드의 의미를 분석해봅시다. times는 어떤 값을 반복해 생성하는 명령어입니다. ($-$$)는 처음 위치에서 현재 위치가 떨어진 거리, 즉 현재 위치 앞에 존재하는 byte개수를 의미합니다. Boot Sector는 총 512byte이고 마지막 2byte는 0xAA55이므로, 510byte에서 무한 루프 코드를 제외한 나머지는 0으로 채워야 합니다. 무한 루프 코드의 길이가 $-$$이므로 510-($-$$) 만큼 0을 생성해야 합니다.
코드
이번 강의의 코드는 매우 간단합니다.
; 무한 루프 loop: jmp loop ; https://engineersasylum.com/t/times-510-db-0-means/132/2 ; times: 반복 ; $: 현재 주소 ; $$: 처음 주소 ; 처음 부터 현재 주소까지 제외하고 0으로 채움 times 510-($-$$) db 0 dw 0xaa55
실행 결과
위 코드를 실행 bin파일로 컴파일하고, qemu로 실행시키면 다음과 같은 화면이 나옵니다.
Boot Sector가 정상적으로 작동한 모습 'OS > OS from Scratch' 카테고리의 다른 글
[OS] 05. Boot Sector Function (0) 2021.06.20 [OS] 04. Boot Sector Stack (0) 2021.06.20 [OS] 03. Boot Sector Memory (0) 2021.06.20 [OS] 02. Boot Sector Print (0) 2021.06.20 [OS] 00. 강좌 소개와 Environment 구성 (1) 2021.06.20