一.Linux网络子子系统:
作用:为驱动提供统一的网络系统中间层服务,将设备无关的部分提取出来方便驱动的编写与移植
数据流向及其所作操作:
- 用户空间:建立网络套接字,选择好协议后进行数据读写
- 应用层:根据用户层的选择将数据处理成对应应用协议(HTTP,FTP,TELNET等应用协议)的数据格式
- 传输层:根据用户空间的设置为数据加传输协议(TCP/UDP)
- 网络层:根据用户空间传递的ip地址进行路由选择和ip选择,这是保证数据源到数据目的地进行数据交换的关键层
- 数据连路层:将数据封装成帧,进行数据校验,以及进行数据流量控制等
- 物理层:也就是设备驱动,将数据通过cpu写入网络设备,网络设备进行物理地址传输通信
二.网卡设备关键描述符:
网卡设备描述符:net_device 用来描述和管理一张网卡
网络数据包:struct sk_buff用来与上层的数据通信 这个数据分为 head,data,tail,end四个部分
三.网络设备驱动架构:
1.初始化: 1.1 分配net_device结构:alloc_etherdev(只能给以太网使用的),更加规范的分配函数为:alloc_netdev(更加规范,可以提供给回环网卡使用)
1.2 初始化net_device:1.2.1中断号
1.2.2基地值
1.2.3 MAC地址
1.2.4 netdev_ops
1.3 初始化硬件
1.4 注册网卡驱动结构:register_netdev
2.数据发送: 2.0 将数据接收函数赋值给netdev_ops,等待上层回调
2.1 通知上层,暂停网卡数据传送:netif_stop_queue
2.2 将回调函数中skd中的数据写入硬件中
2.3 将回调的参数skd空间释放:dev_kfree_skd
2.4 在中断处理函数中当接受发送完成标志时通知上层可以继续往网卡传送数据:netif_wake_queque
3.数据接收: 3.1在中断函数中读取寄存器判断中断类型,调用处理函数
3.2 在处理函数从寄存器中读数据状态和数据长度
3.3 分配skb结构:dev_alloc_skb
3.4 从寄存器中读取数据存入skb
3.5 将收到skb包上传协议栈 netif_rx(这个空间会被上层释放空间)
四.回环网卡:就是将数据发送的和数据接收的接口连在一起,驱动将接收到的数据发送回去