1 / 5
文档名称:

DMA网卡零拷贝实现的设计与.docx

格式:docx   大小:776KB   页数:5页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

DMA网卡零拷贝实现的设计与.docx

上传人:wz_198613 2021/12/23 文件大小:776 KB

下载得到文件列表

DMA网卡零拷贝实现的设计与.docx

相关文档

文档介绍

文档介绍:本文主要阐述基于Intel网卡零拷贝的实现过程, 通常情况下网络数据包到达用户应用程序要经过如下几个过程:
网卡的物理硬件从物理媒体(通常情况下网线)上接收到得信号(数据帧)首先放在网卡自己的一个缓冲区(网卡RAM),在这一过程中通常要进行帧校验(比如FCS), 帧过滤等。
如果网卡支持DMA就会启动DMA操作,把收到的数据帧通过DMA操作放到我们事先申请好的buffer中,DMA操作由硬件自动完成,当然用户要提供给DMA硬件操作必要的参数,包括DMA地址,DMA大小等,有可能还有地址对齐等要求。
DMA的具体操作后面详细描述。
这一步是DMA零拷贝最重要的一个环节,就是把网卡接收到的数据帧直接映射到用户层,不需要经过内核协议栈的处理。后面详细描述。
网卡数据从网络到Linux内核的路径简要分析:
网卡的主要工作原理:发送数据时,计算机把要传输的数据并行写到网卡的缓存,网卡对要传输的数据进编码(10M以太网使用曼切斯特码,100M以太网使用差分曼切斯特码),,则相反。对于网卡而言,每块网卡都有一个唯一的网络节点地址,它是网卡生产厂家在生产时烧入ROM(只读存储芯片)中的,我们把它叫做MAC地址(物理地址),且保证绝对不会重复。MAC为48bit,前24比特由IEEE分配,是需要钱买的,后24bit由网卡生产厂家自行分配.
我们日常使用的网卡都是以太网网卡。目前网卡按其传输速度来分可分为10M网卡、10/100M自适应网卡以及千兆(1000M)网卡。如果只是作为一般用途,如日常办公等,比较适合使用10M网卡和10/100M自适应网卡两种。如果应用于服务器等产品领域,就要选择千兆级及更高级别的网卡。
本文主要讲解的是Intel 82571 千兆网卡的网卡驱动:
Linux 内核目录:
关于这款网卡的硬件信息:
更详细的信息可以通过 lspci -vvv查看。
从上面的信息可以看出这块网卡是基于pci总线的。
数据接收流程图:
Init_timer
e1000_sw_init
pci_register_driver(&e1000_driver);
netif_napi_add
alloc_etherdev
E1000_probe
开始
INIT_WORK(&adapter->reset_task, e1000_reset_task);
INIT_WORK(&adapter->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_init_module函数是整个网卡驱动的入口点,在这个函数中主要做的事情是调用
pci_register_driver函数向PCI子系统注册相关的回调函数当模