Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22412
  • 博文数量: 18
  • 博客积分: 810
  • 博客等级: 准尉
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-10 21:09
文章分类
文章存档

2009年(15)

2008年(3)

我的朋友

分类: LINUX

2009-04-03 16:57:13

6.2 中断处理程序

     上半部(top half

     下半部(bottom half

6.3 注册中断处理程序

     函数:

 

/* request_irq: allocate a given interrupt line */
int request_irq(unsigned int irq, /*中断号,有些已定死,有些可探测获取或通过编程动态确定*/
                irqreturn_t (*handler)(int, void *, struct pt_regs *),//中断处理程序
                unsigned long irqflags, /*0;
SA_INTERRUPT(快速中断处理程序,不受其他中断干扰,用于时钟中断);
SA_SAMPLE_RANDOM(中断间隔时间会作为熵填充到内核熵池。当设备中断速率预知或可能受外部攻击时,不用设这个标志);
SA_SHIRQ(可在多个中断处理程序间共享中断线)*/

                const char *devname, //中断设备名
                void *dev_id) //用于共享中断线,便于从共享中断线的诸多中断处理程序中删除指定的那个

释放中断处理程序

     函数:

void free_irq(unsigned int irq, void *dev_id)

6.4 编写中断处理程序

     函数:

 

static irqreturn_t intr_handler(int irq,//中断号 
           void *dev_id, //用以区分共享同一中断处理程序的设备
           struct pt_regs *regs) //处理中断之前处理器的寄存器和状态

     返回值:IRQ_NONE——中断对应的设备不是注册处理函数时指定的产生源

                      IRQ_HANDLED——正确调用

                      或使用宏IRQ_RETVAL(x),若x0,则返回IRQ_HANDLED,否则IRQ_NONE

 

6.5 中断上下文

      由于中断打断了其他代码,中断处理程序必须尽可能简洁、迅速 => 把工作放在下半部中,选择合适的时间执行

      中断处理程序栈

6.6 中断处理机制的实现

        (1) 设备产生中断,通过总线把电信号发送给中断控制器

         (2) 中断控制器把中断发送给处理器

         (3) 处理器停止当前工作,关闭中断,跳到内存预定义位置开始执行中断处理程序

         (4) 内核调用do_IRQ()-----unsigned int do_IRQ(struct pt_regs regs)
                                                      提取中断号 int irq = regs.orig_eax & 0xff;

                                                      对所接收中断应答,禁止这条线上的中断传递------mask_and_ack_8259A()

         (5)  确保中断线上有一个有效的处理程序,调用handle_IRQ_event(),在该线上运行所有中断处理程序;

         (6)  如果没有,调用ret_from_intr()返回内核,运行中断的代码

6.7 中断控制

      中断控制方法表:(禁止、开启、屏蔽中断线,检查中断系统状态)

 

Function

Description

local_irq_disable()

Disable local interrupt delivery禁止当前处理器(本地)中断

local_irq_enable()

Enable local interrupt delivery 开启本地中断

local_irq_save()

Save the current state of local interrupt delivery and then disable it

保存本地中断传递的当前状态,然后禁止本地中断传递

local_irq_restore()

Restore local interrupt delivery to the given state

恢复本地中断传递到给定状态

disable_irq()

Disable the given interrupt line and ensure no handler on the line is executing before returning

禁止给定中断线,并确保该函数返回前在该中短线上没有处理程序在运行

disable_irq_nosync()

Disable the given interrupt line

enable_irq()

Enable the given interrupt line

irqs_disabled()

Returns nonzero if local interrupt delivery is disabled; otherwise returns zero

如果本地中断传递被禁止,则返回非0,否则0

in_interrupt()

Returns nonzero if in interrupt context and zero if in process context

如果在中断上下文中,返回非0,如果在进程上下文中,则返回0

in_irq()

Returns nonzero if currently executing an interrupt handler and zero otherwise

如果当前正在执行中断处理程序,则返回非0,否则0

阅读(427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~