linux中断响应和处理过程分析

本文详细探讨了Linux操作系统中中断的响应机制,从硬件中断的触发到软件中断的处理,包括中断向量表、中断处理函数以及中断处理流程。通过对按钮按下这一具体实例的分析,揭示了中断在设备驱动程序中的关键作用。通过阅读,读者将能够掌握Linux内核如何管理和调度中断事件。
摘要由CSDN通过智能技术生成

linux中断响应和处理过程:

首先中断属于异常的一种。异常,就是可以打断CPU正常运行流程的一些事情,比如说外部中断,未定义的指定,试图修改只读数据,执行SWI指定(software interrupt instructin,软件中断指令,比如说上层调用sys_read,sys_write就会产生swi)等。

内核启动时在start_kernel函数(init/main.c)中调用trap_init ,  init_IRQ两个函数来设置异常的处理函数。

trap_init函数(arch/arm/kernel/traps.c

void_init trap_init(void)

{

......

memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);

memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);

.......

}

上面两条定义的是异常向量的存放地方,:__stubs_start~~~~~ __stubs_end之间就是异常向量.

接下来 我们看异常向量之间的定义:(arch/arm/kernel/entry-armv.s)

.equ stubs_offset, __vectors_start + 0x200 - __stubs_start

    .globl __vectors_start

__vectors_start:

 ARM( swi SYS_ERROR0 )      //复位时.CPU交执行这条指令

 THUMB( svc #0 )

 THUMB( nop )

W(b) vector_und + stubs_offset   //未定义异常时,CPU将执行这条跳转指令

W(ldr) pc, .LCvswi + stubs_offset   //swi异常

W(b) vector_pabt + stubs_offset   //指令预取止

W(b) vector_dabt + stubs_offset   //数据访问中止

W(b) vector_addrexcptn + stubs_offset  //没有用到

W(b) vector_irq + stubs_offset         //irq中断

W(b) vector_fiq + stubs_offset         //fig中断 (快速中断)

.globl __vectors_end

__vectors_end:

各种异常的处理函数可以分为五类,分别分布在下面不同的文件中:

1、arch/arm/kernel/traps.c

   处理未定义指令异常,总入口函数为do_undefinstr

2、arch/arm/mm/fault.c

   与内存访问相关的异常,总入口函数为do_DataAbort, do_PretftchAbort

3. arch/arm/arm/irq.c

   中断处理函数在这个文件中定义,总入口函数为asm_do_IRQ

4. arch/arm/kernel/call.s

  swi异常处理  比如说:sys_read,  sys_open.

5. 没有使用的异常

除了IRQ中断外(FIG中断linux一般不使用),所有的异常内核都定义了细致而完备的处理函数.  所以我们这里关心的也只是上面红色部分,:IRQ中断.

Init_IRQ函数(arch/arm/kernel/irq.c),被用来初使化中断的处理框架,设置各种中断的默认处理函数.

Linux内核将所有中断统一编号,使用irq_desc结构来描述中断:每个数组项对应一个中断(也可能是一组中断,它们使用共同的中断号),里面记录了中断的名称,中断状态,中断标记,并提供硬件访问函数(清除,屏蔽,使能中断),提供了这个中断的处理函数的入口,通过它可以调用用户注册的中断处理函数

include/linux/irq.h

{.........

irq_flow_handler_t handle_irq;   //当前的中断处理函数入口

struct irq_chip *chip;       //底层的硬件访问

..........

struct irqaction *action; //用户提供的中断处理函数链表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值