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 |
리얼모드에서는 0~F 까지 (15개 입력라인을 가질 수 있다고 했다.) IRQ0~IRQ15까지 번호가 지정되었는데 보호모드에서는 IBM 초기 아키텍쳐 설계 실수로 충돌이 난다고 한다.(CPU 인터럽트와 충돌) 그래서 이 IRQ를 옮겨야 한다고 한다.(더 깊은 설명이 있는데… 번역이 대략 난감 ㅡㅡ…) (http://manggong.org/83) |
시스템콜은 위 두개와 달리 시스템에서 자동으로 발생되는 것은 아니고 프로그램에서 인위적으로 조작하여 발생시키는 인터럽트이다. 예로 어떤 응용 프로그램이 커널 기능을 사용하기 위하여 커널에게 요청 할때 사용한다.( 지금은 조금 모호하다…^^ )
위 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 |