728x90
; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

entry:
		MOV		AX,0			; 레지스터 초기화
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

; 0xc200번지(hribote.sys)로 점프. 10실린더까지 다 읽어 로드되면 본프로그램 점프

		JMP		0xc200

fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		MOV		SI,msg

putloop:
		MOV		AL,[SI]
		ADD		SI,1			; SI에 1 더함
		CMP		AL,0
		JE		fin
		MOV		AH,0x0e			; 한 문자 표시 기능
		MOV		BX,15			; 컬러 코드
		INT		0x10			; 비디오 BIOS 호출
		JMP		putloop

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

복습

- 이전에 버퍼 세그먼트가 ES = 0x0820, BX =0으로 설정되어 데이터가 로드되는 지점이 0x8200 ~ 0x83ff번지가 됨

- 여기서 0x8000 ~ 0x81ff는 512바이트의 부트섹터 내용이 들어감

 

 

부트섹터에서 OS 본 프로그램 실행하기

- 부트 섹터 맨 앞이 0x8000 번지에 로드되도록 하여 읽어들인 상태

- 디스크를 메모리에 읽어들인 상태로 img의 0x4200(본체 어드레스)는 pc 메모리의 0x8000 + 0x4200 = 0xc200에 위치

 

 

ORG 명령

- 기계어가 실행시 PC 메모리의 어디에 로드 되어야 하는지를 nask에게 알림

- 이 프로그램들을 메모리의 어느 번지에 로드하도록 요청

 

 

부트섹터 완료 후 OS 본 프로그램으로 넘어가기

- ipl.nas 처리 후 next의 맨 아래에 0xc200으로 점프

- haribote.sys의 첫번째 데이터로 넘어감(바이너리 데이터로 haribote.sys의 실제 내용이 어디있는지확인함)

 

본 프로그램 동작

- ipl.nas에서 JMP 0xc200으로 현재 sys파일로 넘어옴

- org 0xc200을 만나 이제 0xc200 지점에서부터 로드하는걸로 설정

; haribote-os
; TAB=4

		ORG		0xc200			; 이 프로그램이 로딩되는 위치?
fin:
		HLT
		JMP		fin

 

make run

- make run 하면 부팅은 되는데 동작하는지는 잘모르겠다.

300x250

+ Recent posts