글
(1) 인터럽트(Interrupt)와 예외(Exception)
○ 인터럽트 : 어떤일을 수행하는 도중에 끼어드는 사건(Event)
- 인터럽트가 발생했을때 일을 처리하는 것을 '인터럽트처리'라고 한다.
- CPU가 프로세스 명령어를 순차적으로 수행하는 도중 다른 처리를 위해 끼어드는 사건(인터럽트) 발생시 CPU는 현재
하던일을 멈추고, 사건을 처리하기위해 정의된 ISQ(Interrupt Service Routine)의 내용을 먼저 수행한다.
(2) 인터럽트에 대한 이해
○ 일반적으로 인터럽트 = 하드웨어 인터럽트
- H/W는 비동기적으로 사건을 알리는데, H/W 인터럽트가 그 수단이다.
- 이때 이 사건을 알리는 동작을 IRQ(Interrupt Request)라 한다. => 이 신호로 장비를 확인한다.
- IRQ는 PIC(Programmable Interrupt Controller)를 통해서 요청한다.
○ 왜 인터럽트를 사용하느냐!
- 인터럽트를 사용함으로써 CPU이용률을 높인다.
○ H/W뿐만아니라 현재 수행중인 프로세서에서도 인터럽트를 발생시킬수 있다.
- 이 인터럽트를 S/W인터럽트 또는 trap이라 한다. ex) system call
○ PIC -> Programmable Interrupt Controller
- 하나의 CPU는 하나의 인터럽트만 확인가능 한데, 하나의 CPU에 여러개의 인터럽트가 연결되도록 해주는 칩셋이 바로
PIC이다!
(3) 미룰 수 있는 인터럽트 '미룰 수 있는 인터럽트는 나중에 실행하자!'
○ Soft IRQ, tasklet, bottom-half 가 있다.
- 커널 2.4에서 soft IRQ와 tasklet이 도입
- 커넉 2.6에서 bottom-half 사용 중단.
○ softirq
- 같은 종류(type)의 softirq들이 여러 cpu에서 동시에 실행될 수 있다.
- 컴파일시 정적으로 할당된다.
- But! 동기화 문제 해결해야하고, 재진입 가능한 코드로 만들어야 한다.
- 이렇게 깐깐하니까 대부분 tasklet을 사용해서 구현한다.
(몇몇 같은 type을 여러 cpu에서 동시에 사용해야 할때 softirq를 쓴다)
○ tasklet
- 동적으로 할당
- 같은종류의 tasklet은 여러 cpu에서 동시에 실행할 수 없다.
- 동기화를 신경쓰지 않아서 구현이 매우 용이하다.
- 대부분 I/O 디바이스에서 softirq보다 tasklet을 사용한다.
(4) IDT(Iterrupt Descriptor Table) 테이블
○ 리눅스는 인터럽트 처리를 위해 IDT를 사용한다.
- 각 인터럽트를 처리하기위한 서비스 루틴을 함수로 구현해두고, 각 함수의 시작점 주소(핸들러함수)를 IDT에 등록
[트랩과 시스템콜도 들어있다].
○ IDT는 메모리에 위치, 이를 가리키는 레지스터를 IDTR 이라 한다.
○ 인터럽트발생 >> IDTR을 통해 IDT를 알아냄 >> 인터럽트 번호에 대응되는 테이블 엔트리에서 핸들러를 찾아서 이 루틴에
정의된 내용을 처리한다.
○ IDT는 총 256개의 엔트리를 가진다. (각 엔트리는 8Byte크기의 디스크립터로 구성됨) 256 * 8 = 2048Btye 필요
(5) 커널 내부의 인터럽트 수행과정
- 인터럽트 발생
- 실행중인 프로세스 중지
- 커널모드 전환
- do_IRQ 함수 호출
- PIC에게 응답신호 보냄
- 실제 핸들러 함수를 호출
- 뒤로 미워진 softirq가 있으면 do_softing()tngod
- ....
- do_IRQ()함수가 종료되면 ret_from_intr 주소로 복귀
- 다시 사용자 모드로 전환
○ do_IRQ함수 : 인터럽트에 연관된 모든 인터럽트 서비스루틴을 실행하기위해 호출하는 함수
○ PIC : 인터럽트도중 같은 종류의 인터럽트 발생을 막음
○ PIC에게 응답신호 보낸후 실제 핸들러 함수를 호출하는 세부 과정
- 응답신호를 보낸다.
- hancle_IRQ_event()함수가 호출된다.
- action
- handler(irq,action->dev_id,regs) 호출 중에 실제 핸들러 함수를 호출한다.
※ 출처 : http://idkkangjs.blog.me/30091117058
'L inux > Kernel' 카테고리의 다른 글
프로세스 - 프로세스와 프로세스 디스크립터 (0) | 2011.09.26 |
---|---|
모듈(Module) (0) | 2011.09.26 |
시스템 콜(System Call) - 2 (1) | 2011.09.26 |
시스템 콜(System Call) - 1 (0) | 2011.09.26 |
리눅스 커널 컴파일 (0) | 2011.09.26 |
RECENT COMMENT