`
simohayha
  • 浏览: 1400151 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

网络设备的中断处理

阅读更多
我们这里描述的是硬件中断。

设备和内核之间的交互有两种方法。

1 polling(轮询)

也就是kernel来操作交互,由kernel来检测某一个状态,看是否需要让设备做什么。

2 interrupt(中断)

设备来发起交互,设备发出一个硬件中断请求给kernel当他需要kernel的注意时。


当中断来的时候被调用的函数称为interrupt handler,他必须通过设备的驱动来安装。当一个设备驱动注册一个NIC(Network Interface Card),他请求并标记了一个IRQ,然后他为这个中断请求注册一个回调函数.

其中注册回调函数与remove回调函数用下面的两个方法。

int request_irq(unsigned int irq,
		irq_handler_t handler,
		unsigned long irqflags, const char * devname, void *dev_id)

void free_irq(unsigned int irq, void *dev_id)


irq也就是中断请求号,handler就是中断抵达时的回调函数。irqflags是中断的类型,比如IRQF_SHARED(中断共享)等。dev_id也就是设备注册时的id。

NIC的中断的发生一般有下面的几种类型。

1 互联网帧的到达,也就是NIC接到数据。

2 传输失败。体现在用户层就是超时,等等。。

3 DMA传输成功完成。

比如有数据,通过DMA传递给NIC,由于DMA是异步的,因此设备驱动必须等待从NIC的一个显式的中断。

4 设备有足够的内存处理一个新的传输。

当egress queue没有足够的空间,也就是无法放入一帧时,NIC的驱动会关闭掉传输,并要求NIC当有比给定的内存更大的内存时发出一个中断,然后当中断来的时候会重新打开传输。

这里看一个例子:

3c509.c中的hard_start_xmit方法

netif_stop_queue (dev);

.................
if (inw(ioaddr + TX_FREE) > 1536)
		netif_start_queue(dev);
	else
		/* Interrupt us when the FIFO has room for max-sized packet. */
		outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);


这里只摘要了主要的代码,第一行停止了设备的传输队列,然后监测是否设备有足够的空间存放一帧(1536字节).如果有的话打开传输队列,否则指示设备当有足够空间的时候产生一个中断(使用outw来操作寄存器).当中断来的时候会调用netif_start_queue.


共享中断

共享中断也就是一个中断请求号关联了多个中断处理函数,当没一个设备注册中断请求号时候传递的参数声明是否这个中断能被共享。

接下来看下中断的数据结构:


struct irq_desc {
	irq_flow_handler_t	handle_irq;
	struct irq_chip		*chip;
	struct msi_desc		*msi_desc;
	void			*handler_data;
	void			*chip_data;
	struct irqaction	*action;	/* IRQ action list */
	unsigned int		status;		/* IRQ status */

	unsigned int		depth;		/* nested irq disables */
	unsigned int		wake_depth;	/* nested wake enables */
	unsigned int		irq_count;	/* For detecting broken IRQs */
	unsigned int		irqs_unhandled;
	unsigned long		last_unhandled;	/* Aging timer for unhandled count */
	spinlock_t		lock;
#ifdef CONFIG_SMP
	cpumask_t		affinity;
	unsigned int		cpu;
#endif
#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
	cpumask_t		pending_mask;
#endif
#ifdef CONFIG_PROC_FS
	struct proc_dir_entry	*dir;
#endif
	const char		*name;
}


irq_desc 代表中断的描述符(他是全局的)而且是与平台相关的,因此我们可以看到不同的平台实现了自己的中断处理的相关函数,而中断的处理函数是包含在action中的,其中如果action多于一个元素,就代表这个irq是共享irq。

struct irqaction {
	irq_handler_t handler; ///中断处理函数
	unsigned long flags;
	cpumask_t mask;
	const char *name;
	void *dev_id;
	struct irqaction *next; ///链表的指针
	int irq; ///中断号
	struct proc_dir_entry *dir;
};


下面的图很好的显示了irq_desc的结构。







  • 大小: 17.1 KB
分享到:
评论

相关推荐

    中断处理与设备驱动程序

    在计算机系统中,中断处理和设备驱动程序是操作系统与硬件交互的关键组成部分,它们共同负责管理和协调计算机硬件资源,确保系统高效、稳定地运行。本文将深入探讨这两个概念,以及它们在C语言环境中的实现。 首先...

    linux下中断处理程序示例,含驱动和应用程序

    例如,在网络设备驱动中,中断处理程序可能会快速处理数据包的到来,避免数据丢失。在文件`irq-test.tar`中的应用程序可能展示了如何在用户空间调用这些接口,以及如何处理中断返回的结果。 总的来说,这个示例涵盖...

    操作系统模拟中断事件的处理

    中断机构允许硬件在检测到特定事件时,如硬件故障、外部设备请求或定时器触发等,暂停当前进程的执行,转而执行操作系统内核中的中断处理程序。中断事件的处理涉及到以下几个核心概念: 1. **中断事件**:中断事件...

    多核微处理器系统中断处理和中断控制的实现

    多核处理器通过共享资源、并行执行任务来提高系统性能,而中断处理则保证了在多任务环境下,处理器能够及时响应外部事件,如设备I/O操作完成、定时器到期或错误条件等。以下将详细探讨多核微处理器系统中断处理和...

    Windows和Linux设备驱动程序的中断处理.pdf

    《Windows和Linux设备驱动程序的中断处理》这篇文章主要探讨了两个主流操作系统——Windows和Linux——在设备驱动程序中断处理方面的机制。中断处理是操作系统中关键的一环,它负责协调硬件事件与软件响应之间的通信...

    Linux设备驱动程序学习(11)-中断处理 - Linux设备驱动程序

    本篇文章将深入探讨Linux设备驱动中的一个重要概念——中断处理,这是设备与处理器通信的一种关键机制。 中断是硬件设备向CPU发送的一种紧急信号,表明它需要服务或已经完成了某个操作。在Linux设备驱动程序中,...

    arm9串口程序,中断处理程序

    ARM9是ARM公司设计的一种32位RISC(精简指令集计算机)架构,它在许多嵌入式系统中作为核心处理器使用,如嵌入式操作系统、消费电子设备和网络设备等。ARM9支持多种指令集,包括ARMv5TE,提供了浮点运算单元(FPU)...

    中断处理操作系统.pptx

    中断处理是操作系统中的一种机制,用于处理计算机系统中的各种事件,如I/O设备的输入输出、按键、网络数据的到达等。中断处理机制可以使操作系统更好地管理系统资源,提高系统的响应速度和实时性。 中断的类型 ...

    Linux中断处理体系结构分析1

    中断处理器的主要任务是执行实际的中断处理工作,例如处理键盘输入、网络数据包的接收等。 Linux中断处理机制的实现 Linux中断处理机制的实现主要涉及到三个方面:中断控制器的实现、IRQ处理程序的实现和中断...

    MPC860的中断处理技术研究

    总的来说,MPC860的中断处理技术是其在网络通信设备中广泛应用的关键因素之一。理解并熟练掌握中断体系结构和中断处理机制对于开发高效稳定的嵌入式软件至关重要。通过对中断初始化程序和中断服务程序的精心设计,...

    中断事件处理

    硬件中断通常由外部设备(如键盘、鼠标、网络接口)或内部设备(如定时器)触发;软件中断则由CPU执行特定指令(如INT指令)引发,常用于系统调用和服务请求。 时钟中断是硬件中断的一种,由计算机内部的计时器定期...

    Linux网络设备分析

    - **数据包接收**:网络设备接收到数据包后,通过中断处理程序唤醒接收队列,随后数据被传递给网络层进行进一步处理。 #### 内核数据结构`sk_buff` 在网络设备的处理过程中,`sk_buff`是一种非常重要的数据结构,...

    业务中断故障处理

    业务中断故障处理是IT行业中一个重要的议题,尤其是在通信网络领域,业务中断可能引发重大经济损失和服务信誉损害。在本文中,我们将深入探讨业务中断故障处理的关键知识点,基于OptiX155/622(Metro2050)STM-1/STM-4...

    外部中断.zip

    3. **保存现场**:为了在中断处理结束后能恢复原来的工作,CPU会将当前的程序计数器(PC)和处理器状态字(PSW)等寄存器内容保存到内存中的特定区域,这称为堆栈。 4. **中断处理**:CPU跳转到中断向量表...

    linux对中断处理的前世今生简介.pdf

    硬件中断是由硬件设备(如键盘、网卡)产生的,每个中断都有对应的处理函数,如按键中断和网络数据包接收中断。在Linux中,这些中断处理函数通常存储在一个数组中,当特定中断发生时,相应的处理函数会被调用执行。 ...

    中断服务程序举例2013-11-29.7z

    本文将详细解析中断服务程序的概念、工作原理,并通过ASM汇编语言程序示例(ISP1.ASM、ISP2.ASM)来阐述中断处理过程。 首先,中断是一种异步通信方式,它允许CPU在执行正常程序流的同时,响应来自外部或内部的紧急...

    MPC860的中断处理技术研究.doc

    理解这一技术对于开发高效、可靠的网络通信设备至关重要,因为它确保了系统对突发事件的快速响应和正确处理,从而提升了整体系统的性能和稳定性。在实际应用中,开发者需要深入理解MPC860的中断体系结构,合理配置...

    中断大全资料,中断号,中断功能,中断参数

    硬件中断是由外部设备(如键盘、鼠标、网络接口卡等)或者内部时钟产生的,用于通知CPU设备需要服务或者有特定事件发生。软件中断则通常由操作系统内核使用,用于执行特定的系统调用,如进程调度、内存管理等。 ...

    linux,中断处理[整理].pdf

    在Linux操作系统中,中断处理是设备驱动程序中的关键组成部分,它负责处理硬件事件,如数据传输完成、硬件错误等。中断处理机制确保了系统的实时性和高效性。以下是关于中断处理的详细解释: 一、中断处理程序架构 ...

    内核ARM中断

    例如,网络设备的中断服务例程可能负责接收和处理来自网卡的数据包,而定时器中断服务例程则可能用于调度任务或者更新系统时间。 在服务例程处理完中断后,中断处理进入退出阶段。这个阶段包括恢复之前保存的上下文...

Global site tag (gtag.js) - Google Analytics