3. 타이머 인터럽트 핸들러

타이머는 PIC의 IRQ 0번입니다. 그러나 PIC을 사용하기 위해서 그 전의 포스트에서 초기화 하는 과정에서 시작 번호를 0x20으로 주었으므로, 타이머 인터럽트가 발생하였을 경우 PIC은 CPU에게 0x20을 알릴 것입니다. 따라서 IRQ 0번에 연결된 타이머의 인터럽트를 처리하는 인터럽트 디스크립터는 0x20 번째 디스크립터에 기술 되어야 합니다.

Protected Mode로 넘어갈 때, 모든 인터럽트를 막는 것이 작업에 효율적이었습니다. 따라서 모든 인터럽트를 막았고, 타이머 인터럽트를 받아 들이기 위해서 0x20째 인터럽트를 다시 허용 해야 합니다.

 

lidt[idtr]

 

mov al, 0xFA

out 0x21, al

sti

jmp $

 

Idt를 등록한 뒤에, 타이머에 해당하는 IRQ 0번, 0번 비트를 0으로 클리어 한 뒤, 이것을 0x21 번 포트에 out 명령어로 내주면 해당 인터럽트가 유효하게 됩니다. 마스터 PIC의 데이터 부분의 주소인 0x21에 써줍니다.

7

6

5

4

3

2

1

0

1

리얼타임 클록

1

플로피디스크

컨트롤러

1

프린터

포트1

1

COM1

1

COM2

0

슬레이브

PC

1

키보드

0

타이머

 

Cpu가 PIC으로부터 인터럽트를 받아들이고 /INTA 신호를 돌려주기 위해 sti를 실행 시켜 줍니다.

 

idt_timer:

dw isr_32_timer ;

dw 0x08

db 0

db 0x8E

dw 0x0001

 

     

15

  

  

  

  

  

  

  

  

  

  

  

  

  

  

0

(1)핸들러의 오프셋 15 – 0 (isr_32_timer)

(2)핸들러의 코드 세그먼트 셀렉터 (0x08)

(3)P(1)

(4) DPL(00)

(5) 0

(6)D

(7)1

(8) 1

(9)0

사용안함 ( 0 )

(10) 핸들러의 오프셋 31 – 16(0x0001)

63

  

  

  

  

  

  

  

  

  

  

  

  

  

  

48

 

인터럽트 디스크립터를 보면 0x10000+isr_32_timer 물리 주소로 지정하고 있습니다. 인터럽트 서비스 루틴의 예는 다음과 같습니다.

 

isr_32_timer:

push gs

push fs

push es

push ds

pushad

pushfd

 

mov al, 0x20

out 0x20, al

mov ax, VideoSelector

mov es, ax

mov edi, (80*2*2)

lea esi, [msg_isr_32_timer]

call printf

inc byte [msg_isr_32_timer]

 

popfd

popad

pop ds

pop es

pop fs

pop gs

 

iret

 

핸들러로 들어오면 먼저 모든 레지스터와 EFLAGS를 스택에 저장해 놨다가, 인터럽트 루틴이 종료될 때, 다시 복귀시킵니다.

PIC을 리셋하고 iret 명령어를 실행시켜, 다시 인터럽트가 걸릴 수 있도록 합니다.

 

4. 키보드 인터럽트 핸들러

isr_33_keyboard:

pushad

push gs

push fs

push es

push ds

pushfd

 

in al, 0x60

 

mov al, 0x20

out 0x20, al

 

mov ax, videoSelector

mov es, ax

mov edi, (80*4*2)

lea esi, [msg_isr_33_keyboard]

call printf

inc byte [msg_isr_33_keyboard]

 

popfd

pop ds

pop es

pop fs

pop gs

popad

iret

 

키보드에서 어느 키가 눌렸는지 확인 하기 위해, in al, 0x60 명령어로, 키보드 버퍼에 있는 문자 스캔코드를 가져온 후, PIC을 리셋합니다.

 

'Operating Systems > OS 커널 제작' 카테고리의 다른 글

5. Task Switching (1) - TSS  (0) 2015.01.22
4. Interrupt 와 Exception (4) - 예외  (0) 2015.01.20
4. Interrupt 와 Exception (2) - PIC  (0) 2015.01.18
3. Protected Mode (3)  (0) 2015.01.17
3. Protected Mode (2)  (0) 2015.01.15

+ Recent posts