<Linux设备驱动开发详解第二版>第十六嶂linux 网络设备驱动的结构 中描述了对应linux 网络设备的驱动结构其中,net_device 是设备驱动功能层中的各种函数的容器向上提供统一的用于描述网络設备属性和操作的结构体
<Linux设备驱动开发详解第二版>第十六嶂linux 网络设备驱动的结构 中描述了对应linux 网络设备的驱动结构其中,net_device 是设备驱动功能层中的各种函数的容器向上提供统一的用于描述网络設备属性和操作的结构体
Linux内核对网络驱动程序使用统一的接口并且对于网络设备采用面向对象的思想设计。
Linux内核采用分层结构处理网络数据包分层结构与网络协议的结构匹配,既能简化数据包处理流程又便于扩展和维护。
在Linux内核中对网络部分按照网络协议层、网络设备层、设备驱动功能层和网络媒介层的分层体系设计。
網络驱动功能层主要通过网络驱动程序实现
在Linux内核,所有的网络设备都被抽象为一个接口处理该接口提供了所有的网络操作。
net_device结构表礻网络设备在内核中的情况也就是网络设备接口。网络设备接口既包括软件虚拟的网络设备接口如环路设备,也包括了网络硬件设备如以太网卡。
Linux内核有一个dev_base的全局指针指向一个设备链表,包括了系统内的所有网络设备该设备链表每个节点是一个网络设备。
在net_device结構中提供了许多供系统访问和协议层调用的设备方法包括初始化、打开关闭设备、数据包发送和接收等。
二、与网络有关的数据结构
内核对网络数据包的处理都是基于sk_buff结构的该结构是内核网络部分最重要的数据结构。
网络协议栈中各层协议都可以通过对该结构的操作实現本层协议数据的添加或者删除使用sk_buff结构避免了网络协议栈各层来回复制数据导致的效率低下。
sk_buff结构可以分为两个部分一部分是存储數据包缓存,在图中表示为PackertData另一部分是由一组用于内核管理的指针组成。
data指向当前数据包的首地址;
tail指向当前数据包的尾地址;
end 指向数據缓冲的内核尾地址
数据包的大小在内核网络协议栈的处理过程中会发生改变,因此data和tail指针也会不断变化而head和tail指针是不会发生改变的。
对于一个TCP数据包为例sk_buff还提供了几个指针直接指向各层协议头。mac指针指向数据的mac头;nh指针指向网络协议头一般是IP协议头;h指向传输层協议头,在本例中是TCP协议头
对各层设置指针的是方便了协议栈对数据包的处理。
Linux内核中网络设备最重要的数据结构就是net_device结构了它是网絡驱动程序最重要的部分。
内核中所有网络设备的信息和操作都在net_device设备中无论是注册网络设备,还是设置网络设备参数都用到该结构。
在Linux内核中一个网络数据包从网卡接收到用户空间需要经过链路层、传输层和socket的处理,最终到达用户空间
以DM9000网卡为例,当网卡收到数據包以后调用中断处理函数 dm9000_interrupt(),该函数检查中断处理类型如果是接收数据包中断,则调用 dm9000_rx()函数接收数据包到内核空间
dm9000_rx()函数收到数据包唍成后,内核会继续调用 netif_rx()函数函数的作用是把网卡接收到数据提交给协议栈处理。
以UDP数据包发送流程为例在DM9000网卡上如何发送一个数据包。
当用户空间的应用程序通过
Linux内核对网络驱动程序使用统一的接口并且对于网络设备采用面向对象的思想设计。
Linux内核采用分层结构处理网络数据包分层结构与网络协议的结构匹配,既能简化数据包处理流程又便于扩展和维护。
在Linux内核中对网络部分按照网络协议层、网络设备层、设备驱动功能层和网络媒介层的分层体系设计。
網络驱动功能层主要通过网络驱动程序实现
在Linux内核,所有的网络设备都被抽象为一个接口处理该接口提供了所有的网络操作。
net_device结构表礻网络设备在内核中的情况也就是网络设备接口。网络设备接口既包括软件虚拟的网络设备接口如环路设备,也包括了网络硬件设备如以太网卡。
Linux内核有一个dev_base的全局指针指向一个设备链表,包括了系统内的所有网络设备该设备链表每个节点是一个网络设备。
在net_device结構中提供了许多供系统访问和协议层调用的设备方法包括初始化、打开关闭设备、数据包发送和接收等。
二、与网络有关的数据结构
内核对网络数据包的处理都是基于sk_buff结构的该结构是内核网络部分最重要的数据结构。
网络协议栈中各层协议都可以通过对该结构的操作实現本层协议数据的添加或者删除使用sk_buff结构避免了网络协议栈各层来回复制数据导致的效率低下。
sk_buff结构可以分为两个部分一部分是存储數据包缓存,在图中表示为PackertData另一部分是由一组用于内核管理的指针组成。
data指向当前数据包的首地址;
tail指向当前数据包的尾地址;
end 指向数據缓冲的内核尾地址
数据包的大小在内核网络协议栈的处理过程中会发生改变,因此data和tail指针也会不断变化而head和tail指针是不会发生改变的。
对于一个TCP数据包为例sk_buff还提供了几个指针直接指向各层协议头。mac指针指向数据的mac头;nh指针指向网络协议头一般是IP协议头;h指向传输层協议头,在本例中是TCP协议头
对各层设置指针的是方便了协议栈对数据包的处理。
Linux内核中网络设备最重要的数据结构就是net_device结构了它是网絡驱动程序最重要的部分。
内核中所有网络设备的信息和操作都在net_device设备中无论是注册网络设备,还是设置网络设备参数都用到该结构。
在Linux内核中一个网络数据包从网卡接收到用户空间需要经过链路层、传输层和socket的处理,最终到达用户空间
以DM9000网卡为例,当网卡收到数據包以后调用中断处理函数 dm9000_interrupt(),该函数检查中断处理类型如果是接收数据包中断,则调用 dm9000_rx()函数接收数据包到内核空间
dm9000_rx()函数收到数据包唍成后,内核会继续调用 netif_rx()函数函数的作用是把网卡接收到数据提交给协议栈处理。
以UDP数据包发送流程为例在DM9000网卡上如何发送一个数据包。
当用户空间的应用程序通过