본문 바로가기

Linux(Centos or RHEL)/RHEL 기초

인터럽트 벡터?

아래의 블로그를 참고하여 글을 작성하였습니다. 제가 공부할 때 참조한 커널 버전은 v2.6.39.4입니다.

http://rousalome.egloos.com/10012152

 

[리눅스커널] 인터럽트: 리눅스 커널이 처리하는 인터럽트의 주요 개념

앞에서 인터럽트에 대해 소개했으니 리눅스 커널에서 인터럽트를 처리하는 방식을 이해하기 위해 알아야 할 주요 개념을 소개합니다.  인터럽트 핸들러  인터럽트 벡터   인터럽트 디스크립터   인터럽트 컨텍스트 인터럽트 핸들러란? 인터럽트가 발생하면 이를 핸들링하기 위한 함수가 호출되는데 이를 인터럽트 핸들러라고 합니다. 예를 들어

rousalome.egloos.com

 

 

인터럽트 핸들러

인터럽트 벡터

인터럽트 디스크립터

인터럽트 컨텍스트

 

앞에서 인터럽트 핸들러에 대해서 공부를 해 보았으니, 인터럽트 벡터에 대해서 공부해 보았습니다.

 

 

인터럽트 벡터란?

 

인터럽트 벡터는 인터럽트를 발생한 장치가 분기할 곳에 대한 정보입니다. 이 정보들은 숫자들로 구분되며, CPU 아키텍처별로 차이가 있습니다. 이러한 인터럽트 벡터들을 커널은 인터럽트 벡터 테이블에 저장해 둡니다. 제가 사용 중인 컴퓨터는 x86 아키텍처이기 때문에 x86 아키텍처의 인터럽트 벡터의 코드를 찾아보았습니다.

https://elixir.bootlin.com/linux/v2.6.39.4/source/arch/x86/include/asm/irq_vectors.h#L35

 

해당 소스코드의 주석 부분을 보면 다음과 같이 나와 있습니다.

번호의 범위별로 벡터의 용도가 정의되어 있다고 합니다.

/*
 * Linux IRQ vector layout.
 *
 * There are 256 IDT entries (per CPU - each entry is 8 bytes) which can
 * be defined by Linux. They are used as a jump table by the CPU when a
 * given vector is triggered - by a CPU-external, CPU-internal or
 * software-triggered event.
 *
 * Linux sets the kernel code address each entry jumps to early during
 * bootup, and never changes them. This is the general layout of the
 * IDT entries:
 *
 *  Vectors   0 ...  31 : system traps and exceptions - hardcoded events
 *  Vectors  32 ... 127 : device interrupts
 *  Vector  128         : legacy int80 syscall interface
 *  Vectors 129 ... INVALIDATE_TLB_VECTOR_START-1 : device interrupts
 *  Vectors INVALIDATE_TLB_VECTOR_START ... 255 : special interrupts
 *
 * 64-bit x86 has per CPU IDT tables, 32-bit has one shared IDT table.
 *
 * This file enumerates the exact layout of them:
 */

 

 

NMI 인터럽트용 벡터는 2번이고, MCE용 벡터는 12번입니다.

#define NMI_VECTOR 0x02
#define MCE_VECTOR 0x12

 

 

외부의 IDT 벡터를 지정하는 것은 20번부터입니다.

IDT? [http://coffeenix.net/doc/develop/ia-interrupt/ch1-1.html]

/*
 * IDT vectors usable for external interrupt sources start at 0x20.
 * (0x80 is the syscall vector, 0x30-0x3f are for ISA)
 */
#define FIRST_EXTERNAL_VECTOR		0x20

 

 

 

위와 같이 정의된 인터럽트 벡터를 이용하여, 인터럽트가 발생하였을 때, 커널은 아래와 같이 인터럽트에 대한 처리를 수행합니다.

 

 

 

 

참조

● https://raisonde.tistory.com/entry/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%A2%85%EB%A5%98

 https://vmilsh.tistory.com/392

 http://jake.dothome.co.kr/arm-exception-vector/