linux 网络内核模块了解01

2022-01-17 16:11:41 浏览数 (2)

软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
代码语言:javascript复制
struct net_device

在Linux 内核中没中网络设备都用这个数据结构表示,包括软硬件的配置信息。

代码语言:javascript复制
struct sock

用于存储套接字的网络信息

0 人点赞