前言
呵呵 中断机制 也是内核中很常见的机制了
中断机制是现代计算机系统中的基本机制之一,它在系统中起着通信网络的作用,以协调系统对各种外部事件的响应和处理,中断是实现多道程序设计的必要条件,中断是CPU 对系统发生的某个事件作出的一种反应。引起中断的事件称为中断源。中断源向CPU 提出处理的请求称为中断请求。发生中断时被打断程序的暂停点称为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现由软件和硬件综合完成,硬件部分叫做硬件装置,软件部分称为软件处理程序。
软中断的处理
(initramfs) cat /proc/softirqs
CPU0
HI: 0
TIMER: 2566
NET_TX: 0
NET_RX: 0
BLOCK: 108
IRQ_POLL: 0
TASKLET: 1
SCHED: 0
HRTIMER: 0
RCU: 2978
软中断这部分处理是在 softirq.do_softirq 中进行处理的
时钟软中断是最频繁的 对应的 handler 是 timer.run_timer_softirq
RCU 对应的 handler 是 tree.rcu_process_callbacks
BLOCK 对应的 handler 是 blk-softirq.blk_done_softirq
NET_TX 对应的 handler 是 dev.net_rx_action
TASKLET 对应的 handler 是 softirq.tasklet_action
是在 各个 ksoftirqd/$cpuId 的进程中执行的
在中断处 打上断点, 可以看到 系统缓慢启动 ….
在哪里注册中断?
这部分中断通常来说是 系统启动 的时候注册的
注册 SCHED 软中断
注册 RCU 软中断
注册 TASKLET, HI 软中断
注册 BLOCK 软中断
注册 NET_TX, NET_RX 的软中断
BLOCK 软中断的处理 与 触发
软中断本身携带的数据有 终端号
BLOCK 中断之后从 blk_cpu_done 队列中遍历 request, 来回调处理
将请求添加到 blk_cpu_done 队列的是来自于 硬中断, ata, scsi 的回调处理过程
将 request 添加到了 blk_cpu_done 队列之后, 主动触发了一下 BLOCK 软中断, 处理如下图
BLK 软中断的触发主要是在 cpu_end 的时候, dma 完成之后 blk_complete_request 通知的时候
RCU 软中断的处理 与 触发
定时触发 RCU 软中断, 判断标准参见 tree.__rcu_pending
RCU 中断的处理如下
时钟 软中断的处理 与 触发
定时触发 时间 软中断
时钟 软中断的处理如下
NET_RX 软中断的处理 和 触发
网卡 emit 了一个消息到 loopback 网卡队列之后, 设备 会触发一个 NET_RX 的软中断
收到 NET_RX 之后, 走 dev.net_rx_action 来处理收到 skb 的相关业务处理
TASKLET 软中断的处理 和 触发
系统启动的时候, 触发了一个 keyboard 的 tasklet 的软中断
tasklet 的 软中断处理函数为 softirq.tasklet_action
keyboard 对应的这个 tasklet 处理为 keyboard.kbd_bh
完