软IRQ初始化
在内核初始化期间,softirq_init 会以两个通用软IRQ对软IRQ 层做初始化。
tasklet_action 和 tasklet_hi_action (分别与TASKLET_SOFTIRQ 以及 HI_SOFTIRQ 相关联)
代码语言:javascript复制void __init softirq_init()
{
open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
}
这两个由网络代码NET_RX_SOFTIRQ 和NET_TX_SOFTIRQ 所用的软IRQ 是在net_dev_init 中初始化的。
内存缓存
内核分别使用kmalloc 和kfree 函数分配和释放一个内存块。这两个函数的语法,类似于另外来自于libc用户空间库的姊妹函数malloc 和free 调用。
内核维护的其专属内存缓存的网络数据结构
套接字缓冲区描述符
邻居协议映射
路由表
关键数据结构
代码语言:javascript复制struct sk_buff
一个封包就存储在这里,所有网络分层都会使用这个结构来存储其报头,有关用户数据的信息(有效载荷),以及用来协调工作的其他内部信息。
多个不同的网络分层都会使用这个结构。
(MAC 或L2分层上的另一种链路层协议, L3的IP以及L4的TCP 或UDP)都会使用这个结构。并且当该结构从一个分层传到另一个分层时,其不通的字段会随之变化。
- L4 在传给L3 之前会附加一个报头。
- L3 在传给L2之前又会挤上其自己的报头。
附加报头比把数据从一个分层拷贝到另一个分层更有效率
内核提供skb_reserve 函数处理 改变指向缓冲区的变量。
sbk相关处理函数
数据预留和对齐
- skb_reserve
- skb_put
- skb_push
struct net_device
在Linux 内核中没中网络设备都用这个数据结构表示,包括软硬件的配置信息。
代码语言:javascript复制struct sock
用于存储套接字的网络信息