맨위로가기

인터럽트 서술자 테이블

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

인터럽트 서술자 테이블(IDT)은 x86 아키텍처에서 인터럽트 및 예외 처리를 위한 중요한 데이터 구조이다. 리얼 모드에서는 인터럽트 벡터 테이블(IVT)로 불리며, 256개의 인터럽트 처리 루틴 주소를 담고 있다. 보호 모드에서는 IDT로 확장되어, 인터럽트 게이트, 트랩 게이트, 태스크 게이트를 포함하는 8바이트 또는 16바이트 디스크립터 배열을 사용한다. IDT는 프로세서 예외와 하드웨어 인터럽트를 처리하며, 운영체제와 하드웨어 간의 상호 작용을 관리한다. 윈도우 운영체제에서 IDT 후킹은 시스템 동작을 변경하는 데 사용되었으나, 안정성 및 보안 문제로 인해 사용이 제한되고 있다.

더 읽어볼만한 페이지

  • 인터럽트 - 프로그래머블 인터럽트 컨트롤러
    프로그래머블 인터럽트 컨트롤러(PIC)는 컴퓨터 시스템에서 인터럽트 요청을 관리하며, 인터럽트 요청 레지스터 등을 사용하여 인터럽트를 처리하고 다양한 우선순위 체계를 지원하며, x86 아키텍처에서는 인텔 8259가 널리 사용되었다.
  • 인터럽트 - 도스 API
    도스 API는 응용 프로그램이 MS-DOS 운영체제의 시스템 기능을 사용하도록 제공되는 인터페이스로, CP/M 호환성을 고려한 초기 설계 이후 유닉스 개념 도입, 네트워크 기능 추가 등으로 확장되었으며, 다양한 운영체제에서 에뮬레이터를 통해 지원된다.
  • 메모리 관리 - 동적 메모리 할당
    동적 메모리 할당은 프로그램 실행 중 힙 영역에서 메모리 공간을 확보 및 해제하여 효율적인 메모리 관리와 유연성을 제공하는 기술로, 메모리 누수 방지 및 가비지 컬렉션 등의 고려 사항이 중요하며 C, C++, C++/CLI, C# 등에서 사용된다.
  • 메모리 관리 - 정적 변수
    정적 변수는 프로그램 실행 시간 동안 값을 유지하며, C 언어에서 `static` 키워드로 정의되어 함수 호출 간에 값을 유지하고, 객체 지향 프로그래밍에서 클래스의 모든 인스턴스에서 공유되는 클래스 변수로 사용된다.
  • X86 아키텍처 - 물리 주소 확장
    물리 주소 확장(PAE)은 x86 아키텍처에서 32비트 주소를 36비트 이상으로 확장하여 CPU가 4GB 초과 물리 메모리에 접근하도록 하는 기술로, 페이지 테이블 확장 및 추가 페이지 테이블을 통해 최대 64GB 메모리를 지원하며 AMD64 아키텍처에서 가상 주소 공간 확장에 사용되고 운영 체제, 칩셋, 마더보드의 지원이 필요하며 CPUID 플래그로 지원 여부를 확인한다.
  • X86 아키텍처 - X86 가상화
    X86 가상화는 x86 아키텍처 기반 시스템에서 가상 머신을 구현하는 기술로, 소프트웨어 기반 가상화와 하드웨어 지원 가상화로 나뉘며, CPU 제조사의 가상화 확장 기술을 활용하여 가상 머신의 성능을 향상시킨다.
인터럽트 서술자 테이블
개요
종류데이터 구조
사용인터럽트 처리
설명인터럽트 벡터 테이블 또는 인터럽트 디스패치 테이블이라고도 함
인터럽트 핸들러 루틴의 주소를 저장하는 데이터 구조
시스템 유형마이크로프로세서
상세 정보
설명인터럽트가 발생하면 마이크로프로세서는 인터럽트 벡터를 사용하여 해당 인터럽트 서비스 루틴(ISR)의 주소를 결정함
인터럽트 벡터는 인터럽트 서술자 테이블(IDT)에 저장된 인덱스임
IDT 엔트리각 엔트리는 인터럽트 핸들러의 세그먼트 셀렉터와 오프셋을 포함
엔트리에는 권한 수준, 존재 플래그, 게이트 유형과 같은 속성도 포함
인터럽트 처리 과정인터럽트가 발생하면 CPU는 IDT를 참조하여 해당 ISR의 주소를 찾음
CPU는 현재 실행 중인 프로세스의 상태를 저장하고 ISR을 실행함
ISR이 완료되면 CPU는 저장된 상태를 복원하고 원래 프로세스 실행을 재개함
활용
예외 처리IDT는 하드웨어 오류, 페이지 폴트, 0으로 나누기와 같은 예외를 처리하는 데 사용됨
예외 발생 시 CPU는 해당 예외 핸들러를 호출하기 위해 IDT를 참조함
인터럽트 요청 (IRQ)IDT는 키보드, 마우스, 하드 드라이브와 같은 하드웨어 장치에서 발생하는 인터럽트 요청(IRQ)을 처리하는 데 사용됨
IRQ가 발생하면 CPU는 해당 ISR을 호출하기 위해 IDT를 참조함
구현
위치IDT는 일반적으로 메모리의 보호된 위치에 저장됨
운영 체제 커널은 시스템 초기화 중에 IDT를 설정함
크기IDT의 크기는 시스템 아키텍처에 따라 다름
기타
참고 자료OSDev Wiki - Exceptions
Bran's Kernel Development Tutorial - IRQs and PICs

2. 리얼 모드

인텔 8086 프로세서와 같은 초기 x86 CPU의 리얼 모드 환경에서는 인터럽트 처리를 위해 인터럽트 벡터 테이블(IVT)이 사용되었다. 인텔 8086의 경우, IVT는 메모리의 특정 고정 위치(`0x0000` ~ `0x03ff`)에 존재하며, 256개의 리얼 모드 포인터로 구성되어 각 인터럽트 처리 루틴의 시작 주소를 가리켰다.

인텔 80286 프로세서부터는 보호 모드에서처럼 인터럽트 테이블의 위치나 크기를 변경하는 것이 가능해졌지만, 리얼 모드 환경에서는 여전히 IVT의 기본적인 구조가 유지되었다.[3] 리얼 모드 포인터는 16비트 세그먼트 주소와 16비트 오프셋으로 구성되어 1 MB 메모리 공간 내의 주소를 지정하는 데 사용되었다.

x86 리얼 모드 환경에서는 BIOS 기능을 호출하기 위한 INT 10H와 같은 소프트웨어 인터럽트가 널리 사용되었다.

2. 1. IVT 구조

리얼 모드에서 인터럽트 테이블은 IVT(인터럽트 벡터 테이블)라고 불린다. 인텔 8086 프로세서와 같이 80286 이전 모델에서는 IVT가 항상 메모리 주소 `0x0000`부터 `0x03ff`까지, 총 1 KB 크기의 영역에 고정적으로 위치했다.

IVT는 총 256개의 인터럽트 벡터로 구성되며, 각 벡터는 4바이트 크기의 리얼 모드 포인터이다. 이 포인터는 특정 인터럽트가 발생했을 때 실행될 인터럽트 처리 루틴의 메모리 주소를 가리킨다. 각 포인터는 16비트 세그먼트 주소와 16비트 오프셋 값으로 이루어져 있다. 프로세서는 이 세그먼트 주소를 내부적으로 20비트로 확장하여, 리얼 모드에서 접근 가능한 1 MB 메모리 공간 내의 주소를 지정하게 된다.

IVT의 처음 32개 벡터(0번부터 31번까지)는 CPU 내부에서 발생하는 예외(Exception) 상황 처리를 위해 예약되어 있다. 나머지 벡터들은 하드웨어 인터럽트나 소프트웨어 인터럽트를 위해 사용될 수 있으며, 하드웨어 인터럽트의 경우 프로그래밍 가능 인터럽트 컨트롤러(PIC)를 통해 예약된 벡터 외의 다른 벡터에 연결(매핑)될 수 있다.

인텔 80286 프로세서 이후부터는 보호 모드에서 사용되는 인터럽트 서술자 테이블(IDT)처럼, `LIDT` 명령어를 사용하여 IVT의 메모리 위치와 크기를 변경하는 것이 가능해졌다. 그러나 리얼 모드에서 동작할 때 IVT의 기본적인 구조, 즉 4바이트 포인터들의 배열이라는 형식 자체는 변하지 않았다.[3]

2. 2. BIOS 인터럽트

BIOS는 하드웨어 기능의 일부에 대한 간단한 리얼 모드 접근을 제공하기 위해 인터럽트 처리기를 등록한다. 이들은 INT 어셈블리 명령어를 사용하여 소프트웨어 인터럽트로 호출되며, 매개변수는 레지스터를 통해 전달된다. 이러한 인터럽트는 시스템 메모리 레이아웃 감지, VGA 출력 및 모드 구성, 부팅 과정 초기에 디스크 접근과 같은 다양한 작업에 사용된다.

3. 보호 모드와 롱 모드

보호 모드롱 모드에서 IDT는 인터럽트 및 예외 처리를 위한 핵심적인 테이블 구조이다. 두 모드 모두 IDT를 사용하여 인터럽트 벡터 번호에 따라 적절한 처리 루틴을 찾아 실행한다.

보호 모드에서는 각 인터럽트 디스크립터가 8바이트 크기를 가진다. 프로세서는 IDTR 레지스터에 저장된 IDT의 시작 주소와 크기 정보를 바탕으로, 인터럽트 벡터 번호에 8을 곱한 오프셋을 더해 해당 디스크립터의 위치를 계산한다.[4]

롱 모드(x86-64)로 전환되면서, 확장된 주소 공간과 기능을 지원하기 위해 IDT 디스크립터의 크기는 16바이트로 두 배 증가했다. 따라서 인터럽트 발생 시 디스크립터 위치 계산 방식도 벡터 번호에 16을 곱하는 것으로 변경되었다.[4] 이러한 디스크립터 크기 변화는 롱 모드에서 IDT가 더 많은 정보를 담을 수 있게 하지만, 기본적인 역할과 구조는 보호 모드와 유사하게 유지된다.

3. 1. IDT 구조

IDT는 메모리에 연속적으로 저장된 디스크립터 배열이며, 인터럽트 벡터 번호로 각 디스크립터를 식별한다. 보호 모드에서는 각 디스크립터가 8바이트 크기를 가지며, 롱 모드에서는 16바이트 크기를 가진다.

프로세서는 IDT의 메모리 상 위치와 크기 정보를 알기 위해 특별한 레지스터인 `IDTR`을 사용한다. `IDTR` 레지스터에는 IDT가 시작하는 선형 기본 주소와 IDT의 전체 크기(제한 값, 바이트 단위 길이 - 1)가 저장된다.[4]

인터럽트가 발생하면, 프로세서는 해당 인터럽트 벡터 번호에 디스크립터 크기(보호 모드 8, 롱 모드 16)를 곱한 값을 `IDTR`에 저장된 기본 주소에 더하여 해당 디스크립터의 메모리 주소를 계산한다.[4] 계산된 주소가 IDT 범위 내에 있는지 확인한 후, DPL 검사를 거쳐 게이트 유형에 따라 인터럽트를 처리한다.

IDT의 각 디스크립터는 인터럽트 게이트, 트랩 게이트, 또는 태스크 게이트 중 하나일 수 있다. (태스크 게이트는 32비트 보호 모드에서만 사용된다.)

  • 인터럽트 게이트: 주로 하드웨어 인터럽트를 처리하기 위해 사용된다. 인터럽트 처리 루틴이 실행되는 동안 추가적인 마스크 가능한 하드웨어 인터럽트 발생을 막는다. GDT 또는 LDT에 있는 세그먼트와 그 안의 오프셋을 지정하여 실행할 코드의 위치를 가리킨다.
  • 트랩 게이트: 주로 소프트웨어 인터럽트나 예외 처리에 사용된다. 인터럽트 게이트와 달리 처리 중에도 다른 하드웨어 인터럽트를 허용한다. 인터럽트 게이트와 마찬가지로 GDT 또는 LDT의 세그먼트와 오프셋으로 코드 위치를 가리킨다.
  • 태스크 게이트: 하드웨어 태스크 전환 메커니즘을 사용하여 현재 실행 중인 TSS를 다른 것으로 교체한다. 이를 통해 프로세서 사용 권한을 다른 프로그램이나 스레드로 효과적으로 넘겨준다.


IDT는 반드시 256개의 가능한 모든 엔트리를 가질 필요는 없다. 시스템에서 사용하는 가장 높은 인터럽트 벡터 번호까지만 디스크립터를 포함하고, `IDTR` 레지스터에 실제 IDT의 크기를 정확히 설정하면 된다. 예를 들어 보호 모드에서 완전한 IDT는 256개 엔트리 * 8바이트 = 2KB 크기를 갖는다. 인터럽트 벡터 0번부터 31번까지는 인텔이 프로세서 예외 처리를 위해 예약한 영역이다. 비록 현재는 주로 0번부터 18번까지의 벡터만 프로세서에 의해 사용되지만, 미래의 프로세서에서는 예약된 다른 벡터들이 사용될 수 있으므로 이 영역을 다른 목적으로 사용하는 것은 호환성 문제를 일으킬 수 있다.

3. 2. 디스크립터 유형

IDT의 각 디스크립터는 인터럽트 게이트, 트랩 게이트, 또는 태스크 게이트 중 하나일 수 있다. 이들은 인터럽트나 예외가 발생했을 때 운영체제가 어떤 코드를 실행해야 하는지를 정의한다.

  • 인터럽트 게이트(Interrupt Gate): 주로 하드웨어 인터럽트를 처리하기 위해 사용된다. 인터럽트 게이트를 통해 인터럽트 핸들러가 호출되면, 프로세서는 추가적인 마스크 가능한 하드웨어 인터럽트의 발생을 자동으로 비활성화한다. 이는 중요한 하드웨어 인터럽트 처리 중에 다른 인터럽트로 인해 방해받는 것을 막기 위함이다. 인터럽트 게이트는 실행할 코드의 메모리 위치를 세그먼트(GDT 또는 LDT 내)와 해당 세그먼트 내의 오프셋으로 지정한다.

  • 트랩 게이트(Trap Gate): 주로 소프트웨어 인터럽트나 예외를 처리하는 데 사용된다. 인터럽트 게이트와 가장 큰 차이점은 트랩 게이트를 통해 핸들러가 호출되더라도 마스크 가능한 하드웨어 인터럽트를 비활성화하지 않는다는 점이다. 따라서 핸들러 실행 중에도 다른 하드웨어 인터럽트가 발생하고 처리될 수 있다. 트랩 게이트 역시 실행할 코드의 메모리 위치를 세그먼트와 오프셋으로 지정한다.

  • 태스크 게이트(Task Gate): 32비트 보호 모드에서만 사용된다. 태스크 게이트는 인터럽트나 예외 발생 시, 현재 실행 중인 태스크를 중단하고 미리 정의된 다른 태스크로 전환하는 데 사용된다. 이는 하드웨어 태스크 전환 메커니즘을 통해 이루어지며, 현재 활성 상태인 TSS(Task State Segment)를 지정된 TSS로 교체함으로써 프로세서의 제어를 다른 프로그램, 스레드, 또는 프로세스로 넘긴다.

4. 인터럽트 및 예외 유형

인터럽트예외는 컴퓨터 시스템 작동 중 발생하는 중요한 이벤트이며, 각각 고유한 번호(INT_NUM, 인터럽트 번호)를 통해 식별된다. 일반적으로 특정 범위의 번호는 프로세서 자체에서 발생하는 예외 상황(예: 잘못된 연산 수행, 메모리 접근 오류 등)을 처리하기 위해 예약되어 있으며, 나머지 번호는 하드웨어 장치 등 외부 요인에 의한 인터럽트를 처리하는 데 사용된다.[5]

인텔 프로세서 아키텍처는 표준화된 인터럽트 벡터 레이아웃을 정의하고 있지만, IBM PC 호환 기종에서는 BIOS나 운영체제(MS-DOS 등) 수준에서 이를 다르게 사용하는 경우가 있다.[6] 구체적인 인터럽트 및 예외 유형과 그 번호 할당 방식은 시스템 아키텍처나 운영 환경에 따라 차이가 있을 수 있으며, 자세한 내용은 하위 문단에서 설명한다.

4. 1. 인텔 공식 레이아웃

0x00부터 0x1F까지의 인터럽트 벡터는 인텔에 의해 프로세서 예외 처리를 위해 예약되어 있다.[5] 0x1F보다 큰 인터럽트 벡터 번호(INT_NUM)는 일반적인 인터럽트 루틴에 사용된다.

INT_NUM이벤트 유형간단한 설명
0x00프로세서 예외0으로 나누기
0x01프로세서 예외단일 단계 인터럽트 (트랩 플래그 참조)
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에서만 사용 가능)
0x16-0x1F프로세서 예외예약됨
0x20-0x27하드웨어 인터럽트IRQ 0-7
0x70-0x77하드웨어 인터럽트IRQ 8-15


4. 2. IBM PC 레이아웃

IBM PC는 BIOS 및 MS-DOS 런타임 환경에서, 초기의 8086 프로세서에 정의된 처음 5개의 예외 벡터 이후로는 공식적인 인텔의 레이아웃을 따르지 않는다. 예를 들어, 인터럽트 5번은 Print Screen 키를 처리하는 데 사용되며, 하드웨어 인터럽트 요청 라인인 IRQ 0번부터 7번까지는 인터럽트 번호(INT_NUM) 0x08부터 0x0F까지에 매핑된다. 또한, BIOS는 자신의 API 기능 호출을 위해 0x10부터 0x1F 범위에 있는 대부분의 인터럽트 벡터를 사용한다.[6]

5. 후킹 (Hooking)

일부 윈도우 프로그램은 IDT 호출을 후킹하기도 한다. 이는 커널 모드 장치 드라이버를 이용하여 IDT 호출을 가로채고 자체적인 코드를 실행하는 방식으로 이루어진다.[8][7] 이러한 방식은 마이크로소프트에서 공식적으로 지원하지 않는다. 64비트 버전의 윈도우 이전에는 운영체제 차원에서 이를 막지는 않았으나, 64비트 윈도우 환경에서는 커널 모드 후킹을 시도하는 드라이버가 시스템 버그 검사(블루스크린)를 유발할 수 있다.[8][7]

참조

[1] 웹사이트 Exceptions - OSDev Wiki https://wiki.osdev.o[...] 2021-04-17
[2] 웹사이트 IRQs and PICs http://www.osdever.n[...] 2024-06-06
[3] 간행물 Intel® 64 and IA-32 Architectures Software Developer’s Manual, 20.1.4 Interrupt and Exception Handling
[4] 간행물 Intel® 64 and IA-32 Architectures Software Developer’s Manual, 6.12.1 Exception- or Interrupt-Handler Procedures
[5] 웹사이트 Exceptions - OSDev Wiki https://wiki.osdev.o[...] 2021-04-17
[6] 웹사이트 Interrupt Table as Implemented by System BIOS/DOS https://stanislavs.o[...] 2024-06-06
[7] 웹사이트 Patching Policy for x64-Based Systems http://www.microsoft[...]
[8] 웹인용 Patching Policy for x64-Based Systems http://www.microsoft[...] 2015-10-13



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com