qian奇岸微信二维码 如您需要快速报价 请加技术经理微信 服务热线
13501992972
"MENU"
首页 > 开发知识 > 正文

C/C Linux服务器开发设计/后台管理系统架构师零声文化

奇岸开发
ahqian.com
11/04/2022
wechat

无需加好友免费技术支持

前几日听朋友提及这个netmap,看过它详细介绍与设计,确实是一件好事。它设计理念和行业如出一辙——由于为了能提升性能,几个性能瓶颈,解决方法自然也是相近的。

netmap它完成了一个性能卓越网络的I/O架构,代码量并不大,特别适合学习与科学研究。

视频推荐

150行代码打开tcp协议的章节目录|udp协议、netmap基本原理、mmap基本原理、软性二维数组、tcp协议

从netmap到dpdk,应用系统从硬件配置搭建到tcp协议有四个维度

学习培训详细地址:C/C Linux服务器开发设计/后台管理系统架构师零声文化教育-学习培训教程视频-百度传课

最先要感谢netmap创作者,写作netmap并毫无保留地分享他设计和代码。netmap文档写得很好,在这里我简易解释一下为什么netmap可以达到性能卓越。

1. 运用mmap,推动网口ring运行内存空间映射到用户空间。那样,用户状态能够直接访问初始数据文件,防止内核和用户状态的2次拷贝——两天前我想写这样的东西。

2. 应用预分配固定的规格buff储存数据文件。这降低了关键原始的动态分配——针对计算机设备,固定不动大小的小内存池比buddy要合理的多。我之前跟着。Bean_lee也提到了这件事情。

3. 批量处理数据文件。这降低了系统软件调用;

更准确内容,大伙儿直接到netmap朋友网,写得很详尽。虽然英语,但我们还是细心漂亮,收获很多。

从上述netmap在介绍中可以看出,netmap改动无线驱动是在所难免的。可是改动量不大。

驱动改动

下面我就以e1000.c比如分析netmap最开始要在FreeBSD为了能在linux降到最低改动,应用了很多的宏,给代码阅读的增添了一些艰难。

e1000_probe的改动 我并不写推动。。e1000_probe许多代码不明白,并不影响我们自己的了解netmap分析netmap的patch,知道这是在e1000年进行一系列硬件配置复位最终成功注册认证,这时调用e1000_netmap_attach

下边是e1000_netmap_attach的代码

SOFTC_T是宏定义,对e1000,事实上是e1000_adapter,即e1000无线驱动相对应的private data。 下边是struct netmap_adapter的界定

从struct netmap_adapter能够得知,netmap注解非常详尽。所以后面,我不会再列举了netmap你可以自己查询结构的概念,以防充斥着代码。有多少个企业可以做到这种注解?

文章内容褔利必须C/C Linux服务器系统架构师学习材料进群(材料包含)C/C ,Linux,golang技术性,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体播放,CDN,P2P,K8S,Docker,TCP/IP,协同程序,DPDK,ffmpeg,大型厂面试问题 等)

e1000_netmap_attach简单复位工作中结束后,调用netmap_attach实行真真正正的attach工作。前面一种进行与实际推动相关专项attach工作或前期准备工作,第二种是真正的attach。

进行了netmap_attach,e1000的probe函数e1000_probe即实行进行。

前边e1000_probe依照Linux推动架构,动架构e1000_open。netmap并没对e1000_open一切改动都更改了e1000_configure,其能被e1000_open及e1000_up调用。

遵照惯例,先看diff文件

从diff能够看见文档,netmap取代它的的e1000申请办理ring buffer代码e1000_netmap_init_buffers取得成功回到,e1000_configure立即撤出。

下面进到e1000_netmap_init_buffers:

进入netmap_rx_irq, int netmaprxirq(struct ifnet *ifp, int q, int *workdone) { struct netmapadapter *na; struct netmap_kring *r; NMSELINFOT *main_wq;

假如推送的部分改动类似接受,则不容易反复。

逐渐进入netmap关键代码。一切从init逐渐。。。

Linux条件下,netmap由动态性控制模块载入linuxnetmapinit调用netmap_init。

netmap现在有2套内存分配管理方法代码,一套是netmapmem1.c,另一个是netmapmem2.c。第二种是默认设置所使用的。

进到内存池申请函数公式-这是netmap中长款函数公式。

netmapnewobj_allocator分析完毕netmap代码优化依然依照事情主线开展分析,而非集中化一部分。

下一步便是从netmap应用,由上而下学习培训分析netmap的代码了。

netmap网站提出了一个典型的例子——简洁明了,事实上也包含了netmap调用架构。

大家还是一路走来,去哪里看。

这一其实和netmap没啥关系。还记得前边文章里的。netmap申请了一个misc机器设备netmap_cdevsw吗?

netmapcdevsw界定对应的机器设备结构,netmapfops相对应的实际操作函数公式。并没有自定open函数应当使用linux内核默认open——这就是我的猜想,临时没查linux代码了。

ioctl是内核的垃圾箱,任何东西都装进去,哪些都可以做。

进入netmap_ioctl,真真正正的netmap的ioctl处理函数

针对过程的清楚,针对netmap_ioctl这便是分析的相关内容。依然遵照之前的应用全过程。

说到这里我发现了netmap网站得出的事例该是老古董。netmap上面的事例根本无法应用现阶段的代码。但是,木材已经成为了一艘船。你能了解这个案例的。庆幸的是,全过程没有多大转变。

因为实例代码不可信,请遵照ioctl分析鼓励的指令次序netmap吧。

用以回到netmap的基本资料

将特定网卡设置为netmap模式

分析完后NIOCGINFO和NIOCREGIF2个,剩下来的非常简单。下面是netmap_ioctl调用的函数公式

这俩应用同样的代码。

到这里,netmap_ioctl进行分析学习培训。

netmap_ioctl分析后,依据netmap以下属于实例分析netmap的mmap的完成了。

上文讲过netmap会建立机器设备

netmap_fops界定了netmap机器设备适用实际操作

OK,我们现在寻找了mmap的通道,linuxnetmapmmap。

直接进入入linux_netmap_mmap的代码

将netmap内核状内存映射到用户空间后,netmap的实例根据offset得到对应的网口netmap结构。

在这样的情况下,应用ioctl,获得req.nroffset是ix0网口的netmap结构偏位-清晰地说,netmap管理网口结构内存池的偏位。mmap后,mem是netmap内存映射,网口结构内存是运行内存的第一项,所以mem也可以看作netmap管理网口结构内存池的起始地址。因此,用前边的req.nroffset,就得到了ix0的netmap结构,即struct netmap_if。

依照netmap事例,将进入netmap真真正正的工作代码。

热度404

了解更多C/C Linux服务器开发设计/后台管理系统架构师零声文化欢迎联系奇岸开发客服。

奇岸开发可定制企业官网小程序、小程序商城、餐饮外卖小程序、预约小程序、多门店小程序、分销小程序及个人小程序。

微信二维码

微信长按识别或扫一扫,无需加好友直接咨询,企业网站开发、网站托管维护、企业管理系统开发、微信小程序制作、域名主机、网站备案、网站改版等提供专业技术解答。

精彩推荐

猜你喜欢