[OS 개발 12] 인터럽트와 예외처리(2) PIC와 예외처리


1. PIC의 개념


 

인터럽트는 소프트웨어 인터럽트와 하드웨어 인터럽트로 분류할 수 있습니다. 그런데 키보드 입력, 디스크 제어 등은 하드웨어 단에서 인터럽트가 걸려야 하기 때문에, 구현할 때 PIC에 대해 어느 정도 알고있어야 합니다.

 

PIC는 Programmable Interrupt Controler의 약자로, 하드웨어 인터럽트를 처리하는 역할을 담당합니다. 대부분의 PC는 서로 다른 주소에 위치한 두 PIC를 갖습니다. 이 중 하나는 개별적 IRQ라인들 15개 중에서 각각 0~7, 8~15번째의 IRQ를 가지고 있습니다. 아래의 그림을 참고하시기 바랍니다.

 

 

 

 

PIC는 크게 master –slave 구조로 구성되어 있습니다. 그리고 각 PIC에는 8개의 핀(마스터-0~7핀, 슬레이브-8~15핀)이 붙어있으며, 이 핀은 하드웨어에 연결되어 있습니다. 그리고 각 핀이 연결된 하드 웨어 장치의 인터럽트를 받아 CPU에게 알리면, CPU가 지난 포스팅에서 보았던 인터럽트 처리절차를 진행합니다. 아래 링크를 통해 관련 글을 참고하시기 바랍니다.

 

 

2016/02/11 - [분석연구소/운영체제] - [OS 개발 11] 인터럽트와 예외처리(1) IDT의 개념

 

특히 각 핀은 연결된 하드웨어에 따라 인터럽트를 받는 역할이 다른데, 그 정보를 아래 표로 정리해보았습니다.

 

 PIC 구분

BIT

IRQ

 설명

Master

0

IRQ0

 타이머

1

IRQ1

 키보드 

2

IRQ2

 슬레이브PIC 

3

IRQ3

 COM2 

4

IRQ4

 COM1 

5

IRQ5

 프린터 포트 2 

6

IRQ6

 플로피디스크 컨트롤러 

7

IRQ7

 프린터 포트 1

Slave

0

IRQ8

 리얼 타임 클록 

1

IRQ9

 X 

2

IRQ10

 X 

3

IRQ11

 X 

4

IRQ12

 PS/2 마우스 

5

IRQ13

 Coprocessor 

6

IRQ14

 하드디스크 1 

7

IRQ15

 하드디스크 2 

 

구체적으로, 이 PIC의 IRQ 핀은 어떻게 작동할까요? 마스터와 슬레이브로 나누어 살펴보도록 하겠습니다.


 

마스터

1. 마스터 PIC에서 인터럽트가 발생한다.

2. 마스터 PIC는 자신의 INT에 신호를 싣고 CPU의 INT에 전달한다.

3. CPU가 인터럽트를 받으면 EFLAG의 IE 비트를 1로 세트하고 INTA를 통해 받았다는 신호를 PIC에 전달한다.

4. PIC은 자신의 INTA를 통해 이 신호를 받고 어떤 IRQ에 연결된 장치에서 인터럽트가 발생했는지 데이터 버스를 통해 CPU로 전달한다.

5. CPU는 Protected Mode라면 IDT 디스크립터를 찾아서 지난 포스팅에서 다뤘던 과정들을 통해 인터럽트 핸들러를 실행한다.

 

슬레이브 

1. 슬레이브 PIC에서 인터럽트가 발생한다.

2. 슬레이브 PIC이 자신의 INT 핀에 신호를 싣고 마스터 PIC IRQ 2번에 인터럽트 신호를 보낸다.

3. 마스터는 위에서 설명한 5가지의 절차를 진행한다. 단, 이 과정에서 CPU에 몇 번째 IRQ에서 인터럽트가 발생했는지 알려줄 때에는 8~15번이 된다.

 

그리고 IRQ가 하드웨어 인터럽트가 발생할 때 적절히 작동하도록 하기 위해 PIC가 가진 각 IRQ를 초기화 해줘야 합니다. 이를 위해 마스터 PIC의 명령 레지스터로 명령어를 바이트로 전달해야 하는데, 이때 ICW(Initialization Control Word)가 사용됩니다. 즉, 각 ICW는 명령어라고 보면 될 것 같네요. 이 ICW에는 4가지의 초기화 명령어들로 구성되어 있습니다.

 

 

1. ICW1

 

ICW1 컨트롤 워드는 PIC 초기화에 사용된다. 이 7비트의 값은 마스터 PIC 명령 레지스터에 넣어져야 하는데, 그 포맷은 다음과 같습니다.

 

비트

설명

0

IC4

 1로 셋되면, PIC는 초기화하는 동안 IC4를 받을 것이다

1

SNGL

 1로 셋되면 시스템에 PIC가 하나만 있는 것이며, 0이면 마스터/슬레이브 형식으로 사용함을 나타낸다. 이것은 ICW3이 

 컨트롤러로 보내져야 한다. 

2

ADI

 1로 셋되면 CALL주소 간격이 4며, 그 외에는 8이다. 이것은 일반적으로 x86에서는 무시되고, 디폴트 값은 0이다.

3

LTIM

 1로 셋되면 트리거 모드 레벨에서 작동한다. 0이면 엣지 트리거 모드에서 작동한다

4

1

 초기화 비트이다. PIC가 조기화 되기 위해 1로 셋된다.

5

0

 MCS-80/85: 인터럽트 벡터 주소이다. x86 아키텍처에서는 0으로 셋되어야 한다.

6

0

 MCS-80/85: 인터럽트 벡터 주소이다. x86 아키텍처에서는 0으로 셋되어야 한다.

 7

0

 0으로 셋되어 있다.

 

 

2. ICW2

 

이 컨트롤 워드는 사용되기 위한 PIC의 IVT 베이스 어드레스를 매핑하기 위해 사용됩니다.

 

인터럽트 벡터(interrupt vector)는 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간입니다. 인텔 아키텍처에서는, 가상메모리를 사용하지 않았던 386이전에는 주로 Main Memory의 0번째에 위치하였으나, 이후부터는 IDT(Interrupt descriptor table)의 형태로 바뀌었습니다. 이러한 인터럽트 백터를 한데 모아둔 공간이 인터럽트 백터 테이블(Interrupt Vector Table)이며, 이 IVT는 물리 메모리의 1024바이트에 위치해 있습니다. 그 주소는 0x0~0x3FF인데, 앞서 포스팅에서 살펴보았던 메모리 맵을 통해 이를 확인할 수 있습니다. 아래 링크를 통해 메모리 맵을 잠시 살펴보도록 하겠습니다

 

2016/02/03 - [분석연구소/운영체제] - [OS 만들기 5] 부트로더의 개념 및 제작, 실행, 분석

 

PIC를 초기화하는 동안 IRQ의 핀을 사용하기 위해 IVT 베이스 어드레스가 있는 곳을 알려줘야 하는데, 이를 위해 PIC로 ICW2를 보내줘야 합니다. 포맷은 다음과 같다.

 

비트

설명

0 ~ 2

0

 MCS-80/85 모드에서는 ITV를 위한 A8~A10 어드레스 비트

3~7

off3~off7

 MCS-80/85 모드에서는 IVT를 위한 A11~A11 어드레스 비트. x86 모드에서는 IVT를 명시고, 0으로 셋 될 것이다. 

 



 

3. ICW3

 

이것은 PIC의 마스터와 슬레이브가 서로 통신할 때 어떤 IRQ 라인을 사용할지 알려주기 위해 사용됩니다.

 

마스터 PIC를 위한 명령어

비트

설명

0 ~ 7

S0~S7

 IRQ가 슬레이브 PIC로 연결된 것이 무엇인지를 명시한다.

 

 

슬레이브 PIC를 위한 명령어

비트

설명

0 ~ 2

ID0

 마스터 PIC를 위한 IRQ 넘버

3 ~ 7

0

 0으로 예약되어있다.

 

 

4. ICW4

 

추가 명령어를 의미합니다.

비트

설명

0

uPM

 1로 셋되면 80x86 모드이고 0이면 MCS-80/86 이다. (디폴트는 0이다)

1

AEOI

 마지막 인터럽트를 알려주며, 컨트롤러는 자동적으로 인터럽트 동작의 끝을 수행한다.

2

M/S

 만약 1로 셋 되면 버퍼 마스터를 선택하고 0이면 버퍼 슬레이브를 사용한다.

3

BUF

 셋 되면 컨트롤러는 버퍼 모드를 작동한다.

4

SFNM

 Special Fully Nested Mode.

5 ~ 7

0

 0으로 예약되어 있다.

 
  

2. 예외 처리하기


 

예외란 컴퓨터 프로그램이 동작하는 중에 문제를 일으킬 소지가 있는 명령의 실행으로 인해 발생하는 것으로, 이를 해결하기 위해 CPU가 인터럽트를 발생시킵니다. 이는 인터럽트 벡터 넘버로 지정되어있는데 그 예외의 종류는 다음과 같습니다.

 

 

여기에서 0~19는 인터럽트 예외 처리를 위한 부분이고 20~31은 인텔이 예약한 번호이다. 32~255번은 개발자가 지정할 수 있습니다.

그리고 이러한 예외를 CPU가 처리하기 위해 커널 모드 스택에 저장장하는 eip 레지스터의 값에 다음과 같이 3가지로 분류할 수 있습니다.

 

Faults : 저장된 eip 값은 폴트를 일으킨 명령어의 주소입니다. 따라서 해당 예외가 발생해도 프로그램을 재시작하면 진행중인 작업을 이어서 수행할 수 있습니다. '페이지 폴트' 예외가 이에 해당됩니다.

Traps : 트랩을 발생시키는 명령어가 있는데, 이를 실행하면 발생합니다. eip에는 트랩을 발생시킨 명령어 다음에 실행해야 하는 명령어의 주소입니다. 즉 마지막 종료된 명령어를 계속 이어서 수행할 필요가 없을때 사용됩니다. 트랩의 주용도는 디버깅이며, brake point가 이해 해당됩니다.

Aborts : 하드웨어 고장이나 시스템 테이블에 잘못된 값이 들어가 있는 경우와 같이 심간한 오류 상황이 생겼을 때 발생합니다. eip 레지스터에 예외를 일으킨 정확한 위치를 저장하지 못하는 경우가 있는데, 프로세스를 종료하는 등의 방법 밖에 없습니다.

 

 

여기까지 PIC와 예외에 대해 간단하게 알아보았습니다. 사실 이 둘에 대한 더 깊이 있는 내용까지 다루고자 했지만, 우선 간단한 IDT를 구현하는 것에는 이 정도로도 충분할 것으로 생각됩니다. 기회가 되면 좀 더 자세하게 분석하여 포스팅 하도록 하겠습니다.

 

 


TAGS.

Comments