- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高性能网络IO框架-netmap源码分析
高性能网络I/O框架-netmap源码分析(1)
作者:gfree.wind@博客: 微博:/glinuxerQQ技术群:4367710
前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西。其设计思想与业界不谋而合——因为为了提高性能,几个性能瓶颈放在那里,解决方法自然也是类似的。
由于保密性,我是不可能拿公司的设计来和大家讨论和分享的。而netmap的出现,提供了这么一个好机会。它既实现了一个高性能的网络I/O框架,代码量又不算大,非常适合学习和研究。
netmap简单介绍
首先要感谢netmap的作者,创造出了netmap并无私的分享了他的设计和代码。netmap的文档写得很不错,这里我简单说明一下为什么netmap可以达到高性能。1. 利用mmap,将网卡驱动的ring内存空间映射到用户空间。这样用户态可以直接访问到原始的数据包,避免了内核和用户态的两次拷贝;——前两天我还想写这么一个东西呢。2. 利用预先分配的固定大小的buff来保存数据包。这样减少了内核原有的动态分配;——对于网络设备来说,固定大小的内存池比buddy要有效的多。之前我跟Bean_lee也提过此事呵。3. 批量处理数据包。这样就减少了系统调用;
更具体的内容,大家直接去netmap的官方网站上看吧,写得很详细。虽然英文,大家还是耐着性子好好看看,收获良多。
netmap的源码分析
从上面netmap的简单介绍中可以看到,netmap不可避免的要修改网卡驱动。不过这个修改量很小。
驱动的修改
下面我以e1000.c为例来分析。由于netmap最早是在FreeBSD上实现的,为了在linux达到最小的修改,使用了大量的宏,这给代码的阅读带来了一些困难。
e1000_probe的修改
俺不是写驱动的。。。e1000_probe里面很多代码看不明白,但是不影响我们对netmap的分析。通过netmap的patch,知道是在e1000完成一系列硬件初始化以后,并注册成功,这时调用e1000_netmap_attach
@@ -1175,6 +1183,10 @@ static int __devinit e1000_probe(struct
if (err)
goto err_register;
+#ifdef DEV_NETMAP
+ e1000_netmap_attach(adapter);
+#endif /* DEV_NETMAP */
+
/* print bus type/speed/width info */
e_info(probe, (PCI%s:%dMHz:%d-bit) %pM\n,
((hw-bus_type == e1000_bus_type_pcix) ? -X : ),
下面是e1000_netmap_attach的代码
static void
e1000_netmap_attach(struct SOFTC_T *adapter)
{
struct netmap_adapter na;
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 = e1000_netmap_reg;
na.nm_txsync = e1000_netmap_txsync;
na.nm_rxsync = e1000_netmap_rxsync;
netmap_attach(na, 1);
}
SOFTC_T是一个宏定义,对于e1000,实际上是e1000_adapter,即e1000网卡驱动对应的private data。 下面是struct netmap_adapter的定义
/*
* This struct extends the struct adapter (or
* equivalent) device descriptor. It contains all fields needed to
* support netmap operation.
*/
struct netmap_adapter {
/*
* On linux we do not have a good way to tell if an interface
* is netmap-capable. So we use the f
您可能关注的文档
最近下载
- 《基于核心素养的初中语文“活动·探究”单元整体教学设计研究》课题研究方案.doc
- 四年级上册数学第二单元《练习三》教学课件(苏教版).pptx
- (最新)24年秋统编四年级语文上册习作:我的家人(精品课件).pptx
- 货币政策与财政政策配合的中国实践及经验.docx VIP
- 三年高考2024-2025高考地理真题分项汇编地球上的大气含解析.pdf VIP
- 经典诗文诵读技巧.ppt
- 五星级酒店功能区与面积配置(推荐保存).pdf
- 2024年山东省济南市莱芜区中考一模语文试卷(含解析).pdf VIP
- 2023版建筑三类人员a证题库含答案全考点.docx
- (人教版2024)物理八年级上册第二单元 声现象 大单元教学设计.docx
文档评论(0)