前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Linux阅码场 - Linux内核月报(2020年12月)

Linux阅码场 - Linux内核月报(2020年12月)

作者头像
Linux阅码场
发布于 2021-01-27 03:13:09
发布于 2021-01-27 03:13:09
1.7K00
代码可运行
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场
运行总次数:0
代码可运行

关于Linux内核月报

Linux阅码场

Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。

限于篇幅,只会对最新技术做些粗略概括,技术细节敬请期待后续文章,也欢迎广大读者踊跃投稿为阅码场社区添砖加瓦。

本期月报主要贡献人员:

张健、廖威雄、chenwei、夏天

往期链接:

Linux阅码场 - Linux内核月报(2020年06月)

Linux阅码场 - Linux内核月报(2020年07月)

Linux阅码场 - Linux内核月报(2020年08月)

Linux阅码场 - Linux内核月报(2020年09月)

Linux阅码场 - Linux内核月报(2020年10月)

Linux阅码场 - Linux内核月报(2020年11月)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
阅码场征稿
Linux阅码场征集Linux工程师一线研发心得;工程师、高校学生老师、科研院所研研究人员对Linux某一技术要点深入分析的稿件。您的文章将获得近十万一线Linux工程师的广泛受众。投稿要求:原创且从未在任何媒体、博客、公众号发表过的文章。高屋建瓴、深刻全面地论述一个技术点或者面。投稿请微信联系小月:linuxer2016录取的稿件,我们也会奉上微薄的稿酬聊表寸心,稿费标准为300-500/篇。

  1. 体系结构相关

5.10版本中RISC-V架构合入了UEFI这个大特性,这个特性由西数的两位工程师 Anup Patel和Atish Patra贡献,共7个补丁,支持了 early ioremap,用于UEFI启动内核所需的PE/COFF header,the RISC-V EFI stub和EFI runtime services。 此外, 5.10版本中有不少和ARM架构相关的特性,例如之前提到的MTE补丁,该功能借助ARMv8架构中不使用的几个高地址bit位(参见ARMv8 programming guide描述的TBI:Top Byte Ignore)作为tag,可以检测下面错误:bounds violations,,use-after-free, use-after-return, use-out-of-scope,use before initialization。用户空间MTE的支持和内核MTE的selftest测试用例该版本都合入了。内核空间MTE的支持则在5.11 merge window合入。 这个版本还增强了pointer authentication,Pointer authentication可以降低ROP(Return-oriented programming)攻击风险。和MTE类似,PAC使用了系统不使用的地址高位作为签名(PAC),5.10的版本中,增强了PAC的生成算法,并且当authenticate指令失败,会产生fault。值得注意的是,如果fault发给用户空间,这里的行为和之前的实现有变化,之前会给用户空间发SIGSEGV(Invalid memory reference),而目前会发送SIGILL(Illegal Instruction)。另外一个需要注意的是,MTE和pointer authentication都使用了地址都高位,如果同时打开,PAC可用比特会减少。 The arm64 architecture can now do performance-events monitoring over Arm’s CMN-600 interconnect 调测是系统软件很重要的一部分能力,有纯软件的方式,也有软硬结合的方式。例如想分析cache性能,可以通过硬件PMU(Performance Monitor Unit)得到cache miss rate等数据。PMU可以在CPU,总线等模块中。这个补丁提到的PMU是系统总线中的PMU。 CMN-600是ARM公司与2016年推出的系统总线IP,最大支持128个处理器和8T内存。CMN代表Coherent Mesh Network,顾名思义,是个网络结构,它的基本结构是XP(crosspoint)。CMN最大支持8x8=64个XP节点,每个节点可以支持两个Device,例如处理器,IO设备等,也包括调测设备,例如DTC。DTC是Debug Trace Controller的缩写,负责整体的PMU管理和中断(XP节点中有local monitor)。下图来自CMN-600 TRM,是一个3x5的mesh网络例子。

Linux系统的PMU是事件(event),通常的做法是通过perf_pmu_register注册。在arm cmn实现中,arm_cmn_probe调用了该函数注册pmu的attribute group和pmu的event,也就是注册该PMU支持的调测能力。例如arm cmn驱动中注册了400多种事件,其中PMU_HN_CACHE_MISS_EVENT和PMU_HNSLC_SF_CACHE_ACCESS_EVENT,可以用于计算cache miss rate(Cache miss rate (%) = Total cache misses/Total cache accessesx 100)。注册后,调用者(例如perf_event_open)初始化并注册event到perf_event_groups中,该event的相关处理函数是前述arm_cmn_probe注册的。这是Linux pmu event通常的管理方式。cmn驱动稍微多做了一些事情:cmn网络需要通过discovery发现,而不是固定写死的网络;发现之后,需要初始化前述的DTC,并为DTC注册中断。

这个补丁分为两部分,其中文档简述了CMN-600以及PMU驱动的一些实现考虑,具体实现在“ drivers/perf/arm-cmn.c“,感兴趣的童鞋可以根据前面内容读读代码(参见上图,图片节选自阅码场张健老师的ARM Linux课程)。

  1. 文件系统和Block Layer

ext4:两个提升性能的改进点 补丁1:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9faac62d40131521973192e46a82d5066bb42c09 补丁2:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f5b8b297b04208e101c1f92fe804cd4e66df30e8 在ext4 的 iomap 中,如果是复写,在已经映射了块的情况下,直接使用已有的映射信息,而不是重新映射。一个非常简单的改动,在 DAX & DIO 模式下,能大幅提升文件随机复写的速度。在 使能了模拟 pmem(DAX)的PPC64 VM设备上测试,约有10倍的随机复写性能提升。但在常规的 IO 操作(非 iomap)中,其实并不会有影响。 另外一个 fast commit 的新功能实用性更强。在 ext4 的 data=ordered 的日志模式中,会在日志中记录下完整的元数据。一个完整的元数据有时候也是有冗余的,大多时候改动可能只有一点点。能不能只记录涉及的最少改动?这就是 fast commit 新功能要做的事情。fast_commit 的功能需要在 mkfs 时使能,已有的旧的 ext4fs 并不能生效。 overlayfs:新增 volatile 的挂载参数 补丁:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c86243b090bc25f81abe33ddfa9fe833e02c4d64 我们通过 sync 来保证数据刷入,但如果太频繁的 sync 却会严重拖慢了性能。有使用者抱怨,dnf/yum 安装包时总会触发大量的 sync,严重拖慢了 image 的创建速度。 有些使用场景下,使用者并不希望频繁响应 sync,只需要在 umount 时回刷 overlayfs 的 upper layer 文件系统足够了。甚至根本不在意 upper layer 文件系统是否同步,如果数据不完整,丢弃并重新创建即可。 为了满足这样的需求,新支持了 volatile 挂载参数。在使能了这样的挂载参数后,对 upper layer 文件系统的任何形式的 sync 都会被忽略。 这个新的挂载参数并不常用,使用者应根据自己的场景来确定是否使能。 null_blk:一个测试不同块层实现的性能的模拟块设备 补丁:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=dc4d137ee3b79a7474b747b4b326d472ccc2cb79 5.10 合入了一个关于 null_blk 的优化补丁,添加支持最大打开和活跃的 zones 的限制。相信大多数人也是第一次听说 null block 设备。/dev/null 的字符设备用多了,null block 是干嘛的呢? null block 的资料非常少,只因其使用场景也非常局限。在 Linux 的文档中是少有的介绍 null block 设备的资料。null block 模拟了一个块设备,这个块设备不响应任何的读写操作,实际上,也仅仅是在 request 队列中直接标识 request 完成就返回了。可以发现,null block 虽然不对应任何具体的块设备,但经历过完整的块层,因此 null block 常用于测试不同块层实现模型的性能,例如 multi-queue 块层、single-queue块层、bio-based。

  1. 虚拟化容器

在5.10 Release中我们在前几个月介绍过的几个补丁集已经被合并: 1. Add support for Nitro Enclaves。 Nitro Enclaves (NE)是Amazon弹性计算云(EC2)的一种新功能。它允许客户在EC2实例[1]内部再分割出一块隔离的计算环境。 例如,一个在虚拟机中运行的用于处理敏感数据的应用程序,可以和运行在同一个虚拟机中的其它应用程序分离开。我们称呼这个运行EC2实例的虚拟机为主虚拟机。分离后,这个应用程序运行在和主虚拟机不同的另外一个单独虚拟机里,也可以叫做enclave。 2. Support virtio cross-device resources。 这个补丁实现了VIRTIO跨设备的资源共享。他可以支持将VIRTIO资源导入到VIRTIO-VIDEO驱动中。 3. virtiofs: Adds DAX support。 该特性允许客户机在使用virtiofs文件系统时绕过客户机的页面缓存,同时允许客户机将主机上的页面缓存直接映射到客户机地址空间。这在很多数情况下,都可以大大提高访问速度。因为文件数据不必在客户机中复制,而是直接从主机页面缓存中访问,这可以节省大量内存。 还有一些补丁集我们之前没有介绍过,其中有一个关于vDPA的 vDPA: API for reporting IOVA range: 这个补丁集导出了一个API,可以向用户态程序报告IOVA范围。这是这个API的功能,可以让用户太进程根据返回的IOVA做出正确的决策: 1. 对于直接使用vhost-vDPA的用户太进程,IOVA必须在API返回的这个范围内分配。 2. 对于虚拟机(qemu),当vIOMMU未启用时,如果GPA超出范围,则在前期就会失败 3. 对于虚拟机(qemu),当vIOMMU被启用时,确定一个有效的虚拟机地址的范围大小后,虚拟机的IOVA分配器就可以正常工作了。 这个补丁比较简单,但我们正好借此机会简单介绍下vDPAVirtual data path acceleration): vDPA本质上是一种标准化的方法用来设计SRIOV的网卡。让SRIOV网卡在数据面使用VIRTIO Ring的设计布局,这样在虚拟机中就只需要单一的VIRTIO网卡驱动,而不需要部属各种厂商SRIOV网卡VF的驱动。这样相当于将虚拟机和具体的网卡硬件厂商解耦。这不仅仅便于虚拟机的迁移,也方便于虚拟机镜像的安全认证,不再需要因为更换了网卡的硬件添加了新的VF驱动再去认证虚拟机镜像。除了数据面之外,它还定义了一个通用的控制面和软件的底层基础架构来支持它。因此vDPA也可以被看作是SRIOV的一个上层抽象。 那么有的朋友可能会问,这个和VIRTIO full offload到硬件的方案有什么区别?这个从虚拟机里面的最终使用者来看,其实没有太大的区别,在虚拟机内部都是使用一个VIRTIO网卡驱动。vDPA带来的是降低VIRTIO硬件网卡的设计难度,然后提供更好的设计灵活性。我们都知道一个VIRTIO设备包括数据面(通过vring中存储数据)和控制面(vring的初始化等)。我们在上面的vDPA中提到了控制面,但那个并不是VIRTIO控制面。VIRTIO full offload方案中需要硬件厂商在网卡硬件层面实现VIRTIO的数据面和控制面,数据面的难度比较低,但是控制面会复杂很多,因为这个涉及和内存管理单元(IOMMU)的交互。而且VIRTIO full offload也会带来产品的同质化,不利于厂商做差异化功能,这样才有了vDPA。

vDPA的控制面可以简单看作是一个转换层。虚拟机通过vDPA看到的仍然是VIRTIO的控制面接口,不是各个厂商定义的控制面接口。但是vDPA的控制面可以将虚拟机的VIRTIO控制命令,通过vDPA定义的通用控制面接口转换为各个厂商自定义的接口。这只需要在主机端添加vDPA设备厂商提供的vDPA addon驱动即可。厂商的vDPA-addon驱动可以包含它自己的接口和DMA访问模型支持等复杂功能。

简而言之,vDPA是一种比VIRTIO full offload更加灵活的设计方法,让网卡设计厂商可以用更小的代价支持VIRTIO硬件Ring,并仍然在数据平面上实现线速性能。 因此当我们讨论一个“vDPA设备”时,就意味着这个设备的数据面是符合VIRTIO标准的,但它的控制面是厂商自己定义的。

(END)

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
更多精彩,尽在"Linux阅码场",扫描下方二维码关注
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具
VirtFuzz是一款功能强大的Linux内核模糊测试工具,该工具使用LibAFL构建,可以利用VirtIO向目标设备的内核子系统提供输入测试用例,广大研究人员可以使用该工具测试Linux内核的安全性。
FB客服
2024/06/12
1600
VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具
UCloud基于Linux内核新特性的下一代外网网关设计及相关开源工作
UCloud外网网关是为了承载外网IP、负载均衡等产品的外网出入向流量,当前基于Linux内核的OVS/GRE tunnel/netns/iptables等实现,很好地支撑了现有业务。同时,我们也在不断跟踪开源社区的新技术发展,并将之用于下一代外网网关的设计。这些新特性可将系统性能和管理能力再提上一档,满足未来几年的需求。在方案设计研发过程中发现,新特性存在不少缺陷和Bug,为此我们向开源社区回馈了10多个patch,并融入到kernel 5.0版本中,帮助完善kernel功能并提升稳定性。
Linux阅码场
2019/06/04
1.6K0
UCloud基于Linux内核新特性的下一代外网网关设计及相关开源工作
用户态vdpa设备vduse简介及结合QEMU源码分析
vduse: VDUSE(vDPA Device in Userspace) 用户态vdpa设备
晓兵
2024/07/16
5060
用户态vdpa设备vduse简介及结合QEMU源码分析
【漏洞预警】Linux内核ipv4/udp.c 远程任意代码执行(CVE-2016-10229)
漏洞描述 Linux kernel是美国Linux基金会发布的操作系统Linux所使用的内核。Linux kernel 4.5之前的版本中的udp.c文件存在安全漏洞,Linux内核中的udp.c允许
FB客服
2018/02/24
1.2K0
【漏洞预警】Linux内核ipv4/udp.c 远程任意代码执行(CVE-2016-10229)
Linux 内核提权 DirtyPipe(CVE-2022-0847) 漏洞分析
作者:ghost461@知道创宇404实验室 时间:2022年3月11日 简介 2022年2月23日, Linux内核发布漏洞补丁, 修复了内核5.8及之后版本存在的任意文件覆盖的漏洞(CVE-2022-0847), 该漏洞可导致普通用户本地提权至root特权, 因为与之前出现的DirtyCow(CVE-2016-5195)漏洞原理类似, 该漏洞被命名为DirtyPipe。 在3月7日, 漏洞发现者Max Kellermann详细披露了该漏洞细节以及完整POC。Paper中不光解释了该漏洞的触发原因, 还说
Seebug漏洞平台
2022/03/14
1.7K0
Linux阅码场 - Linux内核月报(2020年06月)
Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。
Linux阅码场
2020/07/14
1.4K0
Linux阅码场 - Linux内核月报(2020年07月)
Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。
Linux阅码场
2020/08/13
1.6K0
vDPA:支持 Linux 和 QEMU 中的块设备及内核VDPA块仿真设备vdpa-sim-blk源码分析
vDPA 设备是一种遵循virtio 数据路径规范但具有特定于供应商的控制路径的设备。
晓兵
2024/07/15
5973
vDPA:支持 Linux 和 QEMU 中的块设备及内核VDPA块仿真设备vdpa-sim-blk源码分析
Linux阅码场 - Linux内核月报(2020年11月)
Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。
Linux阅码场
2020/12/29
1.3K0
Linux阅码场 - Linux内核月报(2020年11月)
Linux阅码场 - Linux内核月报(2020年08月)
Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。
Linux阅码场
2020/09/21
1.5K0
【重识云原生】第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
        Virtio作为一种半虚拟化的解决方案,其性能一直不如设备的pass-through,即将物理设备(通常是网卡的VF)直接分配给虚拟机,其优点在于数据平面是在虚拟机与硬件之间直通的,几乎不需要主机的干预。而virtio的发展,虽然带来了性能的提升,可终究无法达到pass-through的I/O性能,始终需要主机(主要是软件交换机)的干预。vDPA(vhost Data Path Acceleration)即是让virtio数据平面不需主机干预的解决方案。该框架由Redhat提出,实现了virtio数据平面的硬件卸载。控制平面仍然采用原来的控制平面协议,当控制信息被传递到硬件中,硬件完成数据平面的配置之后,数据通信过程由硬件设备(智能网卡)完成,虚拟机与网卡之间直通。中断信息也由网卡直接发送至虚拟机不需要主机的干预。这种方式,控制面比较复杂,硬件难以实现。
江中散人_Jun
2022/06/30
2.5K0
【重识云原生】第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
使用GDB调试Linux内核
GDB(GNU Debugger)是Linux上的调试程序,可用于C/C++、Go、Rust等多种语言。GDB可以让你在被调试程序执行时看到它的”内部“情况,观察程序在特定断点上的状态,并逐行运行代码。
mazhen
2023/11/24
1.7K0
使用GDB调试Linux内核
ARM SMMU的原理与IOMMU
如上图所示,smmu 的作用和mmu 类似,mmu作用是替cpu翻译页表将进程的虚拟地址转换成cpu可以识别的物理地址。同理,smmu的作用就是替设备将dma请求的地址,翻译成设备真正能用的物理地址,但是当smmu bypass的时候,设备也可以直接使用物理地址来进行dma;
Linux阅码场
2020/10/10
6K0
ARM SMMU的原理与IOMMU
探索eBPF:Linux内核的黑科技
Linux内核在2022年主要发布了5.16-5.19以及6.0和6.1这几个版本,每个版本都为eBPF引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。总体而言,eBPF在内核中依然是最活跃的模块之一,它的功能特性也还在高速发展中。某种意义上说,eBPF正朝着一个完备的内核态可编程接口快速进化。
嵌入式Linux内核
2023/06/28
1.5K0
探索eBPF:Linux内核的黑科技
详解:网络虚拟化卸载加速技术的演进
在传统的应用场景中,服务器资源过剩情况普遍,为了充分利用服务器资源,产生了虚拟化技术。虚拟化技术以牺牲部分效率为代价提升了资源的使用率,将原来需要硬件完成的工作,通过软件模拟的方式,满足多个云租户的需要。随着5G、8K等新型业务的不断涌现,应用系统对性能提出了更高的要求,云服务也出现了满足不同QoS要求的分化,有(物理机、裸金属)等不同产品形态。各个功能模块的衔接配合,各租户之间的信息交互都需要高效的网络系统来实现。
SDNLAB
2021/11/17
2.2K0
虚拟化硬件加速-vdpa
惠伟:virtio+ovs转发原理和性能分析​zhuanlan.zhihu.com
惠伟
2021/07/28
5.8K0
谢欢《Linux内核tracers的实现原理与应用》课程精彩答疑
谢欢,大家可以叫我Jeff, 我目前就职于某国际知名linux发行版开源公司, 热衷于linux内核。我平时把linux内核源码当小说一样阅读学习,也一直把能给linux社区贡献更多有质量的代码而努力。
Linux阅码场
2021/12/21
1.4K0
智能网卡的网络加速技术
2021年9月25日,由“科创中国”未来网络专业科技服务团指导,江苏省未来网络创新研究院、网络通信与安全紫金山实验室联合主办、SDNLAB社区承办的2021中国智能网卡研讨会中,多家机构谈到了智能网卡的网络加速实现,我们对此进行整理,以飨读者。
SDNLAB
2021/10/21
7.1K0
Linux内核-模块专用地址空间
模块在加载时,会调用module_alloc()来申请一块内存来存放模块的内容,需要的大小如下:
ruochen
2021/11/24
2.4K0
一名上海高中生是如何成长为Linux内核多个模块的maintainer的?
当您打开Linux内核源代码的maintainer文件,在里面搜索一个名字Jiaxun Yang,您会发现,他是内核多个模块的maintainer:
Linux阅码场
2021/07/09
1.5K0
推荐阅读
相关推荐
VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文