INT-中断
按照CPU与中断源(把能够提出中断请求的设备和事件称为中断源)的位置关系可分为
内部中断和外部中断。
内部中断:也称为异常中断,属于非屏蔽中断,是处理器检测到异常情况或执行软件
中断指令引起的一种中断。通常有:除法出错中断(INT0)、断点中断(INT3)、
溢出中断(INT4)和单步执行中断(INT1)等。异常又分为故障和陷阱。
外部中断:也称为硬件中断,是由CPU外部引脚触发的一种中断,
分为不可屏蔽中断NMI(INT2)和可屏蔽中断INTR。
中断源的优先权级别
内部中断最高(除单步执行中断),其次为NMI中断,再次为INTR中断。单步执行中断最低
中断响应
CPU在每条指令执行结束之后,都会去查询有无中断申请。
PIC-可编程中断控制器
PIC(programming interrupt controller),8259可编程中断控制芯片可以管理8个中断源,
通过级联可以构成64个中断向量系统
工作过程:当PIC向cpu处理器的INT引脚发送一个中断信号时候,处理器停下所做事情
询问PIC需要执行那个服务请求,PIC发送终端号,查询中断向量表,执行中断服务程序
原理:8259A芯片可以处于编程状态和操作状态,cpu可以通过IN/OUT指令对芯片
进行初始化编程,还可以通过操作字命令修改中断处理方式,完成了初始化编程,
芯片即进入操作状态,此时芯片即可随时响应外部设备提出的中断请求
多CPU架构演进
Symmetric Multi-Processor
SMP架构是只多个cpu无主次,共享内存,总线,操作系统等,每个cpu访问内存任何地址
耗费时间相等,也称为一致存储器访问结构
AMP架构是多个cpu分别做不同的事情,互不干涉
Non-Uniform Memory Access
NUMA架构是非一致存储访问结构,多个SMP通过交换矩阵进行互联,每个SMP有自己的内存,
同时还可以访问其他SMP的内存,但是要经过交换矩阵降低了速度,可以看出NUMA通过牺牲
内存的访问延时来达到更高的扩展性;缺点是CPU数量增加,访问远端内存的时延也会增加,
性能不能线性增加
Massive Parallel Processing
MPP就是将多台独立的主机组成集群,每个节点都有自己的cpu、内存、操作系统,
软件架构改变,完全松耦合,
APIC-高级可编程中断控制器
pin:引脚;vector:提供优先级和亲和性绑定
在PIC和单核时代,irq,vector,pin是三合一的,就是PIC控制器的pin引脚,irq暗示
中断优先级。进入多核时代带来了很多问题,哪个中断在哪个核上处理,如何保证中断
负责均衡等。
IRQ是所有核统一编码不重复,是中断相关信息的查询码,可以得到中断控制器对象mpic
中断描述符对象desc,硬件终端号等。
8259A只适合单cpu的情况,对于SMP多cpu体系的并行,能够把中断传递给系统每个cpu
非常重要的。apic包括两个组件:本地apic和io apic,系统最多有8个io apic负责收集
来自外部io的interrupt信号,然后按照一定规则发给loccal apic
可以调用Linux自己的优化模块irqbalance来实现自动的优化调节,
1. 清除统计
2. 分析中断的情况
3. 分析中断的负载情况
4. 根据负载情况计算如何平衡中断
5. 实施中断亲和性变更
也可以人为的将中断进行绑定的固定的物理CPU上,中断亲和力是指将一个或多个中断源
绑定到特定的 CPU 上运行,一旦设置了亲和性,中断就只在特定的CPU上触发了
指令主要用于多CPU环境下,它显示各个可用CPU的状态
MSI/MSI-X Message Signaled Interrupt
没有多根独立的中断PIN,它使用特殊的信号来模拟中断PIN的置位和复位
MSI允许设备向一段指定的MMIO地址空间写一小段数据,然后chipset以此产生相应的中断给CPU
PCI-E 的新标准,虽然MSI相对比较复杂一点,但它是有不少好处的:
利用写寄存器值来触发中断,MSI使用了MSI Capability结构来实现中断请求
MSI允许每个device有1,2,4,8,16或者是32个中断
北桥被用来处理高速信号,通常处理CPU(处理器),RAM(内存),AGP端口或PCI Express,和南桥芯片之间的通信
南桥芯片负责I/O总线之间的通信,如PCI总线、USB、LAN、ATA
软中断是soft irq
驱动中的硬中断可能需要完成跟多工作,这时是关闭了中断的,可能丢失外部中断
所以linux架构,将中断处理函数分为两个任务,一个在中断函数中执行,一个在软件中断
中执行,这时开启中断,可以相应外部中断
硬件中断处理完成后,在irq_exit中会触发软件中断的处理,需要满足两个条件:
不是在硬件或软件中断处理过程中,必须有软件中断是pending状态
preempt_count可以表示是否处于中断处理或者软件中断处理过程中
避免软件中断在中断嵌套中被调用,并且达到在单个CPU上软件中断不能被重入的目的
软中断避免中断过程操作多丢失中断,还要考虑时间长影响系统响应,又必须考虑优先度
__do_softirq函数就恰似在这三者之间打太极
为每个CPU启动一个内核线程(watchdog/x),此线程为优先级最高的实时线程,在该线程得到调度时,
会更新相应的计数(时间戳),同时会启动定时器,当定时器到期时检查相应的时间戳,
如果超过指定时间,都没有更新,则说明这段时间内都没有发生调度(因为此线程优先级最高),
则打印相应告警或根据配置可以进入panic流程,echo 30 > /proc/sys/kernel/watchdog_thresh
光模块中断不触发问题:
拔出光模块没有任何显示,经过判断
ixgbe_service_task 是一个timer执行
ixgbe_check_sfp_event 是在ixgbe_msix_other被调用
注册中断处理程序 是通过request_irq函数来完成的
err = request_irq(adapter->msix_entries[vector].vector,
ixgbe_msix_other, 0, netdev->name, adapter);
参数1:中断号,所申请的中断向量,比如EXIT0中断等定义在mach/irqs.h。
参数2:是一个函数指针,向系统登记的中断处理函数,是一个回调函数,当中断发生时,系统调用这个函数。
参数3:指定中断属性、中断触发方式(一般用宏定义表示)等。定义在linux/interrupt.h。
参数4:指定中断名字,用命令 cat /proc/interrupts 可查看系统中断申请与使用情况。
参数5:传入中断处理程序的参数,可以为NULL,但在注册共享中断时,此参数不能为NULL。该参数可作为共享中断时的中断区别参数,还可以把其传给一个结构体变量,用于保存一个设备的信息,使中断处理函数可以获得该设备的信息。
返回值:函数运行正常时返回0,否则返回对应错误的负值。
来源:https://blog.csdn.net/ctylihuai/article/details/100164320