이전 포스팅에서는 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 |
~>그래서 '레지스터'를 이용한다.
[리셋과 섹터 읽기에 사용하는 레지스터]
기능 |
입/출력 |
레지스터 |
설정 |
리셋 |
입력 |
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)
'과거의 컴퓨터 공부 > 64bit OS 만들기' 카테고리의 다른 글
(10) 보호 모드용 커널 이미지 빌드 & 가상 OS 이미지 교체 (0) | 2014.04.04 |
---|---|
(6)OS 이미지 로딩 기능 구현 (0) | 2014.03.30 |
(4)부팅과 부트로더-3.부트로더의 제작, 테스트 (0) | 2014.03.29 |
(4)부팅과 부트로더-2.디렉토리 구조 생성, makefile 생성 (0) | 2014.03.29 |
(4)부팅과 부트로더-1.이론 (0) | 2014.03.21 |