반응형

이전 포스팅에서는 PC 부팅과정, 부트로더 코드를 보았다. 이어서 이번 포스팅 부터는 OS 이미지를 메모리로 복사하는 기능을 추가할 것이다.


~> 빌드가 끝나면 MINT64 OS의 최종 이미지는 플로피 디스크용으로 생성된다

~>부트 로더가 플로피 디스크에서 OS 이미지를 읽어 메모리로 복사 해야 한다는 것을 의미


플로피 디스크를 제어하는 방법

1.직접 플로피 디스크 컨트롤러에 접근하는 방법

2.BIOS 서비스를 이용하는 방법(이번 포스팅에서 사용할 방법)


BIOS(Basic Input/Output System)

-우리가 일반적으로 많이 사용하는 라이브러리 파일과 자신의 기능을 특별한 방법으로 외부에 제공한다.

-함수의 어드레스를 인터럽트 벡터 테이블(Interrupt Vector Table)에 넣어 두고, 소프트웨어 인터럽트(SWI;SoftWare Interrupt)를 호출하는 방법을 사용

-인터럽트 벡터 테이블은 메모리 어드레스 0에 있는 테이블로, 특정 번호의 인터럽트가 발생했을 때 인터럽트를 처리하는 함수(인터럽트 핸들러, Interrupt Handler) 검색에 사용

-테이블의 각 항목은 인덱스에 해당하는 인터럽트가 발생했을 때 처리하는 함수 어드레스가 저장되어 있고, 각 항목의 크기는 4 바이트

-최대 256개 까지 설정 가능(256*4 =1024)


[리얼 모드의 주요 인터럽트 벡터 테이블]


 테이블 인덱스

용도 

설명 

0x00 

CPU Exception 

Divide by zero 

0x01

CPU Exception  

Single step for debugging 

0x02

CPU Exception 

Non-maskable interrupt 

0x03 

CPU Exception 

Breakpoint instruction 

0x04 

CPU Exception 

Overflow trap 

0x05 

BIOS Service 

Print Screen

0x06 

CPU Exception  

Invalid opcode 

0x07 

CPU Exception 

Coprocessor not available 

0x08 

IRQ0 Interrupt 

TImer 

0x09 

IRQ1 Interrupt 

Keyboard 

0x0A 

IRQ2 Interrupt 

Slave Interrupt 

0x0B 

IRQ3 Interrupt 

COM2 port

0x0C 

IRQ4 Interrupt 

COM1 port 

0x0D 

IRQ5 Interrupt 

Printer port2 

0x0E 

IRQ6 Interrupt 

Floppy Disk

0x0F

IRQ7 Interrupt 

Printer Port1 

0x10

BIOS Service 

Video control Service 

0x13 

BIOS Service 

Disk I/O service 

0x70 

IRQ8 Interrupt 

Real time Clock 

0c74 

IRQ12 Interrupt 

Mouse 

0x75 

IRQ13 Interrupt 

Math coprocessor error 

0x76 

IRQ14 Interrupt 

Hard disk

~>BIOS 서비스는 SWI를 통해 호출할 수 있지만 BIOS도 만능은 아니어서 작업에 관련된 파라미터를 넘겨주어야 한다.

~>그래서 '레지스터'를 이용한다.


[리셋과 섹터 읽기에 사용하는 레지스터]

 기능

입/출력 

레지스터 

설정 

 리셋

입력 

AH 

 -기능 번호

-리셋 기능을 사용하려면 0으로 설정

DL

-드라이브 번호

-플로피 디스크(0x00),첫 번째 하드 디스크(0x80), 두 번째 하드 디스크 (0x81)선택 가능 

 출력

AH 

-기능 수행후 드라이브 상태 값 

FLAGS의 CF 비트 

 -성공 시 CF 비트를 0으로 설정

-에러 발생 시 CF 비트를 1로 설정

 섹터 읽기

 입력

AH 

-기능 번호

-섹터 읽기 기능을 사용하려면 2로 설정 

AL 

-읽을 섹터의 수

-1~128 사이의 값 

CH 

-트랙이나 실린더의 번호

-CL의 상위 2비트를 포함하여 총 10비트 크기

-0~1023 사이의 값 

CL 

-읽기 시작할 섹터 번호

-1~18사이의 값 

DH

-읽기 시작할 헤드 번호

-0~15의 값 

DL 

-드라이브 번호

-플로피 디스크(0x00),첫 번째 하드 디스크(0x80)와 두 번째 하드디스크 (0x81)선택 가능 

ESBX 

-읽을 섹터를 저장할 메모리 어드레스 

-64KB 경계에 걸치지 않게 지정

출력 

 AH

-기능 수행후 드라이브 상태

-성공(0x00)외 나머지 값은 에러 

AL 

-읽을 섹터 수 

FLAGS CF 비트

-성공시 CF 비트를 0으로 설정

-에러 발생 시 CF 비트를 1로 설정 


[플로피 디스크의 내부 구조]

헤드

-디스크의 표면

-디스크의 하나는 두 개의 표면으로 구성, 각 표면에 데이터 저장이 가능

-헤드의 수 = 디스크 수 *2

-0부터 시작하기 0,1 값을 갖는다

트랙

-디스크를 여러 개의 동심원으로 나눴을 때, 동심원 하나가 가지는 영역

-80개의 동신원으로 구분하기 때문에 트랙의 수는 모두 80개

-0~79 

섹터(개당 512 byte)

-디스크를 구성하는 가장 작은 단위

-트랙을 다시 여러 조각으로 자른 것

-한 트랙당 18개의 같은 크기로 구분하므로 트랙에 포함된 섹터는 모두 18개

-1~18

~>디스크의 물리적인 구조는 섹터, 트랙, 헤드로 구성되지만, 논리적인 관점에서 보면 디스크는 순차적으로 정렬된 섹터의 집합이다.

~>섹터(1-18) -> 헤드(0-1) -> 트랙(0-79)

반응형
,