아래의 블로그를 참고하여 글을 작성하였습니다. 제가 공부할 때 참조한 커널 버전은 v2.6.39.4입니다.
http://rousalome.egloos.com/10012152
인터럽트 핸들러
인터럽트 벡터
인터럽트 디스크립터
인터럽트 컨텍스트
앞에서 인터럽트 핸들러에 대해서 공부를 해 보았으니, 인터럽트 벡터에 대해서 공부해 보았습니다.
인터럽트 벡터란?
인터럽트 벡터는 인터럽트를 발생한 장치가 분기할 곳에 대한 정보입니다. 이 정보들은 숫자들로 구분되며, 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
위와 같이 정의된 인터럽트 벡터를 이용하여, 인터럽트가 발생하였을 때, 커널은 아래와 같이 인터럽트에 대한 처리를 수행합니다.
참조
'Linux(Centos or RHEL) > RHEL 기초' 카테고리의 다른 글
컨텍스트 스위칭과 컨텍스트...? (0) | 2020.04.24 |
---|---|
인터럽트 디스크립터...? (0) | 2020.04.24 |
인터럽트 핸들러? (0) | 2020.04.23 |
인터럽트? (0) | 2020.04.23 |
프로세스를 TASK_RUNNING(CPU 실행) 상태로 바꾸는 함수...? (0) | 2020.04.23 |