Tuuna Computer Science

[OS 개발]보호모드의 하드웨어 인터럽트 처리과정 본문

OS

[OS 개발]보호모드의 하드웨어 인터럽트 처리과정

GuTTe 2018. 11. 14. 15:39

IDT와 GDT가 헷갈렸던 참에 정리가 잘 돼서 여기에 마지막으로 정리를 하려한다.


일단 인터럽트의 종류에는 소프트웨어 인터럽트랑, 하드웨어 인터럽트가 존재한다.


소프트웨어 인터럽트는 말 그대로 소프트웨어단에서 CPU에게 인터럽트를 요청하는 거고


하드웨어 인터럽트는 CPU외의 주변 기기 장치로 부터 받는 인터럽트를 의미한다.


오늘은 소프트웨어보단 하드웨어 인터럽트에대해 정리할것이다.


일단 우리의 PC에는 8259A라는 인터럽트를 받는 PIC칩이 존재한다.


이 PIC는 2개로 이루어져 있다. 마스터 PIC + 슬레이브 PIC로 이루어져 있다.


도 이 각 각의 PIC에는 8개의 IRQ와 한 개의 INT핀 한 개의 /INTA핀이 존재한다.

(각 각의 IRQ핀은 번호가 매겨지는데 0번 째 부터 시작한다.)


마스터 PIC의 INT핀과 슬레이브 PIC의 INT핀은 CPU의 INT핀과 연결되어 있고

마스터의 /INTA핀과 슬레이브의 /INTA핀은 CPU의 /INTA핀과 연결되어 있다.


그리고 마스터의 IRQ중 하나의 IRQ핀과 슬레이브 IRQ핀과 연결되어 있다.


즉 마스터와 슬레이브가 서로 연결되어 있으니 사용가능한 하드웨어 인터럽트트는

0~15-1개의 하드웨어 인터럽트를 걸 수 있다.


일반적으로 IRQ2번에 슬레이브 PIC를 연결하는 경우가 많다.


각 각의 IRQ번호에 따라 처리 가능한 인터럽트가 정해져 있다.


  • IRQ 0번 : 타이머 
  • IRQ 1번 : 키보드 
  • IRQ 2번 : 슬레이브 PIC
  • IRQ 3번 : COM2
  • IRQ 4번 : COM1
  • IRQ 5번 : 프린터 포트 2
  • IRQ 6번 : 플로피디스크 컨트롤러
  • IRQ 7번 : 프린터 포트 1
  • IRQ 8번 : 리얼 타임 클록
  • IRQ 9번 : X
  • IRQ 10번 : X
  • IRQ 11번 : X
  • IRQ 12번 : PS/2 마우스
  • IRQ 13번 : Coprocessor
  • IRQ 14번 : 하드디스크 1
  • IRQ 15번 : 하드디스크 2
즉, 타이머라는 인터럽트를 처리한다고 가정해보자

타이머는 마스터의 IRQ 0번에 연결되어 있다.

그럼 마스터 PIC는 타이머의 인터럽트를 IRQ 0번을 통해 받아들이고 INT핀을 통해 CPU의 INT핀으로

신호를 전송한다. CPU는 이를 받고 EFALG의 IE레지스터가 1로 세트되어 있으면 /INTA핀을 통해

마스터의 /INTA핀에 잘 받았다는 신호를 넘긴다.

그리고 마스터 PIC는 Data Bus를 통해 인터럽트를 받은 IRQ 번호에 + A를 더해 CPU에게 넘긴다.

CPU는 IRQ번호 + A의 값을 바탕으로 IDT를 참조한다.

여기서 A의 값을 0x20으로 가정한다. 그러면 타이머의 IRQ 번호는 0번이니 CPU에게 가는 값은 0x20번이다.

그럼 CPU는 0x20을 IDT에서 찾는다. 0x20번지에 위치하는 인터럽트 디스크립터의 세그먼트 셀렉터 값을 참조하여

이에 맞는 값을 GDT에서 찾아낸다. 그러면 이 세그먼트 셀렉터 값을 바탕으로 세그먼트를 찾아내면 인터럽트 디스크립터에 있는 오프셋을 통해 세그먼트 주소 값 + 오프셋을 선형주소를 연산한다.

그리고 그 자리에 위치하는 핸들러 루틴을 실행한다.

이 PIC는 Program interrput Controller이다. 즉, 프로그램이 가능한 기기를 의미한다.

이 PIC도 프로그래머가 직접 프로그램이 가능한데. 간단한 명령어를 통해 이루어진다.

명령어는 총 4개가 존재하는데

먼저 ICW1은 마스터 PIC를 초기화하는 명령어다.

비트는

0 0 0 1 LTIM 0 SNGL IC4 ( 8 비트로 이루어진다. )

7~4비트는 정해진 비트이므로 건들이지 않아도 된다.

LTIM비트는 해당 PIC를 엣지 트리거 방식으로, 아니면 레벨 트리거 방식으로 진행할 것인지 정할 수 있다.

0을 넣으면 엣지, 1을 넣으면 레벨

SNGL은 PIC를 마스터PIC를 사용할 것인지 슬레이브 PIC와 같이 사용할 것인지 결정할 수 있다.

0을 넣으면 마스터 + 슬레이브 관계, 1은 마스터 PIC만들 사용

IC4는 ICW4의 명령어를 사용할 것인지 말것인지를 결정한다.

0을 넣으면 사용안함, 1을 넣으면 사용



ICW2는 IRQ번호에 얼마를 더해서 CPU에게 전달할 것인지 결정한다.


off7 off6 off5 off4 off3 0 0 0 (8비트)


뒤에 0~2비트는 0으로 고정되어 있는 비트이다. 왜냐면 이 값들은 8의 배수로 이루어져야 하기 때문에 ㅎ



ICW3은 마스터 PIC와 슬레이브 PIC의 연결방법이다.


s7 s6 s5 s4 s3 s2 s1 s0 (8비트)


이 비트의 번호는 IRQ의 번호와 대응한다. 각 각의 번호에 1을 넣음으로써 결정된다.



ICW4는 PIC를 추가적으로 세팅할 것인지 결정하는 명령어이다.


0 0 0 SFNM BUF M/S AEOI UPM (8비트)


SFNM과 BUF M/S는 사용하지 않는다.


AEOI 비트는 PIC의 Reset을 자동(1)으로 할 것인지 수동(0)으로 할 것인지 결정


PIC는 CPU에게 인터럽트를 알리고 리셋을해야 다음 인터럽트를 받을 수 있다.


UPM 비트에 1을 넣으면 8086모드로 작동하겠음을 알린다.


===========================================================


실제 어셈블리어로 PIC를 프로그램이하는 과정


ICW1


mov al, 0x11                ; PIC의 초기화    0x11 => 0001 0001 (레벨 트리거 + master + slave + ICW4명령어 필요)
out 0x20, al                  ; 마스터 PIC 의 주소에 0x11을 넣는다. 
dw 0x00eb, 0x00eb      ; jmp $+2, jmp $+2     ;이 코드는 사이에 딜레이를 넣기 위함 jmp하나는 2바이트이다
out 0xA0, al                  ; 슬레이브 PIC
dw 0x00eb, 0x00eb


ICW2


mov al, 0x20                 ; 마스터 PIC인터럽트의 시작점 ( 0010 0000 ) => 0x20부터 IRQ번호 매겨짐 
out 0x21, al
dw 0x00eb, 0x00eb 
mov al, 0x28                 ;  슬레이브 PIC 인터럽트 시작점 
out 0xA1, al 
dw 0x00eb, 0x00eb


ICW3


mov al, 0x04                ; 0x04 ( 0000 0100 ) 2번째 IRQ를 slave PIC와 연결한다. 
out 0x21, al 
dw 0x00eb, 0x00eb 
mov al, 0x02
out 0xA1


ICW4


mov al, 0x01         ;8086모드를 사용한다. UPM비트를 1로 바꿔 8086모드로 사용한다. 
out 0x21, al                        ;slave PIC의 주소에 대입 
dw 0x00eb, 0x00eb 
out 0xA1, al                        ;Master PIC의 주소에 대입 
dw 0x00eb, 0x00eb



공부하면서 궁금했던 점


Q. 0x20, 0x21이 나눠져 있던데 기준점이 있는가 그리고 ICW1, 2, 3, 4명령의 구분점

A. 0x20에 값을 넣음으로서 ICW1의 명령 시작점을 알리고 그 다음부턴 0x21 or 0xA0에 값을 넣는다.



여기서 ICW2의 명령이 이해가 잘 안갈 수 있다. 왜 번호를 붙여서 Data Bus를 통해 CPU에게 주는지


그이유는 예외처리에서 볼 수 있다.


INTEL사는 각 종 예외처리를 번호를 매겨서 관리하는데 0번부터 ~~~ A번까지 매겨져 있다.


즉, 0번은 예약된 예외처리가 있다는 것이다. 그런데 IRQ번호도 0번인데 CPU는 혼란에 빠질 수 있음.


그래서 IRQ번호에 알파를 더해서 CPU가 혼동하지 않게 할 수 있다.













Comments