인터럽트에 관한 질문...
글쓴이: leolo / 작성시간: 목, 2003/07/03 - 7:35오후
제가 인터럽트에 대해서 잘 몰라서 그러는데요..
이렇게 인터럽트 번호 4번에 대해서 설정하고 모듈을
올리고 cat /proc/interrupts 하면 확인이 됩니다.
이경우 인터럽트가 발생되면 인터럽트 헨들러(power_state()_가
수행되는건지 알고 싶습니다.
그리고, 인터럽트를 발생시킬려면 어떻게 해야하는지도 알고 싶습니다.
일반적으로 하드웨어 인터럽트를 말한는거 같은데요.
그냥 프로그램으로 인터럽트를 발생시킬 수는 없는지요.
테스트 해볼려고요..
그러니까? 4번에다가 인터럽트를 발생시킬 수는 없는지요..
알려주세요..
#include <linux/config.h> #include <linux/types.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/hardware.h> #include <asm/irq.h> #define IRQ_NUM 4 static void power_state() { printk("power_state"); } static int __init pm_init(void) { int ret; ret = request_irq(IRQ_NUM, power_state, SA_INTERRUPT, "Power INT", NULL); if(ret < 0){ printk(KERN_ERR "%s: Request for IRQ %d failed\n", __FUNCTION__, IRQ_NUM); return -EBUSY; } return 0; } static void __exit pm_exit(void) { printk("PM exit, IRQ %d\n", IRQ_NUM); free_irq(IRQ_NUM, NULL); } module_init(pm_init); module_exit(pm_exit);[/code]
Forums:
IRQ인거 같은데...
IRQ는 드라이버만 올라간다고 다되는게 아닙니다.
해당 IRQ라인을 사용하는 하드웨어가 있어야 하고, 그 하드웨어가
신호를 보내 주어야 합니다.
아마 소프트웨어적으로 고의 발생은 커널을 고치지 않는 한 불가능하고
커널을 고친다 해도 까다롭습니다.
소프트웨어적으로 고의로 발생시키는 방법은 irq 번호와 대응되는 int를
찾아서 그 번호로 int xx하면 되긴 하지만... 왜 문제가 되냐면
하드웨어 인터럽트의 경우 cpu뿐만 아니라 PIC 칩에도 영향을 미치는
작업이기 때문에 해당 주변장치가 요구하는 사항에 대한
처리 뿐만 아니라 PIC를 제어하는 작업까지도 해야 하기 때문입니다.
하지만 소프트웨어적으로 int xx명령 써서 발생시킬 경우에는 PIC칩을
건드려서는 절대 안되죠....
(PIC칩 제어 잘못하면 시스템 그냥 다운됩니다. 무슨 특별한 하드웨어
장비를 동원하지 않는 한 디버그할 방법조차도 없습니다 -_- 상당히 중요하면서도
상당히 골때리는 녀석입니다.)
물론 보통 하드웨어 IRQ 발생시에는 리눅스 커널에서 PIC칩 관련 제어를 다
해주게 되어 있습니다. 드라이버는 자기일만 하고요. 궁금하시다면 커널 소스의 arch/i386 아래 irq 관련
소스코드들을 ㅤㅎㅜㅀ어보시길.
x86 시스템에서 인터럽트 처리는
cpu는 0-0xff까지의 인터럽트 번호를 갖고 있고, 외부에 PIC칩은
cpu 인터럽트 번호 중 특정 번호를 하드웨어 IRQ에 매핑시킵니다.
그리고 주변장치의 IRQ는 모두 PIC에 입력되는 구조로 되어 있습니다.
만일 주변장치가 IRQ 발생시 이 IRQ는 PIC에 입력되며, PIC는 해당
IRQ번호와 매핑되는 INT xx 번호를 cpu로 보냅니다. 또 PIC는 IRQ
동시발생시 우선순위를 결정하는 역할도 하지요.
Written By the Black Knight of Destruction
댓글 달기