欢迎来到天天文库
浏览记录
ID:10849971
大小:140.50 KB
页数:0页
时间:2018-07-08
《高性能网络io框架netmap源码分析概要1》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、高性能网络I/O框架-netmap源码分析(1)作者:gfree.wind@gmail.com博客:blog.focus-linux.netlinuxfocus.blog.chinaunix.net微博:weibo.com/glinuxerQQ技术群:4367710前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西。其设计思想与业界不谋而合——因为为了提高性能,几个性能瓶颈放在那里,解决方法自然也是类似的。由于保密性,我是不可能拿公司的设计来和大家讨论和分享的。而netmap的出现,提供了这么一个好机会。它既实现了一个高性能的网络I/O框架,代码量又不
2、算大,非常适合学习和研究。netmap简单介绍首先要感谢netmap的作者,创造出了netmap并无私的分享了他的设计和代码。netmap的文档写得很不错,这里我简单说明一下为什么netmap可以达到高性能。1.利用mmap,将网卡驱动的ring内存空间映射到用户空间。这样用户态可以直接访问到原始的数据包,避免了内核和用户态的两次拷贝;——前两天我还想写这么一个东西呢。2.利用预先分配的固定大小的buff来保存数据包。这样减少了内核原有的动态分配;——对于网络设备来说,固定大小的内存池比buddy要有效的多。之前我跟Bean_lee也提过此事呵。3.批量处理数据包。这样就减
3、少了系统调用;更具体的内容,大家直接去netmap的官方网站上看吧,写得很详细。虽然英文,大家还是耐着性子好好看看,收获良多。netmap的源码分析从上面netmap的简单介绍中可以看到,netmap不可避免的要修改网卡驱动。不过这个修改量很小。驱动的修改下面我以e1000.c为例来分析。由于netmap最早是在FreeBSD上实现的,为了在linux达到最小的修改,使用了大量的宏,这给代码的阅读带来了一些困难。e1000_probe的修改俺不是写驱动的。。。e1000_probe里面很多代码看不明白,但是不影响我们对netmap的分析。通过netmap的patch,知道是
4、在e1000完成一系列硬件初始化以后,并注册成功,这时调用e1000_netmap_attach@@-1175,6+1183,10@@staticint__devinite1000_probe(structif(err)gotoerr_register;+#ifdefDEV_NETMAP+e1000_netmap_attach(adapter);+#endif/*DEV_NETMAP*/+/*printbustype/speed/widthinfo*/e_info(probe,"(PCI%s:%dMHz:%d-bit)%pM",((hw->bus_type==e1000
5、_bus_type_pcix)?"-X":""),下面是e1000_netmap_attach的代码staticvoide1000_netmap_attach(structSOFTC_T*adapter){structnetmap_adapterna;bzero(&na,sizeof(na));na.ifp=adapter->netdev;na.separate_locks=0;na.num_tx_desc=adapter->tx_ring[0].count;na.num_rx_desc=adapter->rx_ring[0].count;na.nm_register=e1
6、000_netmap_reg;na.nm_txsync=e1000_netmap_txsync;na.nm_rxsync=e1000_netmap_rxsync;netmap_attach(&na,1);}SOFTC_T是一个宏定义,对于e1000,实际上是e1000_adapter,即e1000网卡驱动对应的privatedata。下面是structnetmap_adapter的定义/**Thisstructextendsthe'structadapter'(or*equivalent)devicedescriptor.Itcontainsallfieldsneededt
7、o*supportnetmapoperation.*/structnetmap_adapter{/**Onlinuxwedonothaveagoodwaytotellifaninterface*isnetmap-capable.Soweusethefollowingtrick:*NA(ifp)pointshere,andthefirstentry(whichhopefully*alwaysexistsandisatleast32bits)containsamagic*valuewhichwecanusetodete
此文档下载收益归作者所有