인터럽트(Interrupt)란 주변장치나 CPU가 자신에게 발생한 사건을 리눅스 커널에게 알리는 매커니즘이다.
인터럽트는 외부 인터럽트 또는 트랩으로 인해 발생한다.
외부 인터럽트는 현재 수행중인 태스크와는 상관없는 주변장치에서 발생된 비동기적인 하드웨어적인 사건을 의미한다.
트랩은 현재 수행중인 태스크와 관련있는 즉 동기적으로 발생하는 사건이다.
인터럽트가 발생하게 되면 인터럽트 발생 원인을 파악한 후 적절한 처리를 해주어야 하는데 이때 처리를 해주는 곳을 인터럽트 핸들러(Interrupt handler)라고 한다.
인터럽트와 인터럽트 핸들러는 IDT(Interrupt Descriptor Table) 또는 IVT(Interrupt Vector Table)라 불리는 테이블을 통해 연결 되어있다.
리눅스에서는 외부 인터럽트와 트랩을 동일한 방식으로 처리한다.
인터럽트를 처리하기 위한 함수를 작성하고 각 함수의 시작 주소를 리눅스의 IDT인 idt_table 이라는 이름의 배열에 기록해 둔다.
외부 인터럽트에서 인터럽트가 발생하였을 경우, 외부 인터럽트의 번호를 통해 idt_table 인덱싱 하여 해당하는 인터럽트 핸들러를 수행시켜준다.
리눅스에서는 0~31 번까지 트랩에 할당하고 128번을 제외한 32~255까지 외부 인터럽트가 사용할 수 있도록 하고 있다.
외부 인터럽트는 irq_desc 테이블을 둬서 별로도 관리한다.
32~255까지의 IDT 테이블에는 모두 do_IRQ()를 호출하는 핸들러 함수가 등록되 있다.
do_IRQ() 함수는 외부 인터럽트 번호를 가지고 irq_desc 테이블을 인덱싱하여 연관된 irq_desc_t 자료구조를 찾는다.
irq_desc_t 자료구조에는 하나의 인터럽트 라인을 공유할 수 있도록 action 이라는 자료구조의 리스트를 유지하고 있다.
'OS > Linux' 카테고리의 다른 글
[Linux] cp 명령어 사용 및 옵션 정리 (0) | 2021.10.22 |
---|---|
nohup 과 &(백그라운드) 명령어 사용법 (0) | 2021.10.22 |
Linux - tee 명령어로 터미널 출력 내용을 파일로 저장하기 (0) | 2021.10.17 |
gcc 이란? (0) | 2021.08.25 |
Makefile 이란 ? gcc, g++과 makefile의 차이? (0) | 2021.08.25 |
댓글