728x90
10~13강 소스코드입니다.
--------------------------------------------------------------------------------
인터럽트를 이제 구현해봅시다! 이 파트는 굉장히 복잡하고 하드코어하기 때문에 포스트를 여러 번 나누어서 할 겁니다. 준비 단단히 하시기 바랍니다.
인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다.
1. PIC 셋팅 ( 하드웨어 셋팅 )
2. IDT ( 전에 구현했던 GDT와 같은 종류 )
3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 )
2. IDT ( 전에 구현했던 GDT와 같은 종류 )
3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 )
요번 포스트에서는 1. PIC 셋팅 을 다뤄보도록 하죠.
--------------------------------------------------------------------------------
PIC 세팅은 코드를 단순히 복붙하면 전혀 어려울 것이 없으나 이해하려면 또 어렵습니다. 관련된 설명은 아래 링크에 매우 자세하게 되어있으니 저는 코드 관련해서만 설명드리겠습니다.
--------------------------------------------------------------------------------
그럼 이제 코드를 한 번 봅시다. 아래와 같은 코드를 Boot.asm 에 추가해주면 되겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
[org 0]
[bits 16]
jmp 0x07C0:start
start:
mov ax, cs
mov ds, ax
mov es, ax
read:
mov ax, 0x1000
mov es, ax
mov bx, 0 ; 0x1000:0000 주소로 읽어 => 물리주소 0x10000
mov ah, 2 ; 디스크에 있는 데이터를 es:bx의 주소로
mov al, 20 ; 20섹터를 읽을 것이다 MAX = 64
mov ch, 0 ; 0번째 실린더 MAX 1024
mov cl, 2 ; 2번째 섹터부터 읽기 시작한다
mov dh, 0 ; 헤드는 0 MAX 16
mov dl, 0 ; 플로피 디스크 읽기
int 13h
jc read ; 에러나면 다시
mov dx, 0x3F2 ;플로피디스크 드라이브의
xor al, al ; 모터를 끈다
out dx, al
cli
; 인터럽트 코드 시작
mov al, 0x11 ;pic 초기화
out 0x20, al ;마스터 PIC
dw 0x00eb, 0x00eb ;jmp $+2, jmp $+2
out 0xA0, al ;슬레이브 PIC
dw 0x00eb, 0x00eb
mov al, 0x20;마스터 PIC 인터럽트 시작점
out 0x21, al
dw 0x00eb, 0x00eb
mov al, 0x28
out 0xA1, al
dw 0x00eb, 0x00eb
mov al, 0x04 ;마스터 PIC의 IRQ 2번에
out 0x21, al ;슬레이브 PIC이 연결되어 있다.
dw 0x00eb, 0x00eb
mov al, 0x02 ;슬레이브 PIC이 마스터 PIC이
out 0xA1, al ;IRQ 2번에 연결되어 있다.
dw 0x00eb, 0x00eb
mov al, 0x01 ; 8086모드를 사용한다.
out 0x21, al
dw 0x00eb, 0x00eb
out 0xA1, al
dw 0x00eb, 0x00eb
mov al, 0xFF ;슬레이브 PIC의 모든 인터럽트를
out 0xA1, al ;막아둔다.
dw 0x00eb, 0x00eb
mov al, 0xFB ;마스터 PIC의 IRQ 2번을 제외한
out 0x21, al ;모든 인터럽터를 막아둔다.
; 인터럽트 코드 끝
lgdt[gdtr]
mov eax, cr0
or eax, 1
mov cr0, eax
~ 이하 생략
|
cs |
; 인터럽트 코드 시작 ~ ;인터럽트 코드 끝 의 코드를 한 줄로 요약하면 다음과 같습니다.
인터럽트( 타이머, 키보드 ) 를 받기 위한 하드웨어적인 셋팅이다.
좋습니다. 간단하게 PIC를 셋팅했습니다. 그리고 더불어서! 앞으로 많은 코드를 작성하게 될 것이니 하드디스크에서 읽는 섹터를 2에서 20으로 확! 늘려줍시다. 이렇게 해도 에러가 안나는 걸로 봐서(...) 하드디스크에 아무런 값이 없어도 괜찮은가봅니다.
이제 다 끝났습니다. 하지만 아직 IDT와 ISR을 구현하지 않았습니다. 이는 다음 강의에서 하도록 하죠.
감사합니다.
728x90
'소프트웨어 (과거) > C & 자료구조 & 커널 & DB' 카테고리의 다른 글
12. 인터럽트 IDT 구현 (0) | 2022.06.14 |
---|---|
11. 인터럽트 - IDT 선언 (0) | 2022.06.14 |
9. C언어로 OS 만들기 (1) | 2022.06.13 |
8. 커널 프로그램 만들기 (0) | 2022.06.13 |
7. boot loader 작성하기 (0) | 2022.06.13 |