Programming/System

[OS] 4장 인터럽트와 예외 : 만들면서 배우는 OS 커널의 구조와 원리

appHunter 2009. 6. 15. 15:06

먼저 IDT 에 대해서 공부하고 온다.
관련 글 : http://sagidong.tistory.com/198

IDT 값 설정.
   1: idt_ignore:
   2:     dw isr_ignore
   3:     dw SysCodeSelector
   4:     db 0
   5:     db 0x8E
   6:     dw 0x0001

IDT 와 동일하다.
  2. 핸들러의 오프셋 . 즉 인터럽트 핸들러 가 수행될 오프셋 이다.
  3. 코드 세그먼트 셀렉터 (시작 주소 = 0x00000000 )
  6. 상위 0x00010000

인터럽트 서비스 루틴
   1: ;****************************************
   2: ;****   Interrupt Service Rutines  ******
   3: ;****************************************
   4: isr_ignore:
   5:     push gs
   6:     push fs
   7:     push es
   8:     push ds
   9:     pushad
  10:     pushfd
  11:  
  12:     mov ax, VideoSelector
  13:     mov es, ax
  14:     mov edi, (80*7*2)
  15:     lea esi, [msg_isr_ignore]
  16:     call printf
  17:     
  18:     popfd
  19:     popad
  20:     pop ds
  21:     pop es
  22:     pop fs
  23:     pop gs
  24:     
  25:     iret

  5~10. 인터럽트가 발생하기 전의 상태 저장 (레지스터, FLAG)
12~16. 인터럽트 처리 ( 문자열을 화면의 7번째 줄에 출력)
18~25. 인터럽트가 발생한 당시의 프로그램 다음 명령으로 돌아가서 재개

IDTR 등록
   1: lidt [idtr]
   2:  
   3: ;****************************************
   4: ;*************   IDT   ******************
   5: ;****************************************
   6: idtr:    
   7:     dw    256*8-1        ; IDT 의 Limit 
   8:     dd    0           ; IDT 의 Base Address

    CPU가 사용할 수 있게, IDTR 을 등록해야 한다.