看一片论文,最近看关于网卡DMA的知识,但是看了这论文我感觉很不舒服,总觉得他哪里写的不对,可是我刚了解这方面,又说不出他错在哪里,也许是我才疏学浅,没领悟其中的道理,望高人指教
******************************************************
论文题目:基于DMA 实现高速数据包收发
由于网卡驱动程序运
行在内核空间, 当网卡收到数据包以后, 数据包会存放在内核
空间内, 由于上层应用运行在用户空间, 无法直接访问内核空
间, 因此要通过系统调用将网卡中的数据包拷贝到用户程序空
间。图1 右侧是改进后的数据包处理方式, 通过重写网卡驱
动, 使用DMA 技术, 使得网卡驱动与上层系统共享一块内存
区域, 网卡从网络上捕获到的数据包直接DMA 至网络监测系
统, 这个过程避免了数据的内存拷贝, 不需要占用CPU资源,
最大程度地将CPU资源让给协议分析和模式匹配等进程去利
用, 提高了整体性能。零拷贝解决“抓包”的瓶颈问题, 提高网
络处理器的数据包处理能力。上层信息的发送过程如图2 所
示。
********************************************************
------解决方案--------------------
论文中说的没有问题啊,正常的网口数据是这样传递上来的(以以太网UDP包为例)。
网口芯片收到数据 --> 最底层网口驱动读入以太网数据包 --> 传递给TCP/IP进行层次解析 --> 解析出UDP包,缓存在一个缓冲链中;如果该端口已经打开,则会根据设置通知应用空间内打开该端口的应用程序读UDP数据;如果该端口没打开,数据丢掉。--> ... ---> 收到应用空间的读取UDP包的消息,将数据链中发往改端口的数据拷贝到消息指定的用户空间的内存中。
以上程序都是在内核空间运行的。
应用空间内的应用程序收到改消息后--> 调用read函数读出UDP数据,其实就是指定一块用户空间的内存,告诉内核你不是有数据要给我吗,你又不让我看你家(内核空间)的屋里有什么,那就考给我吧。
一般情况下,内核空间的地址应用程序是不能直接看到的,只能通过API函数接口传递消息告诉内核我要什么药什么,你给不给看着办。内核决定用户空间传递过来的请求消息是否过分了,初步处理。而且由于从网口收到的数据是一层一层传递上来的,为保证安全性,每次传递和处理过程都要重新拷贝一份,而且附加着一大堆判断和处理。
论文中这种方法呢就是,就是重新最底层的驱动程序,这个驱动程序指定了一块内核空间,这块空间内的东西应用层可以直接以地址的形式访问到。当应用程序启动后,向内核的这个驱动程序发送一个消息,驱动程序就把这块空间映射在用户空间的地址传递给应用程序。然后网口收到数据就存到这个空间去。应用程序呢就直接访问这个空间看有没有数据包。这样就省去了中间步骤。由抓包软件直接处理收到的以太网包。
大致就是这么个意思,至于DMA么,就是最底层的驱动程序是以DMA的方式将数据收到这块共享的内存空间的。
------解决方案--------------------
1L的说法没有什么错误,但是他没有说清,是如何实现内核与应用程序是如何实现内存共享的。
实际上,需要将内核空间的内存映射到用户空间,应用程序才能够访问到这块内存。