`
isiqi
  • 浏览: 16488493 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Kernel中断处理模型

 
阅读更多

内核版本: Linux 2.6.18_pro500 (Montavista)

Kernel 中断处理模型结构图如下:

下面简单介绍一下:

1. Linux 定义了名字为irq_desc 的中断例程描述符表:(include/linux/irq.h)

struct irqdesc irq_desc[NR_IRQS];

NR_IRQS 表示中断源的数目。

2. irq_desc []是一个指向irq_desc_t 结构的数组, irq_desc_t 结构是各个设备中断服务例程的描述符。Irq_desc_t 结构体中的成员action 指向该中断号对应的irqaction 结构体链表。Irqaction 结构体定义如下:

/* include/linux/interrupt.h */
struct irqaction {
irq_handler_t handler; /* 指向中断服务程序 */
unsigned long flags; /* 中断标志 */
unsigned long mask; /* 中断掩码 */
const char * name;
/* I/O设备名
void *dev_id;/* 设备标识 */

struct irqaction * next; /* 指向下一个描述符 */
int irq; /* IRQ线 */
struct proc_dir_entry * dir; /* 指向IRQn相关的/proc/irq/n目录的描述符 */
} ;

其中关键的handler 成员指向了该设备的中断服务程序,由执行request_irq 时建立。

3. 在驱动程序初始化时,若使用到中断,通常调用函数 request_irq ()建立该驱动程序对应的 irqaction 结构体,并把它登记到 irq_desc [irq_num]->action 链表中。 Iqr_num 为驱动程序申请的中断号。

request_irq ()函数的原型如下:

/* kernel/irq/manage.c */
int request_irq( unsigned int irq,
irqreturn_t ( * handler) ( int , void * , struct pt_regs * ) ,
unsigned long irqflags,
const char * devname,
void * dev_id) ;

参数 irq 是设备中断求号,在向 irq_desc [] 数组登记时,它做为数组的下标。把中断号为 irq irqaction 结构体的首地址写入 irq_desc [irq]->action 。这样就把设备的中断请求号与该设备的中断服务例程 irqaction 联系在一起了。

这样当 CPU 接收到中断请求后,就可以根据中断号通过 irq_desc [] 找到该设备的中断服务程序。流程如上图所示。

4. 关于共享中断

共享中断的不同设备的 iqraction 结构体都会添加进该中断号对应的 irq_desc 结构体的 action 成员所指向的 irqaction 链表内。当内核发生中断时,它会依次调用该链表内所有的 handler 函数。因此,若驱动程序需要使用共享中断机制,其中断处理函数必须有能力识别是否是自己的硬件产生了中断。通常是通过读取该硬件设备提供的中断 flag 标志位进行判断。

分享到:
评论

相关推荐

    LinuxARM中断系统详细分析1

    ULK(Understanding the Linux Kernel,即《深入理解Linux内核》)第四章中提到,Linux采用了一种没有优先级的中断模型,并且支持中断嵌套。这一表述可能与传统观念相悖,但其实是Linux内核的一种设计选择。 1. **...

    TOPPERS/JSP Kernel

    - **驱动模型**:TOPPERS/JSP Kernel提供标准的驱动接口,便于开发和移植设备驱动程序。 - **中断驱动**和**轮询驱动**:根据硬件特性选择合适的驱动方式,优化性能。 8. **可配置性与裁剪** - **配置工具**:...

    常见驱动源码分析(kernel hacker修炼之道)-李万鹏

    驱动程序的编写通常涉及对硬件特性的理解、内核接口的使用以及中断处理等核心概念。 本书可能涵盖了以下关键知识点: 1. **驱动程序的基本结构**:驱动程序通常包括初始化函数、设备操作结构体、中断处理函数等...

    wince 中断驱动 X86

    - WinCE支持两种中断模型:固定优先级中断(Fixed Priority Interrupts, FPI)和优先级分组中断(Priority Group Interrupts, PGI)。 - 中断控制器,如8259A或APIC,在X86平台上管理中断源,分配中断号,并转发...

    wxh关于日本最著名的实时系统T-KERNEL的平台下的AD键盘实现源码

    在T-KERNEL中,中断处理程序是实时响应的关键,必须在规定的时间内完成服务并返回,以免阻塞其他更重要的任务。 3. **中断调度**:T-KERNEL支持抢占式调度,意味着高优先级的任务可以中断低优先级任务的执行。因此...

    常见驱动源码分析(kernel hacker修炼之道)

    1. **Linux内核架构**:首先,我们需要理解Linux内核的基本结构和工作原理,包括进程管理、内存管理、中断处理、设备模型等。这些基础知识对于分析驱动源码至关重要。 2. **设备驱动分类**:驱动可以分为字符设备...

    sample-key.tar.gz_ad_key_key tar_t-kernel_按键

    4. **事件处理机制**:T-KERNEL的事件模型允许任务间非阻塞的通信,当检测到按键事件时,可以通过发送事件来唤醒或调度相应的任务,处理按键输入。 5. **按键映射与事件处理**:根据"ad_key"标签,源代码中可能包含...

    Kernel Probes for ARM-ELC2007.pdf

    Kprobes的核心功能在于,当断点被触发时,控制权会转移到用户定义的处理程序,执行被中断的指令后返回。由于这种机制,Kprobes通常具有相对较低的开销。 在ARM架构上,传统的Kprobe模型面临一些挑战。在经典模型中...

    Linux Kernel 四库全书

    学习设备驱动开发,需要掌握I/O操作、中断处理、DMA(直接内存访问)以及字符设备和块设备的模型。 六、文件系统 文件系统是组织数据和提供访问接口的关键部分。在Linux中,有多种文件系统类型,如EXT4、XFS、Btrfs...

    kernel-2410s.rar

    开发者需要熟悉S3C2410的硬件特性、Linux内核的驱动模型以及中断处理等基础知识,才能有效地编写和调试驱动,实现对硬件资源的有效管理与利用。通过不断的实践和学习,可以逐步掌握这一领域的复杂技术,为嵌入式系统...

    windows kernel

    中断处理则是硬件向内核发送信号的方式,如键盘输入、定时器超时等事件都会触发中断,内核通过中断处理程序来响应这些事件。 六、编程实践 在Windows内核编程中,开发者需要对WinAPI、Windows Driver Framework ...

    linux Kernel核心中文手册

    7. **中断与异常处理**:中断是硬件事件的处理机制,异常则包括软件错误或特定指令的处理。内核通过中断服务例程和异常处理程序来响应这些事件。 8. **系统调用**:系统调用是用户空间程序与内核交互的主要方式,如...

    Professional Linux Kernel Architecture.pdf

    - **中断机制**:讲解了中断的基本原理及其在Linux内核中的处理流程。 - **延迟执行**:分析了Linux内核如何通过软中断等机制实现任务的延迟执行。 - **异步事件处理**:讨论了异步事件的处理方法,包括定时器、工作...

    《Linux内核0.11完全注释》《Professional Linux Kernel Architecture》

    3. **中断处理**:学习中断的触发、处理和中断上下文,以及软中断和底半部的概念。 4. **设备驱动**:探究如何编写和理解设备驱动程序,理解I/O模型(如中断驱动、轮询和DMA)。 5. **文件系统**:理解VFS(虚拟...

    FreeBSD_kernel_networking

    - `splhigh`:高优先级中断处理,如外部硬件中断。 - `splx(s)`:返回到指定的优先级级别,用于在更改优先级后恢复原始状态。 ### mbuf数据结构 `mbuf`是FreeBSD中用于在网络层和更高层之间传递数据的关键数据结构...

    Linux-kernel-and-driver-development.zip_linux kernel

    4. **中断与中断处理程序**:理解中断处理机制,包括硬中断、软中断和底半部,以及中断服务例程的编写,有助于优化系统的响应速度。 5. **内核同步与并发**:在多任务环境中,内核同步机制如信号量、互斥锁、自旋锁...

    linux kernel-0.12

    0.12版本的中断处理程序展示了如何处理来自不同硬件源的中断请求,以及中断上下文的切换。 通过分析和学习Linux内核0.12,开发者不仅可以了解操作系统的基础架构,还能深入理解Linux内核的模块化设计和模块加载机制...

    drivers_drivers_linux_Kernel_

    Linux 4.0引入了中断协调机制,优化了中断处理流程,降低了中断延迟,提升了系统响应速度。 3. **I/O调度器**:I/O调度器决定了磁盘请求的执行顺序,以优化读写性能。在样例代码中,可能包含有自定义I/O调度器的...

Global site tag (gtag.js) - Google Analytics