在上一期中,我们介绍了Linux内核编程环境,在这一期中,我们将通过实例来介绍怎么剖析Linux内核的补丁。
一、Linux内核补丁
在“Linux内核发展史”中,我们简略介绍了Linux内核发展中各个版本的主要更新内容。内核的更新主要是通过补丁(patch)来实现的linux软件工程师,社区开发人员向内核代码的git库房递交补丁文件,补丁文件中包含了对内核代码的降低、删除和更改情况,记录了内核更新的历史信息。有许多新特点和新功能都是通过补丁文件而添加的。以Linux4.19版内核为例,在“Linux发展史”一节中我们谈到,Linux4.19版内核的主要新特点有:
降低CAKEnetworkqueuemanagement功能,这项更新主要用于解决家庭网段性能问题;
保证cGroup的最小I/O延后;
对未来Wi-Fi6(802.11ax-drafts)的实验性支持;
改进overlayfs的显存使用;
实验性文件系统EROFS的优化;
一个新的异步I/O寻址插口;
支持一个intel特点,可以为应用锁定部份CPU缓存;
其他安全和驱动特点。
有关Linux内核4.19版本更新的详尽信息,可以在相关网站[1](见文末参考文献)中找到。该网站列出了Linux内核2.5.1版本至今的主要更新历史,而且还在持续更新,比如对于Linux内核4.x我们可以看见:
步入Linux4.19以后,我们还能见到Linux4.19版所具有的新特点,对于每一个特点都有补丁代码和文档的介绍。以第一个主要特点为例linux网络内核分析与开发,这个特点主要介绍了一个叫CAKE(CommonApplicationsKeptEnhanced)的综合队列管理系统,这个系统主要用于提高家庭网段的性能,解决网路边沿的bufferbloat问题,在该网站[1]中,我们可以见到对于CAKE的特点有如下详尽介绍:
从上图可以看出,特点介绍的内容包含了一个对于该特点的简介、对于CAKE的介绍文献(包括一篇已发表的论文)和补丁文件的代码(Code项)。假如读者不清楚bufferbloat的含意,可以点击红色的bufferbloat关键字,于是我们了解到:bufferbloat是指因为路由器或其他网路设备缓存了过多的数据,因而形成了用户不期望的延后。为解决这一问题,CAKE和它之前的解决方案主要是从队列管理入手的,这种方案被广泛用于数百万台计算机上,并将困局链路上因为竞争引起的延后增加到了20ms的量级(由此我们可以看出,被广泛应用的开源项目中所暗含的创新力量)。
从论文和其他介绍文档中我们可以看出linux网络内核分析与开发,CAKE这个系统主要包含以下几层:
Shaper:使用一个虚拟时钟来调整包的传输时机(是否延后传输),进而实现bandwidthshaping。
PriorityQueue:设置了四个传输类,每一类设置了不同的带宽下界值。假如一个传输类使用的带宽超过了其规定的带宽下界,这么该传输类的优先级都会被降级。
FlowIsolation:主要功能是用hash函数将不同的包分配给不同的队列,而且选择一个队列来服务。CAKE的创新点在于使用了一个8路组相联的hash函数来替代fq_codel中原有的plainhashfunction,进而解决了原hash函数可能会有的“生日问题”,即当表项占用超过表大小的平方根时hash冲突的机率可能达到50%。
ActiveQueueManagement:CAKE更改了原先的CoDelAQM框架,提高了性能。
PacketManagement:不仅以上四个主要层之外对队列和包处理的其它功能。
到这一步为止ubuntu linux,我们可以对Linux4.19内核的CAKE特点有一个初步的了解,而且这个了解是浅层的,还不涉及源码,并且[1]中并没有提供常年维护版本实时更新的所有补丁文件。
二、结语
本期我们通过一个实例介绍了一种Linux补丁文件更新的初步剖析方式,下一小节中,我们继续按照CAKE的实例来介绍补丁文件的源码剖析方式。