인터럽트 설명자 테이블

Interrupt descriptor table

인터럽트 설명자 테이블(IDT)은 x86 아키텍처인터럽트 벡터 테이블을 구현하기 위해 사용하는 데이터 구조다.IDT는 프로세서에서 인터럽트예외에 대한 올바른 응답을 결정하는 데 사용된다.

아래 설명의 세부사항은 x86 아키텍처와 AMD64 아키텍처에 구체적으로 적용된다.다른 아키텍처들은 유사한 데이터 구조를 가지고 있지만 다르게 행동할 수 있다.

IDT의 사용은 하드웨어 인터럽트, 소프트웨어 인터럽트, 프로세서 예외의 세 가지 유형의 이벤트에 의해 트리거되며, 이를 함께 인터럽트라고 부른다.IDT는 256개의 인터럽트 벡터 - 프로세서 예외에 사용되는 첫 번째 32개(0–31 또는 0x00–0x1F)로 구성된다.[1]

리얼 모드

실제 모드에서는 인터럽트 테이블을 IVT(인터럽트 벡터 테이블)라고 부른다.80286까지 IVT는 항상 메모리의 동일한 위치에 상주하며,0x00000x03ff, 그리고 256개의 원거리 포인터들로 구성되었다.하드웨어 인터럽트는 프로그램 가능한 인터럽트 컨트롤러를 통해 벡터에 매핑될 수 있다.80286 이상에서는 IVT의 형식은 변경하지 않지만, 보호모드의 IDT(Interrupt Descriptor Table Register) 명령(즉, LIDT(Load Interrupt Descriptor Table Register)을 통해 IVT의 크기와 위치를 그대로 변경할 수 있다.[2]

BIOS 인터럽트

BIOS는 인터럽트 핸들러를 등록함으로써 하드웨어 설비의 서브셋에 대한 간단한 리얼 모드 액세스를 제공한다.그것들은 INT 명령과 함께 소프트웨어 인터럽트로 호출되며 매개변수는 레지스터를 통해 전달된다.이러한 인터럽트는 시스템 메모리 레이아웃 감지, VGA 출력 및 모드 구성, 부팅 프로세스 초기에 디스크 액세스와 같은 다양한 작업에 사용된다.

보호 및 롱 모드

IDT는 메모리에 연속적으로 저장되고 벡터 번호에 의해 색인화된 설명자의 배열이다.가능한 모든 항목을 사용할 필요는 없다. 사용 중인 가장 높은 인터럽트 벡터까지 테이블을 채우고, IDT 길이 부분을 설정하기에 충분하다.IDTR이에 따라서

IDTR 레지스터는 IDT의 물리적 기본 주소와 길이(바이트)를 모두 저장하는 데 사용된다.인터럽트가 발생하면 프로세서는 인터럽트 벡터를 항목 크기(보호 모드의 경우 8개, 롱 모드의 경우 16개)로 곱하고 그 결과를 IDT 기본 주소에 추가한다.[3]주소가 테이블 안에 있으면 DPL을 확인하고 게이트 유형에 따라 인터럽트를 처리한다.

설명자는 인터럽트 게이트, 트랩 게이트 또는 32비트 보호 모드에 대해서만 태스크 게이트일 수 있다.인터럽트 및 트랩 게이트는 세그먼트(GDT 또는 LDT 중 하나에 표시)와 해당 세그먼트 내의 오프셋을 모두 지정하여 실행할 코드를 포함하는 메모리 위치를 가리킨다.트랩 게이트와 인터럽트 게이트의 유일한 차이점은 인터럽트 게이트가 하드웨어 인터럽트의 추가 프로세서 처리를 비활성화하여 하드웨어에서 생성된 인터럽트를 처리하기에 적합하다는 것이다(반대로, 트랩 게이트는 소프트웨어 인터럽트와 예외를 처리하는 데 유용하다).작업 게이트는 하드웨어 작업 스위치 메커니즘을 사용하여 프로세서의 사용을 다른 프로그램, 스레드 또는 프로세스로 효과적으로 넘겨주는 현재 활성 작업 상태 세그먼트를 전환하게 한다.

프로세서 생성 예외

0x0과 0x1F 사이의 모든 INT_NUM은 예외를 위해 예약되며, 0x1F보다 큰 INT_NUM은 인터럽트 루틴에 사용된다.(를 들어 인터럽트 5를 사용하여 인쇄 화면 키를 눌렀음을 나타내는 등 IBM PC가 이 규칙을 항상 준수하지는 않았다.)

INT_NUM 간단한 설명 PM[clarification needed]
0x00 0으로 나누기
0x01 1단계 인터럽트(트랩 플래그 참조)
0x02 NMI
0x03 중단점(INT 3의 짧은 0xCC 인코딩으로 이득을 얻음)
0x04 오버플로
0x05 바운드 범위 초과
0x06 잘못된 작업 코드
0x07 코프로세서를 사용할 수 없음
0x08 이중 결함
0x09 코프로세서 세그먼트 오버런(386 이하만 해당)
0x0A 잘못된 작업 상태 세그먼트
0x0B 세그먼트가 없음
0x0C 스택 세그먼트 결함
0x0D 일반 보호 결함
0x0E 페이지 결함
0x0F 내성적인
0x10 x87 부동 소수점 예외
0x11 정렬 검사
0x12 머신 체크
0x13 SIMD 부동 소수점 예외
0x14 가상화 예외
0x15 제어 보호 예외(CET에서만 사용 가능)

후킹

일부 Windows 프로그램은 IDT에 호출을 연결한다.여기에는 IDT에 대한 호출을 차단하고 자체 프로세싱을 추가하는 커널 모드 드라이버를 작성하는 것이 포함된다.이는 마이크로소프트에 의해 공식적으로 지원된 적이 없지만 커널 모드 후크를 사용하려는 드라이버가 기계 버그 검사를 유발하는 64비트 버전의 윈도우가 있기 전까지는 운영 체제에서 프로그램적으로 금지되지 않았다.[4]

참조

  1. ^ "Exceptions - OSDev Wiki". wiki.osdev.org. Retrieved 2021-04-17.
  2. ^ Intel® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서, 20.1.4인터럽트 및 예외 처리
  3. ^ Intel® 64 및 IA-32 Architectures 소프트웨어 개발자 설명서, 6.12.1 예외 또는 인터럽트 핸들러 절차
  4. ^ "Patching Policy for x64-Based Systems". If the operating system detects one of these modifications or any other unauthorized patch, it will generate a bug check and shut down the system.
일반

외부 링크