文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档><Linux kernel development>Chap6 中断和中断处理..

<Linux kernel development>Chap6 中断和中断处理..

时间:2009-04-03  来源:wthsunny

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),若x非0,则返回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

排行榜 更多 +
暗夜格斗手游

暗夜格斗手游

棋牌卡牌 下载
魔渊之刃手游

魔渊之刃手游

角色扮演 下载
像素火影次世代手游版

像素火影次世代手游版

体育竞技 下载