소프트웨어 (과거)/C & 자료구조 & 커널 & DB
                
              10. 인터럽트 - PLC 세팅
                dgmayor
                 2022. 6. 14. 11:18
              
              
            
            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을 구현하지 않았습니다. 이는 다음 강의에서 하도록 하죠.
감사합니다.