资源描述:
《dma 网卡零拷贝实现的设计与》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Intel82571零拷贝的设计与实现本文主要阐述基于Intel网卡零拷贝的实现过程,通常情况下网络数据包到达用户应用程序要经过如下几个过程:1.网卡的物理硬件从物理媒体(通常情况下网线)上接收到得信号(数据帧)首先放在网卡自己的一个缓冲区(网卡RAM),在这一过程中通常要进行帧校验(比如FCS),帧过滤等。2.如果网卡支持DMA就会启动DMA操作,把收到的数据帧通过DMA操作放到我们事先申请好的buffer中,DMA操作由硬件自动完成,当然用户要提供给DMA硬件操作必要的参数,包括DMA地址,DMA大小等,有可能还有地
2、址对齐等要求。DMA的具体操作后面详细描述。3.这一步是DMA零拷贝最重要的一个环节,就是把网卡接收到的数据帧直接映射到用户层,不需要经过内核协议栈的处理。后面详细描述。网卡数据从网络到Linux内核的路径简要分析:网卡的主要工作原理:发送数据时,计算机把要传输的数据并行写到网卡的缓存,网卡对要传输的数据进编码(10M以太网使用曼切斯特码,100M以太网使用差分曼切斯特码),串行发到传输介质上.接收数据时,则相反。对于网卡而言,每块网卡都有一个唯一的网络节点地址,它是网卡生产厂家在生产时烧入ROM(只读存储芯片)中的,我
3、们把它叫做MAC地址(物理地址),且保证绝对不会重复。MAC为48bit,前24比特由IEEE分配,是需要钱买的,后24bit由网卡生产厂家自行分配.我们日常使用的网卡都是以太网网卡。目前网卡按其传输速度来分可分为10M网卡、10/100M自适应网卡以及千兆(1000M)网卡。如果只是作为一般用途,如日常办公等,比较适合使用10M网卡和10/100M自适应网卡两种。如果应用于服务器等产品领域,就要选择千兆级及更高级别的网卡。本文主要讲解的是Intel82571千兆网卡的网卡驱动:Linux内核目录:linux-3.4.7
4、/drivers/net/ethernet/intel/e1000e关于这款网卡的硬件信息:更详细的信息可以通过lspci-vvv查看。从上面的信息可以看出这块网卡是基于pci总线的。数据接收流程图:Init_timere1000_sw_initpci_register_driver(&e1000_driver);netif_napi_addalloc_etherdevE1000_probe开始INIT_WORK(&adapter->reset_task,e1000_reset_task);INIT_WORK(&adap
5、ter->watchdog_task,e1000_watchdog_task);INIT_WORK(&adapter->downshift_task,e1000e_downshift_workaround);INIT_WORK(&adapter->update_phy_task,e1000e_update_phy_task);INIT_WORK(&adapter->print_hang_task,e1000_print_hw_hang);大概的流程框架就是这个样子的了,现在一边对照源码一边解析相关的功能。e1000_in
6、it_module函数是整个网卡驱动的入口点,在这个函数中主要做的事情是调用pci_register_driver函数向PCI子系统注册相关的回调函数当模块加载的时候(也就是执行insmodmodname.ko)会去调用相关的函数。我们看看e1000_driver这个变量:当执行完网卡注册,然后加载网卡驱动的时候首先执行的是e1000_probe函数,在这个函数中主要完成了:网卡模式的设置,DMA主从设备的设置,网卡私有数据的分配,中断处理函数的注册,NAPI的设置,存放网卡数据帧的相关接收环,DMABD结构的初始化,P
7、CI资源的映射,网卡参数的检测,MAC,PHY,NVM相关操作的回调函数的初始化,看门狗,硬件复位等相关的初始化。下面来看看e1000_probe函数,由于这个函数比较长我们分段讲解:上面的代码主要完成了设置网卡支持DMA模式,由于有些网卡硬件必须在某些地址对齐的地方才能够执行DMA操作,dma_set_mask就是这个作用。继续往下:Pci_save_state,保存PCI配置空间相关信息,alloc_ethernetdev分配网卡私有数据;得到设备的中断号保存在netdev->irq中。由与我们操作网卡相关的寄存器是
8、通过把网卡相关的寄存器映射到内核内存空间,然后通过偏移量就可以设置,清除相关的硬件寄存器。下面几行代码就是把网卡寄存器空间映射到内核空间便于操作。Mmio_stat为网卡的配置空间的起始地址【以网卡为中心看到的地址】,mmio_len为长度。Ioremap的主要作用是要把网卡的配置空间的资源映射到内核空间【以CPU为