IDT.

http://manggong.org/41 여기에서 살짝 언급 했다.

Interrupt descriptor table라고 불리는 놈으로써 Interrupt Vector Table을 구현해 놓은 놈.

이라고 정리했었다. ㅎㅎㅎ 저 글 작성할때, 감정이 다시 돌아 상기 되는듯 하다. 자…

그러면, Interrupt Vector Table 이 무엇인지를 찾아 봐야 겠지??

검색해보자..

….

리얼모드에서는 Interrupt Vector Table(IVT) 이라고 불리우고… 보호모드에서는 Interrupt descriptor table(IDT)이라고 불리우고 .. 또…음???

Interrupt Service Routine(ISR)이 있는 곳을 가르키는 테이블? 이라는데??

흠… 그러면 ISR 은 또 무엇이냐???

이것저것 많은 것들이 검색 되던데 “어떤 인터럽트 발생 시, 발생된 인터럽트가 해야 할 일” 이라고 정리하고 끝내야 겠다. 즉 인터럽트 발생되면 실행되는 애라고 보면 될 것 같다. 그러면 여기서 짚고 넘어가야 할 인터럽트는 정확히 무엇인가??


인터럽트

뭔가 있어 보이는 말이다. ㅋㅋㅋㅋ

위키백과(https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8)에서는 다음과 같은 정의를 내렸다.

“마이크로프로세서에서 인터럽트(Interrupt:중단, 세치기)란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외 상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.”

인터럽트는 3가지 종류가 있다고 한다.

예외상황 인터럽트, 하드웨어 인터럽트, 시스템 콜.

예외상황 인터럽트는 시스템에 심각한 에러가 생겼을 때 발생되며 예로 어떤 수를 0으로 나누라는 명령어가 실행되었다던지, 페이지 폴트(?) 일어났을 때 발생된다.

인터럽트 번호 발생상황 설명
0

0 으로 나누기 예외

0으로 나누려고 할 경우.

1

디버그

EFLG의 T플래그 설정 및 디버그

2

NMI(Non Maskable Interrupt)

마스킹 불가능한 인터럽트용으로 예약

3

int 3

int 3 명령을 만날경우

4

오버플로우 발생

INTO 명령 실행 시 EFLAGS의 OF 플래그 설정.

5

유효주소 범위 초과

피연산자가 유효주소 범위를 벗어난 경우

6

알수 없는 명령어

잘못된 CPU 명령어 만날 경우.

7

디바이스 사용불가

CR0의 TS설정 상태에서 MMX 명령어를 실행.

8

연속 예외상황 처리 불가능

예외처리 과정중 예외가 또 발생한 경우.

9

Coprocessor 에러

Coprocess 에러 발생

10

무효 TSS 에러

잘못된 TSS를 가지고 태스크전환 할시

11

세그먼트 범위 초과

메모리에 존재하지 않는 세그먼트 참조

12

스택 세그먼트 에러

스택 제한을 벗어나거나 존재하지 않는 메모리 참조

13

일반 보호 에러

보호규약을 위반한 경우

14

페이지 폴트 에러

참조한 페이지가 메모리에 존재 하지 않은 경우

15

정의되지 않음

-

16

X87 부동소수점 에러

부동소수 오버플로우나 0으로 나눈 경우

17

정렬 체크 에러

피연산자의 주소가 정렬되지 않는 경우

18

머신 체크 에러

코드와 소스가 머신과 맞지 않는 경우

19

SIMD 부동소수점 에러

SSE와 SSE2 Floating-point instruction 의해 발생

하드웨어 인터럽트는 주변장치에 뭔가 일이 생겼을 때 발생되며 예로, 키보드가 눌렸다던지 마우스가 조작이 되었을 때 발생된다.

IRQ 설명
0

타이머

1

키보드

2

8259A 슬레이브 컨트롤러

3

두번째 시리얼 포트(COM2/COM4)

4

첫번째 시리얼 포트(COM1/COM3)

5

LPT2

6

플로피 디스크

7

LPT1

8

시스템 클록 RTC

9

할당되어 있지 않음

10

할당되어 있지 않음

11

할당되어 있지 않음

12

PS/2 마우스

13

수치 Coprocessor

14

EIDE Disk 컨트롤러 1

15

EIDE Disk 컨트롤러 2

  하드웨어 인터럽트의 발생을 CPU에 알리는 놈은 8259 고 이전 포스팅에서 적었다.
리얼모드에서는 0~F 까지 (15개 입력라인을 가질 수 있다고 했다.)  IRQ0~IRQ15까지 번호가 지정되었는데 보호모드에서는 IBM 초기 아키텍쳐 설계 실수로 충돌이 난다고 한다.(CPU 인터럽트와 충돌) 그래서 이 IRQ를 옮겨야 한다고 한다.(더 깊은 설명이 있는데… 번역이 대략 난감 ㅡㅡ…) (http://manggong.org/83)
 
또한 위 IRQ와 CPU 기본 인터럽트 번호가 충돌하여 옮겨줘야 한다고 언급 했었다. 영어로 된걸 번역하면서 이해하다 보니 긴글로 오는 피로감으로 넘어갔었는데… 간략하게 이해해 보자면
8259A는 인터럽트 발생 시 IRQ번호 + 내부 Base 로 계산하여 인터럽트 번호를 전달한다고 한다. 즉 내부 Base번호를 설정함으로써 인터럽트 번호 충돌을 회피 한다는 것이다.
 
 

시스템콜은 위 두개와 달리 시스템에서 자동으로 발생되는 것은 아니고 프로그램에서 인위적으로 조작하여 발생시키는 인터럽트이다. 예로 어떤 응용 프로그램이 커널 기능을 사용하기 위하여 커널에게 요청 할때 사용한다.( 지금은 조금 모호하다…^^ )


 

위 3개의 인터럽트들을 IDT 구조에 연속하여 입력하고 이 연속된 테이블 시작 주소를 IDTR 레지스터에 등록하면 인터럽트 처리에 대한 (IVT) 테이블에 정의해 놓고 인터럽트가 발생시 해당 인터럽트 기능을 실행하게 하는게 최종 목표인듯 싶다.

자.. 그러면… IDT 구조를 다시 한번 확인해 보자.

각 항목에 대한 설명은 넘어가고.. 이걸 구조체로 만들면 다음과 같다.

struct _IDT
{
	unsigned short Offset_low;
	unsigned short Selector;
	unsigned char Unused;
	unsigned char Access;
	unsgined short Offset_high;
};

셀렉터는 커널 셀렉터를 입력해 주면 될듯 싶고 인터럽트 번호에 매칭되는 ISR 위치를 Offset에 입력해주면 인터럽트 관련하여 IDT 구성은 끝나는 것 같다.

다음에는 실제 IDT 를 구현해 보는걸로…

 

'프로그래밍 > OS 만들기' 카테고리의 다른 글

OS 만들기 #18 IDT - 3  (0) 2015.08.12
OS 만들기 #17 IDT - 2  (0) 2015.08.10
OS 만들기 #15 커널-키보드 입력  (0) 2015.02.09
OS 만들기 #14 PE 재배치  (0) 2014.03.28
OS 만들기 #13 보호모드 진입  (0) 2014.03.27

+ Recent posts