Linux网络设备驱动总结

1. Linux 系统对网络设备驱动定义了4个层次,这4个层次为网络协议接口层网络设备接口层、提供实际功能的设备驱动功能层网络设备与媒介层

2. 网络协议接口层 向 网络层协议 提供统一的 数据包收发接口,不论上层协议为 ARP 还是 IP,都通过 dev_queue_xmit() 函数 发送数据,并通过 netif_rx() 函数 接收数据

3. 网络设备接口层 向 协议接口层 提供统一的用于描述具体网络设备属性和操作的结构体 net_device,该结构体是设备驱动功能层中各函数的容器

4. 在设计具体的网络设备驱动程序时,我们需要完成的主要工作是编写设备驱动功能层的相关函数以填充 net_device 数据结构的内容并将 net_device 注册入内核。

5. sk_buff结构体非常重要,它的含义为“套接字缓冲区”,用于在 Linux 网络子系统中的各层之间传递数据

6. Linux 内核必须分配用于容纳数据包的缓冲区,sk_buff 结构体定义了 4 个指向这片缓冲区不同位置的指针 head、data、tail 和 end。

7. head 指针指向内存中已分配的用于承载网络数据的缓冲区的起始地址

8. data指针则指向对应当前协议层有效数据的起始地址。

9. tail指针指向对应当前协议层有效数据负载的结尾地址,与data指针对应。

10. end指针指向内存中分配的数据缓冲区的结尾,与head指针对应。

11. sk_buff 结构体中定义的 len 是指数据包有效数据的长度,包括协议头和负载(Payload)

12. 为了支持数据包的分片存放,sk_buff 中增加 data_len 这个成员,它记录分片的数据长度

13. alloc_skb() 函数分配一个 套接字缓冲区 和 一个 数据缓冲区,参数 len 为数据缓冲区的 空间大小

14. 数据链路层通过调用 skb_pull() 函数剥掉以太网协议头,向网络层IP传递数据包。

15. 应用程序在调用 revc() 接收数据时,从 skb->data+sizeof(struct udphdr) 的位置开始复制到 应用层缓冲区。

16. Linux 套接字缓冲区中的数据缓冲区指针移动操作包括 put(放置)、push(推)、pull(拉)、reserve(保留)等。

17. base_addr 为网络设备 I/O 基地址。

18. 以太网设备的广播地址为 6 个 0xFF,而 MAC 地址需由驱动程序从硬件上读出并填充到 dev_addr[]中。

19. open()函数的作用是打开网络接口设备,获得设备需要的 I/O 地址、IRQ、DMA通道等。

20. hard_start_xmit()函数会启动数据包的发送,当系统调用驱动程序的hard_start_xmit()函数时,需要向其传入一个sk_buff结构体指针,以使得驱动程序能获取从上层传递下来的数据包

21. NAPI是Linux系统上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据包,而是采用首先借助中断唤醒数据包接收的服务程序,然后以轮询方式获取数据包

22. 网络设备驱动程序从上层协议传递过来的 sk_buff 参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。

23. 网络适配器硬件电路可以检测出链路上是否有载波,载波反映了网络的连接是否正常。

24. 网络设备驱动程序中往往设置一个定时器来对链路状态进行周期性地检查。

posted @ 2024-02-01 19:00  昆山皮皮虾  阅读(67)  评论(0编辑  收藏  举报