본문 바로가기

OS 개발일지

[OS개발] 1일차 - 그럼, 부팅이나 시켜볼까?

1일차(시작!)

1일차에는 어떻게든 부팅이 되는 디스크를 만들어 보았다. 책에서 시키는대로 고분고분 바이너리 에디터를 사용해서 한땀한땀 정성들여 부팅 이미지를 만들었다.

이거 1474560바이트 짜리다... 다행히 대부분 복붙

해서 에뮬레이터로 돌리면 이렇게 부팅이 성공한다.

감동의 첫 부팅

에뮬레이터는 qemu(...)를 사용하고 예제의 bat 파일 덕분에 쉽게 인스톨 및 실행이 콘솔에서 가능하다.


개발 과정에서 사용하는 어셈블러는 NASM이라는 어셈블러를 기반으로 만든 nask 라는 필자의 커스텀 어셈블러로, 확장자명은 nas. 최적화를 손수 하셨단다. 뭔가 문법이 인텔이나 AMD문법이랑 달라보이지만 어셈블리어를 배운적이 없기에 그냥 그런가보다- 하고 진행하였다.

그리고 첫 어셈블리어 코드

; hello-os
; TAB=4

; 이하는 표준적인 FAT12 포맷 플로피 디스크를 위한 기술

		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"	; boot sector의 이름은 자유롭게 써도 좋다(8바이트)
		DW		512		; 1섹터의 크기(512로 해야 함)
		DB		1		; 클러스터의 크기(1섹터로 해야 함)
		DW		1		; FAT가 어디에서 시작될까(보통은 1섹터째부터)
		DB		2		; FAT의 개수(2로 해야 함)
		DW		224		; 루트 디렉토리 영역의 크기(보통은 224엔트리로 한다)
		DW		2880		; 드라이브 크기(2880섹터 해야 함)
		DB		0xf0		; 미디어 타입(0xf0해야 함
		DW		9		; FAT영역 길이(9섹터로 해야 함)
		DW		18		; 1트럭에 몇개의 섹터가 있을까(18로 해야 함)
		DW		2		; 헤드 수(2로 해야 함)
		DD		0		; 파티션을 사용하지 않기 때문에 여기는 반드시 0
		DD		2880		; 드라이브 크기를 한번 더 write
		DB		0,0,0x29	; 잘 모르지만 이 값으로 해 두면 좋은 것 같다
		DD		0xffffffff	; 아마, 볼륨 시리얼 번호
		DB		"HELLO-OS   "	; 디스크 이름(11바이트)
		DB		"FAT12   "	; 포맷 이름(8바이트)
		RESB	18			; 우선 18바이트를 비어둔다

; 프로그램 본체

		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd

; 메세지 부분

		DB		0x0a, 0x0a		; 개행을 2개
		DB		"hello, world"
		DB		0x0a			; 개행
		DB		0

		RESB	0x1fe-$				; 0 x001fe까지를 0x00로 채우는 명령

		DB		0x55, 0xaa

; 이하는 boot sector이외의 부분을 기술

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

몇가지 명령어를 정리해 보자면,

; : 주석문
DB(data byte) : 1바이트 쓰기
DW(data word) : 2바이트 쓰기
DD(data double-word) : 4바이트 쓰기
RESB(reserve byte) : 0x00으로 채우기

$ : 현재 행이 선두로부터 몇 바이트째 인지 알려줌. 쉽게 얘기하면 커서.


다른건 모르겠고 오늘 기억하는 내용은 컴퓨터가 부팅시 첫 섹터(512바이트)중 맨 뒤의 2바이트를 읽어 55 AA임을 확인하면 부팅가능 디스크라고 인식하는다는 거랑, 부팅(Boot)의 유래... 심심하면 읽어보시라, 꽤 재미있다(다단계로켓ㅋㅋㅋㅋ)


이렇게 1일차를 완수했다- 아직 모르는 단어들이 잔뜩 있지만 초중딩때 아무것도 모르고 플래시 스크립트를 가져다 붙이던플래시365 마음으로 가볍게 진행해서 즐겁다고 생각했다. 2일차는 뭘 배우려나...