1以太网接口驱动程序设计2以太网接口的基本知识1、传输编码:曼彻斯特编码&差分曼彻斯特编码3以太网协议z以太网的物理传输帧(IEEE802.3)PRSDDASATYPEDATAPADFCS56位8位48位48位16位不超过1500字节可选32位PR:同步位,收发双方的时钟同步,也指明传输的速率(10M、100M)SD:分隔位,表示下面跟着的是真正的数据,而不是同步时钟DA:目的地址,以太网的地址为48位地址。如果为都为F,则是广播地址SA:源地址,48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址TYPE:类型字段,表明该帧的数据是什么类型的数据。如:0800H表示数据为IP包DATA:数据段,该段数据不能超过1500字节。PAD:填充位。以太网帧传输的数据包最小不能小于60字节,当数据段不足46字节时,后面补000000.....(当然也可以补其它值)FCS:32位CRC数据校验位。该校验由网卡自动完成4以太网的应用zPR,SD,PAD,FCS这几个数据段是由网卡自动产生的;只需要理解DA、SA、TYPE、DATA四个段的内容z所有数据位的传输由低位开始(传输的位流使用曼彻斯特编码)z以太网的冲突退避算法是由硬件自动执行的zDA+SA+TYPE+DATA+PAD最小为60字节,最大为1514字节z以太网卡可以接收三种地址的数据,一个是广播地位,一个是多播地址(在嵌入式的环境中一般不用),一个是它自已的地址z任何两个网卡的物理地址都是不一样的,是世界上唯一的,网卡地址由专门机构分配。5嵌入式的以太网方案z嵌入式处理器+网卡芯片(MAC+PHY)z对嵌入式处理器没有特殊要求,通用性强z处理器和网络数据交换通过外部总线,速度慢,不适合于高速网络z带有以太网络接口的嵌入式处理器z处理器面向网络应用,集成MAC控制器z处理器和网络数据交换通过内部总线,速度快6集成了MAC控制器的ARM和PHY芯片的连接710BaseT的连接方式8TCP/IP协议的层次应用层(Application)BSD套接字(BSDSockets)传输层(Transport)TCP、UDP网络层(Network)IP、ARP、ICMP、IGMP数据链路层(DataLink)IEEE802.3EthernetMAC物理层(Physical)9嵌入式以太网中主要处理的协议zARP(AddressResolationProtocol)地址解析协议zICMP(InternetControlMessagesProtocol)网络控制报文协议zIP(InternetProtocol)网际协议zTCP(TransferControlProtocol)传输控制协议zUDP(UserDatagramProtocol)用户数据报协议10ARP协议z网络层用32bit的IP地址来标识不同的主机,而链路层使用48bit的物理(MAC)地址来标识不同的以太网接口。只知道目的主机的IP地址并不能发送数据帧给它,必须知道目的主机网络接口的MAC地址才能发送数据帧。zARP的功能是实现从IP地址到对应物理地址的转换。源主机发送一份包含目的主机IP地址的ARP请求数据帧给网上的每个主机,称作ARP广播,目的主机的ARP收到这份广播报文后,识别出这是发送端在寻问它的IP地址,于是发送一个包含目的主机IP地址及对应的MAC地址的ARP回答给源主机。z每台主机上都有一个ARP高速缓存,存放最近的IP地址到硬件地址之间的映射记录。通常每一项的生存时间为20分钟11ICMP协议zIP层的附属协议,IP层用它来与其他主机或路由器交换错误报文和其他重要控制信息。zICMP报文是在IP数据报内部被传输的。z两个实用的网络诊断工具,Ping和Traceroute(Tracert),都是利用该协议工作的。12IP协议zIP工作在网络层,是TCP/IP协议族中最为核心的协议。所有的TCP,UDP,ICMP以及IGMP数据都以IP数据报格式传输。zIP数据报最长可达65535字节,其中报头占32bit的数目。包含各32bit的源IP地址和目的IP地址。在嵌入式应用中,简化设计,IP数据报长度等于数据链路层的数据长度。13TCP协议zTCP是一个面向连接的可靠的传输层协议。TCP为两台主机提供高可靠性的端到端数据通信。主要包括:z发送方把应用程序交给它的数据分成合适的小块,并添加附加信息(TCP头),包括顺序号,源、目的端口,控制、纠错信息等字段,称为TCP数据报。并将TCP数据报交给下面的网络层处理。z接受方确认接收到的TCP数据报,重组并将数据送往高层。14UDP协议zUDP是一种无连接不可靠的传输层协议。z把应用程序传来的数据加上UDP头(包括端口号,段长等字段),作为UDP数据报发送出去,但是并不保证它们能到达目的地。可靠性由应用层来提供。就象发送一封写有地址的一般信件,却不保证它能到达。15Linux网络驱动程序体系结构16Linux系统内核的网络设备结构z结构体structnet_device来表示网络设备在内核中的运行情况z所有的网络设备都是通过以dev_base为头指针的设备链表来管理的zdev_base在内核源码的drivers/net/space.c文件中被定义:zstructnet_device*dev_base=&loopback_dev;z设备链表的定义与初始化z内核中的网络设备的初始化是通过net_dev_init函数实现的zdrivers/block/genhd.c中有的device_init函数的定义z网络设备的模块加载,通过register_netdevice(net/core/dev.c)注册17DM9000A网卡在UP-2410CL的硬件原理图18DM9000A兼容的网卡驱动程序分析zLinux内核中DM9000A设备驱动程序是drivers/net/dm9000.czDM9000A网卡的检测在drivers/net/dm9000.c的*_probe函数z可以在*_probe函数中,为特定的平台分配资源备注:解压内核源码包后,在相应目录下分析DM9000A网卡驱动程序19网络的应用与测试zcat/proc/net/devzifconfigeth0192.168.0.111zrouteadd-netdefaultgw192.168.0.254netmask0.0.0.0z/etc/resolv.conf:nameserver202.106.196.11520网络数据抓包软件的使用