开中断:在softirq上下文中(一般使用TASKLET_SOFTIRQ这个softirq)进行handle Data in the ram的动作 同样的,我们先假设Processor A处理了这个网卡中断事件,很快的完成了基本的HW操作后,schedule tasklet(同时也就raise TASKLET_SOFTIRQ softirq)。在返回中断现场前,会检查softirq的触发情况,因此,在TASKLET_SOFTIRQ softirq的h...
open_softirq(NET_TX_SOFTIRQ,net_tx_action); open_softirq(NET_RX_SOFTIRQ,net_rx_action); static int __init net_dev_init(void){ int i, rc = -ENOMEM; BUG_ON(!dev_boot_phase); if (dev_proc_init()) goto out; if (netdev_kobject_init()) goto out; INIT_LIST_HEAD(&ptype_all);...
内核调度器调度到ksoftirqd内核线程时,会将所有等待处理的 deferred interrupt(也就是 softirq)拿出来,执行对应的处理方法(softirq handler); 以收包软中断为例, IRQ handler 并不执行 NAPI,只是触发它,在里面会执行到 raise NET_RX_SOFTIRQ;真正的执行在 softirq,里面会调用网卡的 poll() 方法收包。IRQ handler ...
tasklet是建立在软中断上的一种延迟执行机制,它的实现基于TASKLET_SOFTIRQ和HI_SOFTIRQ这两个软中断类型。 4.1 tasklet_struct 在软中断的初始化函数softirq_init的最后,内核注册了TASKLET_SOFTIRQ和HI_SOFTIRQ这两个软中断: void __init softirq_init(void) { ... open_softirq(TASKLET_SOFTIRQ, tasklet_action); ...
softirqs 是在 Linux 内核编译时就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 软中断。因此是一种静态机制。如果想加一种新 softirq 类型,就需要修改并重新编译内核。 代码语言:javascript 代码运行次数:0 复制Cloud Studio 代码运行 heidsoft@heidsoft-dev:~$ systemd-cgls -k | grep kworker ├─ 8 [kwor...
软中断就是下半部使用的一种机制,它通过软件模仿硬件中断的处理过程,但是和硬件没有关系,单纯的通过软件达到一种异步处理的方式。其它下半部的处理机制还包括tasklet,工作队列等。依据所处理的场合不同,选择不同的机制,网卡收包一般使用软中断。对应NET_RX_SOFTIRQ这个软中断,软中断的类型如下: ...
net_dev_init函数(定义在net/core/dev.c),最注册软中断,如下: open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); 定义在:kernel/softirq.c文件中 voidopen_softirq(intnr,void(*action)(structsoftirq_action *)) ...
SoftIrq源代码分析 首先看一下linux内核当中的irq类型, 而在softirq中维护着struct softirq_action softirq_vec[NR_SOFTIRQS]这样一个类型的数组. //include/linux/interrupt.henum{ HI_SOFTIRQ=0, TIMER_SOFTIRQ, NET_TX_SOFTIRQ,//网络端口TXNET_RX_SOFTIRQ,//网络端口RXBLOCK_SOFTIRQ, ...
NET_RX_SOFTIRQ:此软中断主要用于处理网络设备的接收(Receive)部分 NET_TX_SOFTIRQ:此软中断用于处理网络设备的发送(Transmit)部分 将网络处理任务划分为接收和发送两部分,然后使用不同的软中断来处理的设计,有利于提高网络处理的效率。尤其在多核处理器系统中,不同的软中断可以在不同的CPU核心上并行运行,从而进一步...
问1:在服务器上查看 /proc/ softirqs,为什么 NET_RX 要比 NET_TX 大的多的多? 传输完成最终会触发 NET_RX,而不是 NET_TX。所以自然你观测 /proc/ softirqs 也就能看到 NET_RX 更多了。 好,现在你已经对内核是怎么发送网络包的有一个全局上的把握了。不要得意,我们需要了解的细节才是更有价值的地方,...