欢迎来到天天文库
浏览记录
ID:38304699
大小:395.87 KB
页数:35页
时间:2019-06-08
《嵌入式Linux系统高级开发工程师》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式Linux系统高级开发讲义第四天日程嵌入式Linux网络子系统分析嵌入式Linux网卡驱动编写实例日程安排嵌入式Linux网络子系统分析ISO/OSI七层协议模型TCP/IP协议族TCP(TransmissionControlProtocol)传输控制协议,基于连接的服务UDP(UserDatagramProtocol)用户数据报协议,无连接的服务IP(InternetProtocol)Internet协议,信息传递机制OSI模型与TCP/IP协议的对比TCP或UDPIP和路由网卡驱动TelnetFTPWWW等消息包的逐层递增Linux网络协议栈分层系统调用接
2、口层协议无关的接口层,就是SOCKET层。(屏蔽底层的不同协议,以便与系统调用层之间的接口可以简单,统一)网络协议实现层(IP,ICMP,ARP,RARP,TCP,UDP等)与具体设备无关的驱动接口层驱动程序层日程安排嵌入式Linux网卡驱动编写网络设备驱动程序简介device数据结构sk_buff数据结构内核的驱动程序接口以太网控制器sk_buff结构一个sk_buff代表着一个网络报文。既包含报文的数据,也包含报文的控制信息。structsk_buff{structnet_device*dev;//接收和发送sk_buff的设备union{}h;//h,nh,m
3、ac等指向sk_buff中各层报文头unsignedchar*head,*data,*tail,*end;//head和tail指向已分配空间的开头和结尾,data和tail分别是有效数据的开头与结尾。……}sk_buff分配与释放分配:structsk_buff*alloc_skb(unsignedintsize,intgfp_mask)克隆:structsk_buff*skb_clone(structsk_buff*skb,intgfp_mask)释放:voidkfree_skb(structsk_buff*skb)sk_buff的操作函数在sk_buff缓冲区
4、的尾部添加数据。unsignedchar*skb_put(structsk_buff*skb,unsignedintlen)在sk_buff缓冲区的头部添加数据。unsignedchar*skb_push(structsk_buff*skb,unsignedintlen)在填充sk_buff缓冲区前保留报文头空间。voidskb_reserve(structsk_buff*skb,unsignedintlen)从数据包头中删除数据。如剥离报文硬件头部。unsignedchar*skb_pull(structsk_buff*skb,intlen)编写网络驱动程序发送和
5、接收这是一个网络设备最基本的功能如一块网卡所做的无非就是收发工作。所以驱动程序里要告诉系统发送函数在哪里,系统在有数据要发送时就会调用发送程序。驱动程序由于是直接操纵硬件的,所以网络硬件有数据收到,最先能得到这个数据的也就是驱动程序,它负责把这些原始数据进行必要的处理,然后送给系统。这里,操作系统必须要提供两个机制:找到驱动程序的发送函数驱动程序把收到的数据送给系统net_device结构成员一个net_device,表示一个网络设备。structnet_device{charname[IFNAMSIZE];//设备名称ulongbase_addr;//网络接口的I
6、/O基地址ucharirq;//中断号ushorthard_header_len;//硬件头的长度(14)charaddr_len;//MAC地址长度chardev_addr[]//设备的硬件MAC地址ushortflags;//接口标志。可以设置网络设备为混杂模式,组播模式,回环设备,UP状态标志,不执行ARP等等。网络设备的各种操作方法……}net_device常用方法成员初始化:int(*init)(structnet_device*dev)打开接口:int(*open)(structnet_device*);停止接口:int(*stop)(structnet
7、_device*);数据发送:int(*hard_start_xmit)(structsk_buff*skb,structnet_device*);建立硬件头:int(*hard_header)(…..)获取统计信息:网络设备驱动注册分配net_device:structnet_device*alloc_netdev(intsizeof_priv,char*name,void(*setup)(structnet_device*));net_device初始化给net_device结构的成员赋值注册net_device:register_netdev(struct
此文档下载收益归作者所有