linux驱动程序的组成,Linux网络设备驱动程序体系结构分为四层()

/ ************************************************** ******************************************

*本文是个人学习记录。如果有任何错误,请纠正我。

*本文参考:

*

*

*************************************************** ****************************************** /

1.网络设备驱动程序框架概述

Linux网络设备驱动程序体系结构分为四层:网络协议接口层,网络设备接口层,提供实际功能的设备驱动程序层以及网络设备和媒体层。

([1)网络协议接口层

网络协议接口层为网络层协议提供了统一的数据包接收和发送接口。无论高层协议是ARP还是IP,它都通过dev_queue_xmit()函数发送数据,并通过netif_rx()函数接收数据。该层的存在使上层协议独立于特定设备。

([2)网络设备接口层

由网络设备接口层提供给协议接口层的结构net_device用于描述特定网络设备的属性和操作。此结构是设备驱动程序功能层的功能的容器。

([3)设备驱动程序功能层

设备驱动程序功能层的每个功能都是网络设备接口层的net_device数据结构的特定成员。它是驱动网络设备硬件完成相应操作的程序。它通过nto_start_xmit()函数开始发送操作,并在网络设备上传递中断。触发接收操作。

([4)网络设备和媒体层

网络设备和媒体层完成数据包的发送和接收的物理实体,包括网络适配器和特定的传输媒体。网络适​​配器由设备驱动程序功能层中的功能物理驱动。

驱动程序工程师的工作:在设计特定的网络设备驱动程序时,需要完成的主要工作是编写设备驱动程序功能层的相关功能,以填充net_device数据结构的内容并注册。 net_device进入内核。

205da90b8f7e0f8f5ee3dc58edddd6f6.png

2.相关数据结构

([1) struct sk_buff

sk_buff是网络驱动框架中的信息载体,并且是网络分层模型中数据的逐层打包和解包载体。

427 structsk_buff {428 /*These two members must be first.*/

429 struct sk_buff *next; //sk_buff是双向链表,所以有前去后继,这是指向后面的sk_buff结构体指针

430 struct sk_buff *prev; //这是指向前一个sk_buff结构体指针

432ktime_t tstamp;434 struct sock *sk;435 struct net_device *dev; //对应的net_device

443 char cb[48] __aligned(8);445 unsigned long_skb_refdst;449 unsigned int len, //表示数据区的长度(tail-data)与分片结构体数据区的长度之和

450 data_len;//只表示分片结构体数据区的长度,所以len=(tail - data) + data_len

451 __u16 mac_len, //mac报头的长度

452hdr_len;473 __be16 protocol;//包的协议类型,标识是IP包还是ARP包还是其他数据包

534__u16 inner_transport_header;535__u16 inner_network_header;536__u16 inner_mac_header;537 __u16 transport_header; //指向传输包头

538 __u16 network_header; //指向传输层包头

539 __u16 mac_header; //指向链路层包头

540 /*These elements must be at the end, see alloc_skb() for details.*/

541 sk_buff_data_t tail; //指向当前数据包的尾地址, 随着各个网络层的加工而变化

542 sk_buff_data_t end; //数据缓冲区的结束地址

543 unsigned char *head, //数据缓冲区的开始地址

544 *data; //data指向当前数据包的首地址, 随着各个网路层的加工而变化

545 unsigned inttruesize;546atomic_t users;547 };

77669c60df8454ddcf1544d45f1a2b7a.png

struct sk_buff

([2) struct net_device

在Linux内核中,net_device用于描述网络设备。 net_device是设备接口层的核心,也是编写网络驱动程序核心的对象。

1160 structnet_device {1167 char name[IFNAMSIZ];//网络设备的名称, 网络设备被载入后会出现在ifconfig中, 比如默认的eth0就是这个

1179 unsigned long mem_end; //网络设备所使用的共享内存起始地址

1180 unsigned long mem_start; //网络设备所使用的共享内存结束地址

1181 unsigned long base_addr; //表示网络设备的IO基地址

1182 int irq; //设备使用的中断号

1189 unsigned longstate;1190

1191 structlist_head dev_list;1192 structlist_head napi_list;1193 structlist_head unreg_list;1194 structlist_head close_list;1210 netdev_features_t features; //用户层可以修改的特征

1212 netdev_features_t hw_features; //用户层不能修改的特征

1214netdev_features_t wanted_features;1243 const struct net_device_ops *netdev_ops;//网络设备的操作方法集

1244 const struct ethtool_ops *ethtool_ops; //ethtool的方法集

1245 const struct forwarding_accel_ops *fwd_ops;1248 const struct header_ops *header_ops; //协议头操作集

1250 unsigned int flags; /*interface flags (a la BSD)*/

1251 unsigned int priv_flags; /*Like 'flags' but invisible to userspace.

1252 * See if.h for definitions.*/

1253 unsigned shortgflags;1254 unsigned short padded; /*How much padding added by alloc_netdev()*/

1256 unsigned char operstate; /*RFC2863 operstate*/

1257 unsigned char link_mode; /*mapping policy to operstate*/

1259 unsigned char if_port; /*Selectable AUI, TP,..*/

1260 unsigned char dma; /*DMA channel*/

1262 unsigned int mtu; /*interface MTU value*/

1263 unsigned short type; /*interface hardware type*/

1264 unsigned short hard_header_len; /*hardware hdr length*/

1270 unsigned shortneeded_headroom;1271 unsigned shortneeded_tailroom;1274 unsigned char perm_addr[MAX_ADDR_LEN]; /*permanent hw address*/

1275 unsigned char addr_assign_type; /*hw address assignment type*/

1276 unsigned char addr_len; /*hardware address length*/

1289 struct kset *queues_kset;1386 int watchdog_timeo; /*used by dev_watchdog()*/

1480 };

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-372582-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值