预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux内核的中断机制分析 一、中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。 在实地址模式中,CPU把内存中从0开始的1KB空间作为一个中断向量表。表中的每一项占4个字节。但是在保护模式中,有这4个字节的表项构成的中断向量表不满足实际需求,于是根据反映模式切换的信息和偏移量的足够使得中断向量表的表项由8个字节组成,而中断向量表也叫做了中断描述符表(IDT)。在CPU中增加了一个用来描述中断描述符表寄存器(IDTR),用来保存中断描述符表的起始地址。 二、中断的请求过程 外部设备当需要操作系统做相关的事情的时候,会产生相应的中断。设备通过相应的中断线向中断控制器发送高电平以产生中断信号,而操作系统则会从中断控制器的状态位取得那根中断线上产生的中断。而且只有在设备在对某一条中断线拥有控制权,才可以向这条中断线上发送信号。也由于现在的外设越来越多,中断线又是很宝贵的资源不可能被一一对应。因此在使用中断线前,就得对相应的中断线进行申请。无论采用共享中断方式还是独占一个中断,申请过程都是先讲所有的中断线进行扫描,得出哪些没有别占用,从其中选择一个作为该设备的IRQ。其次,通过中断申请函数申请相应的IRQ。最后,根据申请结果查看中断是否能够被执行。 中断机制的核心数据结构是irq_desc,它完整地描述了一条中断线(或称为“中断通道”)。以下程序源码版本为linux-2.6.32.2。 其中irq_desc结构在include/linux/irq.h中定义: typedefvoid(*irq_flow_handler_t)(unsignedintirq, structirq_desc*desc); structirq_desc{ unsignedintirq; structtimer_rand_state*timer_rand_state; unsignedint*kstat_irqs; #ifdefCONFIG_INTR_REMAP structirq_2_iommu*irq_2_iommu; #endif irq_flow_handler_thandle_irq;/*高层次的中断事件处理函数*/ structirq_chip*chip;/*低层次的硬件操作*/ structmsi_desc*msi_desc; void*handler_data;/*chip方法使用的数据*/ void*chip_data;/*chip私有数据*/ structirqaction*action;/*行为链表(actionlist)*/ unsignedintstatus;/*状态*/ unsignedintdepth;/*关中断次数*/ unsignedintwake_depth;/*唤醒次数*/ unsignedintirq_count;/*发生的中断次数*/ unsignedlonglast_unhandled;/*滞留时间*/ unsignedintirqs_unhandled; spinlock_tlock;/*自选锁*/ #ifdefCONFIG_SMP cpumask_var_taffinity; unsignedintnode; #ifdefCONFIG_GENERIC_PENDING_IRQ cpumask_var_tpending_mask; #endif #endif atomic_tthreads_active; wait_queue_head_twait_for_threads; #ifdefCONFIG_PROC_FS structproc_dir_entry*dir;/*在proc文件系统中的目录*/ #endif constchar*name;/*名称*/ }____cacheline_internodealigned_in_smp; I、Linux中断的申请与释放:在<linux/interrupt.h>,,实现中断申请接口: request_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev); 函数参数说明 unsignedintirq:所要申请的硬件中断号 irq_handler_thandler:中断服务程序的入口地址,中断发生时,系统调用handler这个函数。irq_handler_t为自定义类型,其原型为: typedefirqreturn_t(*irq_han