[리눅스] 인터럽트
- 최초 등록일
- 2010.05.20
- 최종 저작일
- 2009.11
- 10페이지/
한컴오피스
- 가격 1,000원
![할인쿠폰받기](/images/v4/document/ico_det_coupon.gif)
소개글
1. 인터럽트 : 어떤 프로세스가 수행되는 도중에 다른 서비스 처리 루틴이 끼어 들어 프로세스의 수행을 방해하는 것
* 인터럽트 처리 루틴 순서
① 인터럽트 금지
② 프로세서 상태 저장
③ 인터럽트 처리
④ 프로세서 상태 복구
⑤ 인터럽트 허용
* 인터럽트 종류
① 프로세서 자체에서 발생하는 인터럽트 : 시스템의 리셋, 소프트웨어 인터럽트, 디버그 트랩...
② 프로세서 외부에서 발생하는 인터럽트 : IRQ
③ 스케줄링
④ 시리얼 인터럽트, DMA 인터럽트, 키보드 인터럽트, 프린터 인터럽트
2. IRQ 인터럽트의 처리 과정
* 처리 과정은 프로세서마다 다름
* 리눅스 커널에서는 동일한 처리를 위해 do_IRQ()함수를 호출
목차
실습 내용
소스 코드
실습 결과
발생한 문제
본문내용
1. 인터럽트 : 어떤 프로세스가 수행되는 도중에 다른 서비스 처리 루틴이 끼어 들어 프로세스의 수행을 방해하는 것
* 인터럽트 처리 루틴 순서
① 인터럽트 금지
② 프로세서 상태 저장
③ 인터럽트 처리
④ 프로세서 상태 복구
⑤ 인터럽트 허용
* 인터럽트 종류
① 프로세서 자체에서 발생하는 인터럽트 : 시스템의 리셋, 소프트웨어 인터럽트, 디버그 트랩...
② 프로세서 외부에서 발생하는 인터럽트 : IRQ
③ 스케줄링
④ 시리얼 인터럽트, DMA 인터럽트, 키보드 인터럽트, 프린터 인터럽트
2. IRQ 인터럽트의 처리 과정
* 처리 과정은 프로세서마다 다름
* 리눅스 커널에서는 동일한 처리를 위해 do_IRQ()함수를 호출
3. 인터럽트 서비스 함수의 형식
* 커널 2.4
void int_interrupt(int irq, void *dev_id, struct pt_regs *regs) { }
* 커널 2.6
irqreturn_t int_interrupt(int irq, void *dev_id, struct pt_regs *regs) {
return IRQ_HANDLED;
}
* 매개변수
① int irq : 인터럽트 번호
② void *dev_id : 인터럽트 ID, 인터럽트 함수가 사용 가능할 수 있는 메모리 주소
③ struct pt_reg *regs : 인터럽트가 발생했을 당시 레지스터 값
4. ISR 내의 메모리 할당
* kmalloc(), kfree()를 사용
* kmalloc() 사용시 GFP_ATOMIC 인자를 사용
5. ISR 등록과 해제
* ISR 등록 : 디바이스 드라이버에서 인터럽트 처리하기 위해 가장 먼저 ISR을 등록
①커널 2.4
#include <linux/sched.h>
int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
참고 자료
없음