1. PIC ( Programmable Interrupt Controller )
PC의 모든 외부로부터의 하드웨어 인터럽트는 8259A라는 칩을 통해서 입력을 받습니다. PIC를 제어 하기 위해, OS에는 PIC을 초기화하고 연결, 인터럽트를 받아들이는 방법, 받아 들인 인터럽트를 CPU에 전달하는 방법이 정의되어 있어야 합니다.
PIC은 master –slave 구조로 구성되고, 마스터 PIC의 IRQ 핀 8개 (0 – 7)와 슬래이브 PIC의 IRQ 핀 8개 (8 – 15)로 각 핀에 연결된 하드 웨어 장치의 인터럽트를 받아, CPU에게 알리고, CPU는 인터럽트의 정보를 PIC으로부터 받아 해당 인터럽트 루틴을 실행합니다.
마스터 PIC의 동작은 다음과 같습니다.
연결된 장치 중, 인터럽트가 발생하면,
(1) INT 핀에 신호를 실어 CPU의 INT 핀에 신호를 줌
- CPU는 Eflags에 IE 비트를 1로 세트하고, 인터럽트를 받을수 있는 상황이면 /INTA 핀으로 신호를 보냄
(2) CPU로부터 /INTA핀으로 신호가 오면, 몇 번째 IRQ에 연결된 장치에서 인터럽트가 발생했는지 데이터 버스를 통에 CPU에 전달
- CPU는 PIC이 보내온 데이터를 참조하여, Protected Mode로 실행 중이면 그 번호에 맞는 디스크립터를 찾아 인터럽트 핸들러를 실행
슬레이브 PIC의 동작은 다음과 같습니다.
(1) 자신의 INT 핀에 신호를 실어 마스터 PIC의 IRQ 2번 핀에 인터럽트 신호를 보냄
- 마스터 PIC은 자신의 IRQ 핀에서 인터럽트가 발생하여, CPU에게 INT핀으로 신호 보냄
(2) CPU가 /INTA 신호를 주면 데이터버스에 숫자를 실어 몇 번째 장치에서 인터럽트가 발생했는지 알려줌
마스터 PIC과 슬레이브 PIC을 사용하기 위해서는 초기화를 해주어야 하며, 동작 등을 프로그래밍 해 주어야 합니다.
PIC을 제어 하기 위해 4개의 프로그램을 정의 하겠습니다.
ICW1, ICW2, ICW3, ICW4
PIC이 사용하는 I/O port는 다음과 같은 주소를 사용합니다.
Master PIC Command : 0x20
Master PIC Data : 0x21
Slave PIC Command : 0xA0
Slave PIC Data : 0xA1
PIC 초기화 – ICW1
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
1 |
L T I M |
0 |
S N G L |
I C 4 |
LTIM – 엣지 트리거링(0), 레벨 트리거링(1)
SNGL – 마스터 슬레이브 구조(0), 마스터만 사용(1)
마스터 PIC을 초기화 하기 위해서 다음과 같이 세트 해 줍니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
16진수로 계산해 보면 0x11 입니다.
I/O 명령어인 out을 이용하여, 마스터 PIC을 I/O 주소 0x20 에 프로그램 합니다.
mov al, 0x11 out 0x20, al |
딜레이를 주기 위해 다음 명령어를 2번 실행시킵니다.
jmp $+2
nop
nop
이 명령들은 헥사코드로 0x00eb입니다. 따라서 이렇게 표시합니다
dw 0x00eb, 0x00eb |
슬레이어 PIC도 I/O주소 0xA0에 마찬가지로 세트 하고, 마찬가지로 딜레이를 줍니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
out 0xA0, al dw 0x00eb 0x00eb |
PIC의 IQR의 시작점 설정(IRQ 리맵핑): ICW2
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Off7 |
off6 |
Off5 |
Off4 |
Off3 |
0 |
0 |
0 |
이 PIC이 인터럽트를 받았을 때 IRQ 번호에 얼마를 더 해서 CPU에 알려줄지 정합니다. 0 – 2 비트가 0인 것은 이 숫자를 8 단위로 기재해야 된다는 뜻입니다.
마스터 PIC에 다음과 같이 세트합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
mov al, 0x20 out 0x21, al dw 0x00eb, 0x00eb |
슬레이브 PIC을 다음과 같이 세트합니다. IRQ 8 부터 시작 함으로, 앞서 마스터 PIC에 지정한 것에서 8을 더해서 슬레이브 PIC은 0x28을 세트 합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
mov al, 0x28 out 0xA1, al dw 0x00eb, 0x00eb |
만약 IRQ0에 연결된 하드웨어에서 인터럽트가 발생한다면, ICW2 명령어에서 0x20을 설정했기 때문에 IRQ 번호는 0x20이 됩니다.
슬레이브 PIC의 IRQ0 핀(전체적으로 보면 IRQ8)에 연결된 하드웨어 에서 인터럽트가 발생한다면, 0x28 이 됩니다.
마스터 PIC과 슬레이브 PIC의 구분 – ICW3
IRQ2 번에 슬레이브 PIC이 연결되어 있다는 것을 마스터 PIC에게 알려줍니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S2 |
S0 |
S0 – S7은 각 IRQ 선에 해당됩니다. 0이 들어가면, 하드웨어 장치에 연결이 되어 있다는 것을 나타내고, 1을 연결하면 슬레이브 PIC에 연결되어 있음을 의미합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
ID2 |
ID2 |
ID0 |
몇 번째 IRQ 핀에 연결되어 있는지 마스터 PIC에 해당 비트를 1로
3~7비트는 0으로 하여, ID0 – ID2의 3비트를 사용하여 슬레이브 PIC이 마스터 PIC의 몇 번 IRQ 핀에 연결되어 있는지 세트합니다.
마스터 PIC의 IRQ 2번에 슬레이브 PIC을 연결합니다.
마스터 PIC은 이렇게 세트 합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
슬레이브 PIC은 다음과 같이 세트 합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
1 |
0 |
mov al, 0x04 out 0x21, al dw 0x00eb, 0x00eb mov al, 0x02 out 0xA1, al dw 0x00eb, 0x00eb |
추가 명령어 : ICW4
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
S F N M |
B U F |
M / S |
A E O I |
U P M |
SFNM과 BUF, M/S의 기능은 우리가 사용하는 PC에서 구현되어 있지 않기 때문에 항상 0으로 설정합니다.
AEOI – PIC의 Reset을 자동으로 할지, 수동으로 할지 나타냄
리셋을 자동으로 수행하도록 한다면 CPU에 IRQ 번호를 알린 후 바로 리셋 하며, 수동으로 수행하도록 한다면 CPU에서 IRQ 번호를 받아들이고, 인터럽트 루틴을 처리 한 다음, PIC에 명령을 주어 리셋해야 합니다.
uPM - MCS-80/85 모드(0) , 8086(1)
IRQ를 자동으로 리셋하고, 8086 모드로 실행되게 합니다.
다음과 같이 마스터 PIC을 설정합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
다음과 같이 슬레이브 PIC을 설정합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
mov al, 0x01 out 0x21, al dw 0x00eb, 0x00eb out 0xA1, al dw 0x00eb, 0x00eb |
인터럽트 막기
Protected Mode로 넘어가면서 IDT 설정, 하드웨어 인터럽트 등 작업을 하는 동안 모든 인터럽트를 불가능으로 전환합니다.
마스터 PIC의 IRQ핀에서 슬레이브 PIC이 연결된 IRQ2번 핀을 제외하고 인터럽트를 막고, 슬레이브 PIC의 모든 인터럽트를 막습니다.
슬레이브 PIC을 다음과 같이 설정합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
마스터 PIC을 다음과 같이 설정합니다.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
mov al, 0xFF out 0xA1, al dw 0x00eb, 0x00eb mov al, 0xFB out 0x21, al |
'Operating Systems > OS 커널 제작' 카테고리의 다른 글
4. Interrupt 와 Exception (4) - 예외 (0) | 2015.01.20 |
---|---|
4. Interrupt 와 Exception (3) – 인터럽트 핸들러 (0) | 2015.01.19 |
3. Protected Mode (3) (0) | 2015.01.17 |
3. Protected Mode (2) (0) | 2015.01.15 |
3. Protected Mode (1) (0) | 2015.01.14 |