作者:罗宇哲,中国科学院软件研究所智能软件研究中心

在上一期中,我们通过CAKE系统的实例介绍了一种对Linux内核补丁的初步分析方法,这一期我们将继续通过CAKE系统的例子介绍一种对补丁文件源码的分析方法。

一、Linux内核补丁源码分析

在软件工程中,软件的数据流是对软件进行结构化分析的重要分析对象。结构化分析可以用于软件工程的需求分析阶段,用于产生符合用户需要的需求规格文档,其思想对我们分析内核源码也有启发意义。

在数据流的视角下,当信息在软件中移动时,它被一系列“变换”所修饰。通过对数据流的分析,我们可以得知数据从输入移动到输出的过程中所经受的变换。对数据流的分析可以是分层的,高层的数据流分析不关心对数据变换的具体实现形式,只关心输入输出的数据形式;而底层的数据流分析则可以将抽象的数据处理过程进一步具体化。

数据流的分析方法启发我们将操作系统模块源码分为两个部分,一部分为关键数据结构,另一部分为关键处理函数。关键数据结构是模块中包含关键的待处理信息的数据结构,它通过变换得到包含模块关键输出信息的新数据结构,或为关键处理函数实现其功能提供重要的辅助信息。关键处理函数是实现模块主要功能的函数,它通过调用实现其他子功能的函数来完成模块的主要功能。通过分析关键数据结构和关键处理函数,我们就能对模块的主要功能有一个基本的了解。

下面,我们以上一期提到的 CAKE 系统[1]中 ACK Filter 这一子功能为例,分析一下实现该功能的关键数据结构和关键处理函数。

通过 CAKE 相关的论文我们可以知道,当连接上的前向传输和 ACK 返回传输的能力不对称、且 ACK 返回传输通路的能力不足时,通过 TCP ACK Filtering 技术可以提升通路的性能。当队列中有携带更多有用数据的包时,这一技术可以监测队列情况,并舍弃一些不携带有用数据的 ACK,被舍弃的 ACK 被称为PURE ACK(我们可以检查新加入队列的包携带的 ACK 中的信息是否比将要过滤的包携带的ACK中的信息长度更长)。为了判断 ACK 所携带的信息,ACK Filter 会检查包的 TCP 头和 IP 头,以保证过滤不会导致信息丢失。

通过对 CAKE ACK Filter 子功能的分析,我们可以找到该功能的关键处理函数:

static struct sk_buff *cake_ack_filter(struct cake_sched_data *q, struct
cake_flow *flow)

该函数在net/sched/sch_cake.c,补丁为 CAKE 系统增加了 ACK Filter 功能,其函数代码较长,检查ACK队列进行过滤的部分代码如下:

该函数基于 cake_sched_data 结构体提供的辅助信息,来过滤 cake_flow 结构体中多余的 ACK。这里,cake_sched_data 和 cake_flow 为函数使用的关键数据结构,它们分别包含了过滤所用的辅助信息和待过滤的 ACK 队列元素。sk_buff 是 Linux 网络模块中最重要的数据结构之一,用于描述已接收或待发送的数据报文信息。

分析该函数的我们可以发现,该函数首先将 ACK 队列的末尾的 ACK 标记为 triggering,然后从头遍历 ACK 队列,寻找与该 triggering ACK 匹配的 PURE ACK 。该寻找过程是通过5个 if 判断实现的,这5个 if 判断比较了 triggering ACK 和待比较的 ACK 中携带的信息,从而确认待比较 ACK 是否为 PURE ACK。

我们可以将这个过程分为两个阶段,第一个阶段为信息处理阶段,该阶段分析 ACK 包的 TCP 头和 IP 头等,并提取出有用的信息。第二阶段为比较阶段,通过5个检查项来识别 PURE ACK。

对于第一个阶段,我们可以用以下函数调用图来分析:

从函数调用图我们可以看出,cake 的 ACK Filter 分别解析了 ACK 的 TCP 头和 IP 头的信息。对于 ACK 的过滤过程,我们可以考虑用流程图的方式来表示过滤算法:

其中检查项的主要内容依次为:

  1. 判断 ACK 的 IP 协议版本是否相同、TCP 头的源地址和目的地址是否相同;

  2. 判断 ACK 的 IP 头中源地址和目的地址是否相同;

  3. 检查候选 ACK 的 ECE/CWR 标志位与之前同一个流中已选中的 PURE ACK 的对应标志位是否相同;

  4. 检查 ACK 是否有 segment data、检查 ACK 是否有比 triggering packet 更高的 cumulative ACK Counter 值、检查 ACK 的 SEQNO 信息;

  5. 检查 SACK 选项。

注意在流程图中我们按if的判断条件给出了控制流的方向,而各个检查项在 if 条件中的具体表现形式可能与文字描述不同(主要是是否的关系问题)。

二、结语

本期我们通过CAKE系统中ACK Filter子功能的实例介绍了通过关键数据结构和关键处理函数分析源码的方法,并使用函数调用关系图和流程图分析了源码的具体实现形式。这两种图在我们以后的源码分析过程中将经常使用。下一期我们将尝试绘制Linux模块依赖关系图。

参考文献
[1]https://kernelnewbies.org/LinuxVersions

第十期-Linux内核补丁源码分析(2)相关推荐

  1. 【华为云技术分享】Linux内核补丁源码分析(1)

    在上一期中,我们介绍了Linux内核编程环境,在这一期中,我们将通过实例来介绍如何分析Linux内核的补丁. 一.Linux内核补丁 在"Linux内核发展史"中,我们简要介绍了L ...

  2. Linux PPP实现源码分析

    Linux PPP实现源码分析 作者:kwest <exboy@163.com>  版本:v0.7 ©所有版权保留 转载请保留作者署名,严禁用于商业用途 . 前言: PPP(Point t ...

  3. Linux PPP 实现源码分析

    nux PPP实现源码分析 2013-05-21 23:44  6091人阅读  评论(18)  收藏  举报   分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux ...

  4. linux网卡驱动源码分析(一)

    linux网卡驱动源码分析(一) linux struct linux内核 网络 descriptor resources 转自http://blog.csdn.net/ustc_dylan/arti ...

  5. linux打印源码,Linux打印机驱动源码分析.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsplinux/Unix相关 Linux打印机驱动源码分析.pdf1 ...

  6. Linux PPP实现源码分析-1

    前言: PPP(Point to Point Protocol)协议是一种广泛使用的数据链路层协议,在国内广泛使用的宽带拨号协议PPPoE其基础就是PPP协议,此外和PPP相关的协议PPTP,L2TP ...

  7. Linux kernel Namespace源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 学习一下linux kernel namespace的代码还是很有必要的,让你对docker容器的namespace隔离有更深 ...

  8. Linux kernel SPI源码分析之SPI设备驱动源码分析(linux kernel 5.18)

    SPI基础支持此处不再赘述,直接分析linux中的SPI驱动源码. 1.SPI设备驱动架构图 2.源码分析 本次分析基于kernel5.18,linux/drivers/spi/spidev.c 设备 ...

  9. Linux Thermal机制源码分析之Governor

    一.thermal_init() 在开始源码分析之前,需要先说明一下.Linux 内核代码庞大而复杂,如何 reading the Fxxking source code 相信是很多从事 Linux ...

最新文章

  1. 在iOS上使用ffmpeg播放视频
  2. linux查找以h结尾的文件,【linux_笔记】Linux_文件查找(find)详解特殊权限
  3. 如何制止OpenSSH漏洞?
  4. HDU2102 A计划
  5. jQuery加载一个html页面到指定的div里
  6. redis文档翻译_key设置过期时间
  7. google earth pro 64位_七彩虹秀精准刀工!iGame RTX 3060 Ti Advanced OC评测:烤机3小时64度...
  8. flutterapp部分手机无法打开_Flutter run无法在iPhone上打开应用,直接在iphone也无法打开...
  9. java类验证和装载顺序_Java类的加载机制和双亲委派模型
  10. 网页HTML5制作flex布局骰子,CSS3的Flexbox骰子布局的实现及分析
  11. 怎么修改某一软件的服务器,怎样设置一个软件服务器地址
  12. 修改springmvc返回ajax方式的json数据
  13. 清华寒门女孩毕业演讲刷爆网络:世界本不公平,努力是你唯一的路!
  14. java语言的入门开始介绍
  15. android packageManager用法
  16. 腾讯云推出“版权音乐助手”让音乐版权使用“按量付费“
  17. 【笔记】个人博客建立(域名选择、网站备案、公安联网备案、安全评估报告)
  18. 大咖面对面 | 喵奏@国家建筑师:梦回大宋,一起来做河里人
  19. Mysql 数据库(4)
  20. 如何实现脑肿瘤红黄绿分割展示

热门文章

  1. 基于matlab的gui设计与实现,毕业设计基于MATLAB GUI的数字图像处理的设计与实现(V2.1)...
  2. Duplicated tag: ‘mirrors‘ (position: START_TAG seen ...erred\r\n
  3. Java计算机毕业设计电影网站系统设计源码+系统+数据库+lw文档
  4. mysql 开启 slow log,mysql 5.5 开启慢日志slow log的方法(log_slow_queries)
  5. LVGL 8.2.0 CHART显示ECG数据
  6. 某公司高管疾呼:底层程序员离职率太高,有人入职不到半年就走!建议把恶意离职加入征信,让年轻人对公司有起码的尊重!...
  7. Attention Is All You Need读后感
  8. 时空弯曲是必须的吗?
  9. 徐无忌并发编程笔记:无锁机制CAS及其底层实现原理?
  10. Unity初探(光源类型与光照模式)