; haribote-ipl
; TAB=4
ORG 0x7c00 ; 메모리 안에서 로딩되는 곳
; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들
JMP entry
DB 0x90
DB "HELLOIPL" ; 부트섹터 이름. 마음대로해도 ok
DW 512 ; 1섹터 크기(바이트 단위, 512)
DB 1 ; 클러스터 크기(1로 해야됨)
DW 1 ; 예약된 섹터수
DB 2 ; 디스크 FAT 테이블 수
DW 224 ; 루트 디렉토리 엔트리 수 (보통 224엔트리)
DW 2880 ; 디스크 총섹터수
DW 0xf0 ; 미디어 타입
DW 9 ; 하나의 FAT 테이블 섹터 수
DW 18 ; 1트랙에 몇 색터가있는지
DW 2 ; 헤드의 수
DD 0 ; 파티션 없으므로 0
DD 2880 ; 드라이브 크기 한번더씀
DB 0, 0, 0x29 ; 필요하다고함
DD 0xffffffff ; 볼륨 시리얼 번호
DB "HELLO-OS " ; 디스크 이름
DB "FAT12 " ; 포멧이름
RESB 18 ; 18바이트 남김
; 프로그램 본체
entry:
MOV AX,0 ; 레지스터 초기화
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
; 추가된 부분
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 실린더 0
MOV DH,0 ; 헤드 0
MOV CL,2 ; 섹터 2
MOV AH,0x02 ; AH=0x02 :디스크 읽기
MOV AL,1 ; 1섹터
MOV BX,0
MOV DL,0x00 ; A 드라이브
INT 0x13 ; 디스크 BIOS 추출
JC error
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 "good i e yo you good good good"
DB 0x0a ; 줄바꿈
DB 0
RESB 0x7dfe-$ ; 나머지칸 0채우기
DB 0x55, 0xaa
IPL
-초기 프로그램 로더 Initial Progrm Loader
-이전에 만든 부트섹터
- 그러나 프로그램을 로드하지 않음
하리보테 OS
- 앞으로 만들 운영체제 이름
- 하리보테란? 영화에서 겉에 보이는 바위나 건물, 속으로 비어있고 가자인 것들
- 하리보테 OS 겉보기엔 OS이지만 속은 텅빈 천천히가자는 의미
하리보테 OS 시작하기
- 초기 512바이트는 부트섹터
- 다음 512바이트 정리하자
- 아래의 코드는 추가된 부분들
JC 명령어
- jumpy if carry
=> 캐리가 발생하면(= 캐리 플래그가 1이면) 점프하라
INT 0x13은 무엇일까? (AT-BIOS 의 인터럽트 문서 참고)
- 디스크로부터 읽기, 디스크에 쓰기, 섹터 검사 및 찾기
- AH = 0x02 (읽을때)
- AH = 0x03 (쓸떄)
- AH = 0x04 (검사할떄)
- AH = 0x0C (찾을떄)
- AL = 처리할 섹터 수(연속된 섹터 처리 간으)
- CH = 실린더 번호 & 0xFF
- CL = 섹터 번호(bit 0-5) | (실린더 번호 & 0x300) >> 2
- DH = 헤드 번호
- DL = 드라이브번호
- ES:BX = 버퍼 어드레스(검사 혹은 찾기시 사용 x)
- 리턴값 :
=> FLAGS.CF == 0 : 에러 없음, AH == 0
=> FLAGS.CF == 1 : 에러 있음, AH에 에러 코드(리셋 기능과 같음)
현재 코드 상의 인터럽트와 의미
- INT 0x13 번 인터럽트가 발생했을때 AH = 0x02 => 디스크 읽기 수행
- FLAGS.CF 캐리 플레그 -> 0x13 인터럽트(함수)가 수행중 에러가 발생하면 캐리 플래그 1, 에러 없으면 캐리플래그 0
캐리 플래그
- CPU의 상태를 나타내기 위한 레지스터 중 1개,
- 플래그 : 1비트밖에 저장하지 못하는 레지스터로. 들어 올리거나 내리는 두가지 경우밖에 존재하지 않으므로 플래그라 함
인터럽트시 필요한 값들
- CH, CL, DH, DL에 갑이 입력되어 있어야 함
- 현재 AH = 0x02로 인터럽트 발생시 디스크를 읽기 가 호출됨. 하지만 어디를 해야할지 모름
- CH 실린더 번호, CL 섹터 번호, DH 헤드 번호, DL 드라이브 번호
플로피 디스크 구조
- 실린더(원통) : 큰 원(0~79번까지 80개 존재)
- 헤드 (자기헤드): 집게같이 생긴거 - 읽기용 헤드(위의꺼 0번), 쓰기용 헤드(아래꺼 1번)로 2가지
- 섹터 : 실린더와 헤드를 지정하면 데이터를 쓰거나 읽을수 있으나 너무 많아 나눔.
피자조각을 나눈 조각 같은거 1 ~ 18번까지 18개 존재. 하나의 섹터당 512바이트 저장 가능
- 플로피 디스크의 크기 = 80 x 2 x 18 x 512(바이트) = 1,440KB = 1.4MB 플로피 디스크다
- 아래의 그림은 1.4 mb 짜리 플로피 디스켓
우리의 경우 인터럽트시 무엇을 읽을까?
- MOV CH, 0 => 실린더 번호 0번에서의
- MOV DH, 0 => 헤드 번호 0번의
- MOV CL, 2 => 2번 섹터에서
- MOV DL, 0x00 => 0번 드라이브(플로피 디스켓이 입력되는 A디스크)
=> IPL은 C0-H0-S1에 존재. 다음에는 C0-H0-S2를 읽음
'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글
os만들기 - 12. 에러 발생시 다시 읽기 (0) | 2020.08.01 |
---|---|
os만들기 - 11. 버퍼 어드레스와 세그먼트 레지스터 (0) | 2020.08.01 |
os만들기 - 9. Makefile로 빌드 자동화 (0) | 2020.08.01 |
os만들기 - 8. 어셈블리 명령어들과 부트섹터 이미지 생성 (0) | 2020.08.01 |
os만들기 - 7. 어셈블리어 기본 명령어와 레지스터 (0) | 2020.08.01 |