Welcome to My World (www.dgmayor.com)

소프트웨어/C & 자료구조 & 커널 & DB

10. 인터럽트 - PLC 세팅

dgmayor 2022. 6. 14. 11:18
728x90
 

10~13강 소스코드입니다.
 

--------------------------------------------------------------------------------
 

인터럽트를 이제 구현해봅시다! 이 파트는 굉장히 복잡하고 하드코어하기 때문에 포스트를 여러 번 나누어서 할 겁니다. 준비 단단히 하시기 바랍니다.
 
인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다.
 
1. PIC 셋팅 ( 하드웨어 셋팅 )
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 0x00eb0x00eb    ;jmp $+2, jmp $+2
    out 0xA0, al    ;슬레이브 PIC
    dw 0x00eb0x00eb
    
    mov al, 0x20;마스터 PIC  인터럽트 시작점
    out 0x21, al
    dw 0x00eb0x00eb
    mov al, 0x28
    out 0xA1, al
    dw 0x00eb0x00eb
    
    mov al, 0x04    ;마스터 PIC의 IRQ 2번에
    out 0x21, al    ;슬레이브 PIC이 연결되어 있다.
    dw 0x00eb0x00eb
    mov al, 0x02    ;슬레이브 PIC이 마스터 PIC이
    out 0xA1, al    ;IRQ 2번에 연결되어 있다.
    dw 0x00eb0x00eb
    
    mov al, 0x01    ; 8086모드를 사용한다.
    out 0x21, al
    dw 0x00eb0x00eb
    out 0xA1, al
    dw 0x00eb0x00eb
    
    mov al, 0xFF    ;슬레이브 PIC의 모든 인터럽트를
    out 0xA1, al     ;막아둔다.
    dw 0x00eb0x00eb
    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 만들기  (0) 2022.06.13
8. 커널 프로그램 만들기  (0) 2022.06.13
7. boot loader 작성하기  (0) 2022.06.13