内核版本: 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
标志位进行判断。
分享到:
相关推荐
ULK(Understanding the Linux Kernel,即《深入理解Linux内核》)第四章中提到,Linux采用了一种没有优先级的中断模型,并且支持中断嵌套。这一表述可能与传统观念相悖,但其实是Linux内核的一种设计选择。 1. **...
- **驱动模型**:TOPPERS/JSP Kernel提供标准的驱动接口,便于开发和移植设备驱动程序。 - **中断驱动**和**轮询驱动**:根据硬件特性选择合适的驱动方式,优化性能。 8. **可配置性与裁剪** - **配置工具**:...
驱动程序的编写通常涉及对硬件特性的理解、内核接口的使用以及中断处理等核心概念。 本书可能涵盖了以下关键知识点: 1. **驱动程序的基本结构**:驱动程序通常包括初始化函数、设备操作结构体、中断处理函数等...
- WinCE支持两种中断模型:固定优先级中断(Fixed Priority Interrupts, FPI)和优先级分组中断(Priority Group Interrupts, PGI)。 - 中断控制器,如8259A或APIC,在X86平台上管理中断源,分配中断号,并转发...
在T-KERNEL中,中断处理程序是实时响应的关键,必须在规定的时间内完成服务并返回,以免阻塞其他更重要的任务。 3. **中断调度**:T-KERNEL支持抢占式调度,意味着高优先级的任务可以中断低优先级任务的执行。因此...
1. **Linux内核架构**:首先,我们需要理解Linux内核的基本结构和工作原理,包括进程管理、内存管理、中断处理、设备模型等。这些基础知识对于分析驱动源码至关重要。 2. **设备驱动分类**:驱动可以分为字符设备...
4. **事件处理机制**:T-KERNEL的事件模型允许任务间非阻塞的通信,当检测到按键事件时,可以通过发送事件来唤醒或调度相应的任务,处理按键输入。 5. **按键映射与事件处理**:根据"ad_key"标签,源代码中可能包含...
Kprobes的核心功能在于,当断点被触发时,控制权会转移到用户定义的处理程序,执行被中断的指令后返回。由于这种机制,Kprobes通常具有相对较低的开销。 在ARM架构上,传统的Kprobe模型面临一些挑战。在经典模型中...
学习设备驱动开发,需要掌握I/O操作、中断处理、DMA(直接内存访问)以及字符设备和块设备的模型。 六、文件系统 文件系统是组织数据和提供访问接口的关键部分。在Linux中,有多种文件系统类型,如EXT4、XFS、Btrfs...
开发者需要熟悉S3C2410的硬件特性、Linux内核的驱动模型以及中断处理等基础知识,才能有效地编写和调试驱动,实现对硬件资源的有效管理与利用。通过不断的实践和学习,可以逐步掌握这一领域的复杂技术,为嵌入式系统...
中断处理则是硬件向内核发送信号的方式,如键盘输入、定时器超时等事件都会触发中断,内核通过中断处理程序来响应这些事件。 六、编程实践 在Windows内核编程中,开发者需要对WinAPI、Windows Driver Framework ...
7. **中断与异常处理**:中断是硬件事件的处理机制,异常则包括软件错误或特定指令的处理。内核通过中断服务例程和异常处理程序来响应这些事件。 8. **系统调用**:系统调用是用户空间程序与内核交互的主要方式,如...
- **中断机制**:讲解了中断的基本原理及其在Linux内核中的处理流程。 - **延迟执行**:分析了Linux内核如何通过软中断等机制实现任务的延迟执行。 - **异步事件处理**:讨论了异步事件的处理方法,包括定时器、工作...
3. **中断处理**:学习中断的触发、处理和中断上下文,以及软中断和底半部的概念。 4. **设备驱动**:探究如何编写和理解设备驱动程序,理解I/O模型(如中断驱动、轮询和DMA)。 5. **文件系统**:理解VFS(虚拟...
- `splhigh`:高优先级中断处理,如外部硬件中断。 - `splx(s)`:返回到指定的优先级级别,用于在更改优先级后恢复原始状态。 ### mbuf数据结构 `mbuf`是FreeBSD中用于在网络层和更高层之间传递数据的关键数据结构...
4. **中断与中断处理程序**:理解中断处理机制,包括硬中断、软中断和底半部,以及中断服务例程的编写,有助于优化系统的响应速度。 5. **内核同步与并发**:在多任务环境中,内核同步机制如信号量、互斥锁、自旋锁...
0.12版本的中断处理程序展示了如何处理来自不同硬件源的中断请求,以及中断上下文的切换。 通过分析和学习Linux内核0.12,开发者不仅可以了解操作系统的基础架构,还能深入理解Linux内核的模块化设计和模块加载机制...
Linux 4.0引入了中断协调机制,优化了中断处理流程,降低了中断延迟,提升了系统响应速度。 3. **I/O调度器**:I/O调度器决定了磁盘请求的执行顺序,以优化读写性能。在样例代码中,可能包含有自定义I/O调度器的...