本报告涉及了 2021 年 10 月到 12 月期间与 FreeBSD 相关的项目。这是计划中的四个报告中的第四个,包含了 19 个条目。亮点包括更快的启动时间、更多的 LLDB 工作、基本系统中的 OpenSSH 更新以及更多的无线网络开发。
此致, Pau Amma, Daniel Ebdrup, John-Mark Gurney 和 Joe Mingrone
来自各个官方和半官方团队的条目,详见 管理页面。
链接: FreeBSD 基金会 链接: https://www.FreeBSDFoundation.org
技术路线图 链接: https://FreeBSDFoundation.org/blog/technology-roadmap/
捐赠 链接: https://www.FreeBSDFoundation.org/donate/
基金会合作伙伴计划 链接: https://www.FreeBSDFoundation.org/FreeBSD-foundation-partnership-program
FreeBSD 期刊 链接: https://www.FreeBSDFoundation.org/journal/
基金会新闻与事件 链接: https://www.FreeBSDFoundation.org/news-and-events/
联系人:Deb Goodkin <deb@FreeBSDFoundation.org>
FreeBSD 基金会是一家 501(c)(3) 非营利组织,致力于支持和促进全球 FreeBSD 项目和社区的发展。来自个人和公司的捐赠用于赞助和管理软件开发项目、会议和开发者峰会。我们还为 FreeBSD 贡献者提供旅行赞助,购买并支持硬件以改善和维护 FreeBSD 基础设施,提供资源以提高安全性、质量保证和发布工程工作。我们出版营销材料以促进、教育和宣传 FreeBSD 项目,促进商业供应商与 FreeBSD 开发者之间的合作,最终代表 FreeBSD 项目执行合同、许可协议和其他需要合法实体的法律安排。
以下是我们在上个季度为 FreeBSD 提供帮助的一些亮点:
我们做到了!我们达成了 2021 年的筹款目标,筹集了 1,281,437 美元!!我代表基金会感谢你去年对我们的财务支持,这将帮助我们在 2022 年继续并增加对 FreeBSD 的支持。此外,大家已经开始向我们捐赠 2022 年的款项,这让我们感到非常温暖!我们将在 1 月底开始更新 2022 年的筹款进度条。
在本季度报告中,你将阅读到我们为改善 FreeBSD 和宣传该项目所赞助的多个领域(我们主要的支出领域)。请查看外部赞助项目,如 LLDB 支持、Raid-Z 扩展、WireGuard 和 WiFi,以及内部支持的工作,如提升安全性、支持 Tier-1 架构,以及为社区提供在线互动和教育机会。
如果你希望帮助我们继续这些努力,请考虑为我们的 2022 年筹款活动捐款!https://www.FreeBSDFoundation.org/donate/。
我们还为更大的商业捐赠者提供了合作伙伴计划。你可以在 https://www.FreeBSDFoundation.org/FreeBSD-foundation-partnership-program/ 阅读详细信息。
在第四季度,基金会工作人员和赞助的受赠者共提交了 472 次源代码树更改、98 次 Ports 更改和 11 次文档树更改。这些更改分别占源代码、Ports 和文档提交的 41%、41% 和 13%,并标明了赞助者。
你可以在各个季度报告条目中阅读有关基金会赞助项目的详细信息:
amd64 上的 AVX 错误
WireGuard 的加密更改
Intel 无线驱动支持
LLDB 调试器改进
基本系统 OpenSSH 更新
系统调用 sched_getcpu(2)、membarrier(2) 和 rseq(2)
amd64 上的 VDSO
以下是基金会开发者在本季度提交的其他基本系统改进示例,这些改进没有单独的报告条目。
规范化硬链接 kern.proc.pathname
一些程序根据执行时使用的名称调整其行为。对于这些程序,通常需要在 argv[0]、sysctl kern.proc.pathname、auxv AT_EXECPATH 和任何 procfs 文件符号链接中保持一致的名称。在这项工作之前,所有列出的内核接口尝试计算文本 vnode 的某个名称并返回结果。如果执行的二进制文件有多个硬链接,返回的名称将从有效名称列表中随机选择。经过基金会开发者 Konstantin Belousov 完成的工作后,系统现在保存父目录和正在运行镜像的文本文件名称。当请求时,系统将使用这些信息重建文本文件的正确名称。
swapon/swapoff,文件交换
在修复字符设备 vnode 锁定的断言之后,有报告指出文件交换代码破坏了 VFS 锁定协议。此外,还发现交换文件的其他回归问题。例如,在关机时,文件系统在 swapoff 之前被卸载,这使得 swapoff 在页面加载时会 panic。这些错误已被修复,并添加了 swapoff(2) 功能,以避免某些对内存和交换空间不足的过于保守的估算。
fcntl(F_KINFO)
应用程序开发者经常请求返回打开文件描述符的文件路径的接口。我们唯一有用的设施是 kern.proc.filedesc sysctl,虽然有一定的可用性,但当一个进程有很多打开的文件时,它会带来过高的开销。新增了 fcntl(F_KINFO) 接口,可以仅为指定的文件描述符返回一个 struct kinfo_file。除了其他有用的数据,kinfo_file 还提供了计算出的路径(如果可用)。
基金会提供了一名全职员工并赞助项目,以改进 FreeBSD 项目的持续集成、自动化测试和整体质量保证工作。
基金会为该项目提供硬件和支持。在 2021 年第四季度,我们开始寻找新的澳大利亚镜像服务器。截至撰写本文时,服务器已经购买,但由于组件和运输的延迟,可能要等到 2022 年第二季度或第三季度才会启用。澳大利亚 FreeBSD 社区将能够更快、更好地访问我们的站点。
我们的许多努力都致力于项目宣传。这可能包括突出有趣的 FreeBSD 工作、制作宣传资料、参加活动或进行演讲。我们制作的宣传资料的目标是教授人们 FreeBSD 的基础知识,并帮助他们更轻松地实现采纳或贡献。除了参加和演讲外,我们还鼓励并帮助社区成员举办自己的 FreeBSD 活动、做演讲或设立 FreeBSD 展台。
FreeBSD 基金会赞助了全球许多会议、活动和峰会。这些活动可以是与 BSD 相关的、开源的或面向弱势群体的技术活动。我们支持与 FreeBSD 相关的活动,以帮助提供一个知识共享、合作项目和开发者与商业用户之间协作的场所。这一切都有助于建立健康的生态系统。我们也支持非 FreeBSD 相关的活动,以推广和提高 FreeBSD 的知名度,增加 FreeBSD 在不同应用中的使用,并招募更多的贡献者加入项目。我们继续参加虚拟活动,并在去年 11 月举办了一场虚拟供应商峰会。
查看我们上个季度在宣传和教育方面所做的一些工作:
作为 ALL Things Open 2021 的媒体赞助商参与并推广
承诺成为 SCALE 19x 的媒体赞助商
承诺在 FOSDEM 2022 举办一个展位
发布了 2021 年秋季通讯
在 Semi-Bug 举办了基金会讲座,2021 年 11 月 16 日
在 Seagate OSPO 举办了基金会与 FreeBSD 讲座,2021 年 12 月 9 日
帮助组织了为期 2 天的 FreeBSD 虚拟供应商峰会,2021 年 11 月 18-19 日。视频可以在 项目的 YouTube 频道 查找
新的操作指南:FreeBSD 入门
我们通过出版专业制作的 FreeBSD Journal 来帮助世界了解 FreeBSD。如前所述,FreeBSD Journal 现在是一本免费的出版物。请访问 https://www.FreeBSDfoundation.org/journal/ 了解更多并获取最新期刊。
你可以在 https://www.FreeBSDfoundation.org/news-and-events/ 了解我们参加的活动和即将举办的活动。
基金会持有 FreeBSD 商标,并且我们有责任保护这些商标。我们还为核心团队提供法律支持,调查出现的问题。
请访问 https://www.FreeBSDFoundation.org 了解更多关于我们如何支持 FreeBSD 以及我们如何为你提供帮助!
链接:
关于 FreeBSD Ports 链接: https://www.FreeBSD.org/ports/
贡献到 Ports 链接: https://docs.freebsd.org/en/articles/contributing/#ports-contributing
FreeBSD Ports 监控 链接: http://portsmon.freebsd.org/
Ports 管理团队 链接: https://www.freebsd.org/portmgr/
Ports Tarball 链接: http://ftp.freebsd.org/pub/FreeBSD/ports/ports/
联系方式:René Ladan <portmgr-secretary@FreeBSD.org>
联系方式:FreeBSD Ports 管理团队 <portmgr@FreeBSD.org>
Ports 管理团队负责监督 Ports 的整体方向、构建软件包和人员事务。以下是上个季度的情况。
根据 FreshPorts 的数据,目前 Ports 中有 46,700 个 Ports。目前有 2,666 个开放的 Ports PR,其中 611 个未分配。上个季度,共有 166 名提交者在主分支提交了 9,535 次提交,在季度分支上有 62 名提交者提交了 644 次提交。与上个季度相比,这意味着提交次数略有下降,尽管更多的提交者活跃,且开放的 PR 数量略有增加。
在上个季度,我们迎来了 Dries Michiels (driesm@),并告别了 kuriyama@ 和 fjoe@。Ports 管理团队也有变化:adamw@ 在服务五年后卸任,tcberner@ 成为 portmgr@ 的正式成员。
引入了三个新的 USES:
magick:处理 ImageMagick 的依赖关系
nodejs:提供对 NodeJS 的支持(并且新默认版本为 NODEJS=lts)
trigger:使用 TRIGGERS 变量处理 pkg 触发器
PGSQL 的默认版本已切换为 13。此外,INSTALLS_ICONS 已被 gtk-update-icon-cache 触发器取代,该宏不再起作用。
如往常一样,部分“大型”软件包也进行了更新:pkg 更新为 1.17.5,Chromium 更新为 94.0.4606.81_3,Firefox 更新为 95.0.2_1,2。Ruby 3.1.0 和 Python 3.11 现已可供用户和其他 Ports 使用。
链接:
FreeBSD 文档项目 链接: https://www.freebsd.org/docproj/
FreeBSD 文档项目新贡献者指南 链接: https://docs.freebsd.org/en/books/fdp-primer/
文档工程团队 链接: https://www.freebsd.org/administration/#t-doceng
联系方式:FreeBSD Doceng 团队 <doceng@FreeBSD.org>
doceng@ 团队负责处理与 FreeBSD 文档项目相关的一些元项目事务;有关更多信息,请参阅 FreeBSD Doceng 团队章程。
在上个季度,未授予新的文档提交权限,仅保留了一个提交权限。
在过去的季度中,完成了与文档树相关的若干任务:
在文档仓库的根目录中添加了 COPYRIGHT 文件。许可证也更新为反映当前项目所使用的工具链。
清理了文档树中的 Mailman 信息。随着邮件列表从 Mailman 迁移到 Mlmmj,移除了非常旧的邮件列表;大部分工作是在英文文档上完成的。
标记了 FreeBSD docset 以对应 12.3-RELEASE。
更新了所有 ports/packages 中的 misc/freebsd-doc-*。
将 articles/contributors/contrib-* 文件移到了文档共享目录。
在文档 Makefile 中添加了归档/压缩 Documentation/HTML 离线文件的选项,这是更新 https://download.freebsd.org/ftp/ 之前的必要步骤。此举是在与 clusteradm@ 讨论后进行的,以更新离线资产(HTML/PDF)。
添加了对 EPUB 输出(书籍/文章)的实验性支持。
与 clusteradm@ 讨论改善 https://www.freebsd.org 和 https://docs.freebsd.org 的性能。
联系方式:Sergio Carlavilla <carlavilla@FreeBSD.org>
该工作组负责创建新的 FreeBSD 文档门户,并重新设计 FreeBSD 主网站及其组件。FreeBSD 开发者可以通过 FreeBSD Slack 渠道 #wg-www21
关注并加入工作组。工作将分为四个阶段:
文档门户重新设计 创建一个新的设计,响应式并具有全局搜索功能。(完成) 在文档(书籍/文章)中启用编辑链接,指向 GitHub 并鼓励提交 GitHub 拉取请求。(完成)
网站手册页面重新设计 使用 mandoc 生成 HTML 页面脚本。(进行中)
网站 Ports 页面重新设计 使用 Ports 脚本创建应用程序门户。(进行中)
FreeBSD 主网站重新设计 新设计,响应式和黑暗主题。(未开始)
跨多个类别的项目,包括内核、用户空间、Ports 和外部项目。
联系方式:Dawid Gorecki <dgr@semihalf.com>
联系方式:Marcin Wojtas <mw@semihalf.com>
地址空间布局随机化(ASLR)是一种在大多数现代操作系统中实现的利用缓解技术。它通过随机定位可执行文件的基本地址以及库、堆和栈的位置,在进程的地址空间中实现。尽管多年来 ASLR 证明单独不能完全保证操作系统的安全性,但该机制确实可以使利用变得更加困难。
Semihalf 团队努力为 PIE(位置无关可执行文件)和非 PIE 64 位二进制文件启用地址映射随机化。待 补丁 被合并到 HEAD,ASLR 特性就为所有 64 位架构启用了。
此外,提到的更改禁用了 SBRK,以允许使用 bss 增长区域进行映射。没有 ASLR 时此更改没有影响,因此它被应用到所有架构。
待办事项
改进 stackgap 特性实现。
MFC 到 stable/13 分支。
赞助商:Stormshield
链接:
Wiki 页面 链接: https://wiki.freebsd.org/BootTime
操作系统启动时间对比 链接: https://www.daemonology.net/blog/2021-08-12-EC2-boot-time-benchmarking.html
联系方式:Colin Percival <cperciva@FreeBSD.org>
Colin Percival 正在协调一项加速 FreeBSD 启动过程的工作。为了进行基准测试,他主要使用 EC2 c5.xlarge 实例作为参考平台,并测量虚拟机进入 EC2 "运行" 状态和能够 SSH 登录到实例之间的时间。
这项工作始于 2017 年,截至 2021 年 9 月底,FreeBSD 启动时间已从约 30 秒缩短至约 15 秒。
在 2021 年第四季度,进一步的改进将启动过程的时间缩短至大约 10 秒。目前,仍有 4 秒的改进正在进行中。
此外,现在使用 TSLOG 对用户空间启动过程进行分析,使得能够查看整个启动过程的火焰图;ec2-boot-bench 工具现在可以通过截取 EC2 VGA 控制台的快照来生成启动过程的 MP4 视频。
问题会在 Wiki 页面上列出,并在识别出来时进行更新;该页面还提供了执行分析的说明。鼓励用户在自己的系统上分析启动过程,以防他们遇到没有出现在 Colin 用于测试的系统上的延迟。
这项工作得到了 Colin 的 FreeBSD/EC2 Patreon 的支持。
赞助商:https://www.patreon.com/cperciva
链接:
Moritz 系统项目概述 链接: https://www.moritz.systems/blog/freebsd-kgdb-support-in-lldb/
进展报告 3 链接: https://www.moritz.systems/blog/lldb-serial-port-communication-support/
进展报告 4 链接: https://www.moritz.systems/blog/lldb-freebsd-kernel-core-dump-support/
LLVM Git 仓库 链接: https://github.com/moritz-systems/llvm-project
libfbsdvmcore Git 仓库 链接: https://github.com/moritz-systems/libfbsdvmcore
联系方式:Kamil Rytarowski kamil@moritz.systems
联系方式:Michał Górny mgorny@moritz.systems
根据上游所述,“LLDB 是下一代高性能调试器。LLDB 作为一组可重用组件构建,充分利用了更大 LLVM 项目中的现有库,如 Clang 表达式解析器和 LLVM 反汇编器。”
FreeBSD 在基本系统中内置了 LLDB。目前,它与 GNU GDB 调试器相比存在一些限制,尚未完全替代 GDB。该项目从 2021 年 7 月开始,计划持续至 2022 年 1 月,旨在使 LLDB 适用于调试 FreeBSD 内核。
项目的早期部分主要集中在改进 LLDB 与其他实现 GDB 远程协议的服务器之间的兼容性。接下来实现了全功能的串口支持,随后是对 FreeBSD 内核核心转储(vmcores)的支持。
LLDB 客户端改进了通过串口连接远程服务器的支持,LLDB 服务器也获得了支持串口通信的功能。这使得 LLDB 可以用于调试使用 RS232 接口的嵌入式设备。同时,它也有助于在普通 PC 上调试内核,因为它不依赖于网络堆栈。
LLDB 现在也支持 FreeBSD vmcores。这使得能够在不依赖 KGDB 或手动将 vmcore 转换为 LLDB 支持的标准 ELF 格式的情况下,检查崩溃的内核状态。
这些变更预计将在 LLDB 14.0 中发布。
赞助商:FreeBSD 基金会
联系方式:Kornel Dulęba <mindal@semihalf.com>
联系方式:Artur Rojek <ar@semihalf.com>
联系方式:Hubert Mazur <hum@semihalf.com>
联系方式:Wojciech Macek <wma@semihalf.com>
Semihalf 团队一直致力于为 NXP LS1028A SoC 以及其无 GPU 版本(NXP LS1027A)添加 FreeBSD 支持。
NXP LS1028A/LS1027A SoC 是一款双核 64 位 ARMv8 Cortex-A72 应用处理器,具有高速外设,如 2 个支持时间敏感网络(TSN)的以太网控制器、四端口 TSN 启用交换机、PCIE、SD/MMC、USB3.0 等。
已通过以下方式扩展原始支持:
ENETC 以太网 驱动程序
添加对 PHY 中断的支持
修复 VID/mcast 地址哈希计算
序列化 MDIO 事务
允许将驱动程序作为模块加载
FSL SDHCI 驱动程序 的改进
添加对 HS200/HS400 模式的支持
添加对软件重置的完全支持
提供更准确的时钟计算
实现脉冲宽度检测修正
修复 vccq 重新配置
FLEX SPI NOR 控制器 驱动程序
待办事项
改进使用 FSL SDHCI 控制器的其他 SoC 对 MMC HS200/HS400 的支持。
赞助商:Alstom Group
联系方式:Konstantin Belousov <kib@FreeBSD.org>
链接: Linux manpage for membarrier(2) 链接: https://kib.kiev.ua/kib/membarrier.pdf
membarrier(2) implementation 链接: https://reviews.freebsd.org/D32360
Linux manpage for rseq(2) 链接: https://kib.kiev.ua/kib/rseq.pdf
rseq(2) and userspace bindings implementation 链接: https://reviews.freebsd.org/D32505
Linux 提供了一组系统调用,让在用户空间开发几乎无需系统调用的可扩展算法。这些机制基于乐观执行,使用 CPU 本地数据,假设在给定的计算中不会发生像上下文切换或信号传递之类的罕见事件。如果确实发生了这些事件,则会进行回滚和重启。这种高层次的方式,我理解是用于实现像 URCU、快速 malloc 分配器(tcmalloc)和其他面向大型分区机器的用户空间基础设施项目。
例如,sched_getcpu(2) 系统调用返回当前线程正在执行的 CPU 的 CPU ID。在 amd64 上,如果可用,我们使用 RDTSCP 或 RDPID 指令来查询 CPU ID,而不更改 CPU 模式,否则这将是一个轻量级的系统调用。当然,提供的答案在创建时就已经过时,甚至在返回到用户空间之前就已经过时。但它允许在某些结构中播种有效值,这些结构在很长一段时间内有效(以 CPU 的速度为尺度),并且在上下文切换等特殊控制流事件发生时会自动进行修正,用户空间可以选择检测并回滚,或者与异常一起同步并回滚。
有两个基石系统调用允许用户空间实现这些高效算法:membarrier(2) 和 rseq(2)。
Membarrier 是一种帮助实现快速 CPU 排序屏障的设施,通常用于非对称/偏向锁。在这些锁实现方案中,通常假设对象的所有者有竞争者/并行线程需要协调。如果某个线程开始访问相同的资源,那么它有责任确保正确性。快速代码路径利用的一些“陷阱”包括从一个专用页面读取,该页面已被竞争者取消映射,以切换到慢路径。或者,我们可以向所有可能有权访问该对象的线程发送信号,以插入一个屏障。或者,我们可以使用 membarrier(2) 设施,它的开销远低于向所有线程发送信号。
Membarrier(2) 在指定的 CPU 集合中插入一个屏障,这通常是底层硬件操作,用以确保顺序,如果这些 CPU 正在执行指定的线程。如果这些 CPU 没有执行目标线程,假设上下文切换的顺序一致性保证已经足够满足 membarrier(2) 的要求。总体而言,快速路径可以在没有慢指令的情况下实现,慢路径则以 IPI 为代价,将所需的屏障注入到快速路径中。
在用户空间线程执行中检测异常条件的设施是在 Linux 中开发的,并称为 rseq(2)。它是一个被称为可重启原子序列(Restartable Atomic Sequences,简称 RSEQ)的功能。能够廉价地实现这一点允许长于单条指令的代码原子执行,而无需提出和实现像禁用抢占这样的不安全操作,这对于用户空间来说是不可行的。例如,代码可能使用 CPU 本地资源,而这些资源在上下文切换时无法很好地处理。用户空间中不能有类似 critical_enter(9) 的操作。(FreeBSD 中存在一种廉价阻止信号传递的设施,见 sigfastblock(2),但正确使用它证明在通用代码中实现起来过于困难,特别是因为它需要与 rtdl 和 libthr 进行版本依赖的协调。)
rseq(2) 采用每线程的内存块,线程在其中写入当前的 CPU ID(见 sched_getcpu(2)),并指定在执行该块代码时,如果发生上下文切换等异常情况,必须回滚的代码块。快速代码路径使用每 CPU 的数据,通常不需要任何修正,但如果发生上下文切换,控制转移到中止处理程序会通知用户空间这一事件。因此,代码可以廉价地在计算后检查是否发生了上下文切换,并在需要时重试。
一个有趣的 rseq(2) 实现细节是,在实际的上下文切换期间,从内核访问/更新 rseq 结构是不可能的(且没有必要的),因为我们无法在自旋锁下访问用户空间。换句话说,使用 rseq 的线程不会因系统全局的上下文切换而产生任何性能开销。相反,如果进程注册了 rseq(2),在任何返回到用户模式时,我们都会检查线程在内核中时是否发生了任何异常事件(上下文切换只能发生在线程处于内核模式时),如果确实发生了上下文切换,我们会触发一个 ast 来检查程序计数器是否在关键代码段内,如果是,则跳转到中止处理程序。
membarrier(2) 和 rseq(2) 的实现是干净房间实现:我使用了 Linux 手册页作为参考,并通过公开讨论澄清了边缘案例。在 Linux/glibc 中,没有稳定的 glibc 接口来访问 rseq 设施。曾提出过一个集成方案,但后来从 glibc 中撤回。在将 rseq(2) 接口提供给我们自己的 libc 之前,可能需要等待一段时间,以便在 glibc 中稳定,或者依赖内核和用户空间之间的紧密集成,在我们的基本系统中使用 ABI 技巧(如符号版本控制)来演化接口。无论如何,没有目标要与 Linux 完全兼容。
赞助商:FreeBSD 基金会
链接: OpenSSH 链接: https://www.openssh.com/
公告至 freebsd-security@ 链接: https://lists.freebsd.org/pipermail/freebsd-security/2021-September/010473.html
联系方式:Ed Maste <emaste@freebsd.org>
OpenSSH 是一套远程登录和文件传输工具,已从版本 8.7p1 更新为 8.8p1,内置于 FreeBSD 基本系统中。
注意
OpenSSH 8.8p1 默认禁用 ssh-rsa 签名方案。更多信息请参见 关于后续 FreeBSD 基本系统 OpenSSH 更新的重要通知 邮件列表帖子。
OpenSSH 现在支持 FIDO/U2F 设备,并且已在基本系统中启用支持。
下一步包括将 U2F 密钥 devd 规则集成到基本系统中,并将更新的 OpenSSH 以及 FIDO/U2F 支持合并到稳定分支中。
赞助商:FreeBSD 基金会
联系方式:Konstantin Belousov <kib@FreeBSD.org>
VDSO(虚拟动态共享对象)是一个由内核和动态链接器共同插入到执行镜像中的共享对象(更常见地称为动态库)。它并不像独立的 .so 文件那样存在于磁盘上,也没有 ELF 格式中的指令来触发插入。系统执行此操作是为了实现 C 运行时实现组件的一些功能。
FreeBSD 已经具备了许多通常在 Linux 中使用 VDSO 实现的功能,但实际上并不需要那么复杂。之所以可行,主要是因为内核和 C 运行时的共同演化。我们可以自然地引入需要在内核中实现并在用户空间部分支持的功能,因为 FreeBSD 是作为一个整体开发的。令人惊讶的是,这还使得内核和动态链接器对用户空间接口的使用者知之甚少(并且不会强制执行任何事情)。
例如,早在很久以前就实现了一个无系统调用的墙钟,通过内核在共享页面中提供一个时间掌控块,而 C 库则知道其位置和支持的算法。无需使用 VDSO 来介入一些 libc 符号或向用户空间提供已知符号命名的服务。
根据多年来使用这种伪 VDSO 方法的经验,唯一一个无法实现的特性是信号跳板的 DWARF 注释,以便堆栈展开器使用。
当内核将信号传递给用户空间时,它会更改一些关键寄存器(如指令指针、堆栈指针以及架构所需的其他寄存器),并将整个用户模式的 CPU 状态(上下文)保存的图像压入用户堆栈。然后,控制权转交给位于共享页面中的一小段代码(信号跳板),该代码调用用户处理程序函数,并在从处理程序返回后发出 sigreturn(2) 系统调用以重新加载旧的上下文。
从这个描述中可以看出,在跳板执行期间,机器的状态与正常的 C 调用帧有很大不同。处理 C++ 异常、Rust Panic 或其他类似机制的展开器,需要理解跳板帧的特殊性。目前的方法是通过将指令指针与 sysctl kern.proc.sigtramp
匹配来硬编码检测跳板。
DWARF 注释足以为展开器提供所需的信息,使得跳板帧不再特殊,但问题在于展开器无法找到注释,而不引入更多的特殊性。因此,我们可以插入一个 VDSO,它仅作为出现在进程加载的 DSO 枚举中的一个项,通过 dl_iterate_phdr(3)
(进程内)或 r_debug
(远程),并通过 PT_GNU_EH_FRAME
头指向 DWARF 信息的根节点。
这正是 FreeBSD 上 VDSO 的作用:它将信号跳板部分及其 DWARF 注释(.cfi)包装成一个共享对象,该对象被放入共享页面,并在镜像激活时通过 rtld(1) 链接到预加载的对象集合中。
在 VDSO 镜像中,努力去除尽可能多的不需要的结构和填充物,因为它消耗了共享页面中的空间。它被推到 lld 和 ld.bfd 的常见分母限制下,通过链接器脚本的一些技巧和一些似乎未文档化的链接器选项。
我们需要至少两个 VDSO 版本用于 amd64:一个用于原生二进制的 64 位版本,另一个用于 ia32 二进制的 32 位版本。每个 VDSO 的大小大约为 1.5KB,因此在共享页面中的空间变得非常紧张,还需要空间存放其他内容,如时间掌控或随机生成种子。
构建脚本强制要求 VDSO 不超过 2KB;如果超过该大小,则需要扩展共享页面以至少变为两个共享页面。脚本还强制 VDSO 具有纯粹的独立位置,不需要对代码或元数据(.cfi
)进行重定位。
赞助商:FreeBSD 基金会
更新了内核子系统/功能、驱动程序支持、文件系统等。
提交:73b357be9238 链接: https://cgit.freebsd.org/src/commit/?id=73b357be92385cbb70ba19e7023a736af2c6b493
联系方式:Konstantin Belousov <kib@FreeBSD.org>
某些 CPU 支持所谓的 XSAVE 初始化优化,但并非所有 CPU 都支持。当它们支持时,“根据复杂的内部微架构条件”,优化可能会发生,也可能不会发生。基本上,这意味着有时 CPU 不会写入所有的 XSAVE 状态,并且会在 xstate_bv 中记录它没有写入的部分。
在信号传递时,操作系统将被信号中断的保存上下文提供给信号处理程序。该上下文包括所有可以提供给用户空间的 CPU 状态,包括 FPU 寄存器(XSAVE 区域)。此外,从信号处理程序返回时,会恢复上下文,这允许处理程序修改主程序的流程。当初始化优化生效时,操作系统试图通过填充 XSAVE 区域中未保存的部分,来隐藏初始化状态优化对信号处理程序的影响。
问题发生在这里。对于部分 0(x87)和部分 1(SSE/XMM),Intel CPU 并未在 CPUID 中提供布局枚举,假设操作系统已经了解这些区域。错误在于 amd64 内核硬编码了一个 32 位大小的 XMM 保存区域,这导致当初始化优化生效时,%XMM8-%XMM15
被填充为垃圾值,因为只有指定的 SSE 保存区域部分从规范保存区域复制过来。
赞助商:FreeBSD 基金会
链接: ENA README 链接: https://github.com/amzn/amzn-drivers/blob/master/kernel/fbsd/ena/README
联系方式:Michal Krawczyk <mk@semihalf.com>
联系方式:Dawid Gorecki <dgr@semihalf.com>
联系方式:Marcin Wojtas <mw@semihalf.com>
ENA(弹性网络适配器)是 Amazon Web Services(AWS)虚拟化环境中使用的智能 NIC。ENA 驱动程序支持多个发送和接收队列,并且能够处理最高 100 Gb/s 的网络流量,具体取决于使用的实例类型。
自上次更新以来的改动:
向驱动程序添加了 IPv6 层 4 校验和卸载支持
在启用 RSS 内核选项时,为驱动程序添加了 NUMA 感知支持
重构了 Tx 请求 ID 的验证
更改了驱动程序计时器服务的生命周期
避免在设备无响应时触发重置
正在进行的工作:
驱动程序移植到 iflib 框架的原型设计
对即将发布的 ENA 驱动程序版本(v2.5.0)进行测试
赞助商:亚马逊公司
链接: iwlwifi 状态 FreeBSD Wiki 页面 链接: https://wiki.freebsd.org/WiFi/Iwlwifi
联系方式:Bjoern A. Zeeb <bz@FreeBSD.ORG>
英特尔无线驱动程序更新项目旨在为更新的芯片组提供支持,并兼容 mac80211 LinuxKPI 代码。以前,Intel 的双许可证驱动程序代码已经移植到原生驱动程序 iwm(4) ;通过使用 LinuxKPI 兼容框架,我们可以直接使用该驱动程序,仅需做一些非常小的修改,希望这些修改能被纳入原始驱动程序中。
在 12 月,驱动程序、固件和所有剩余的 LinuxKPI 兼容性代码已提交至 FreeBSD 主分支(HEAD)并合并到 stable/13 分支。进一步的修复、更新和改进将直接纳入 FreeBSD 中,这意味着不再需要应用快照,变化也可以更及时地分发。
在过去的几个月里,我们努力确保支持最新的 AX210 芯片组。兼容代码已经重构,以便更好地跟踪和调试 mac80211 兼容层,同时保持 net80211 和 mac80211 的状态机同步。
尽管我们继续更新驱动程序和所有所需的兼容代码,但我们的重点仍然是稳定性,并为更新的 802.11 标准添加支持。当前,驱动程序仍设定为仅支持 11a/b/g,11n 将是下一个目标,之后我们会着手支持 11ac。
通过将代码纳入 FreeBSD git,我们预期会有更广泛的测试,因此也可能会出现一些问题。有关开发的最新状态,请关注相关的 Wiki 页面和 freebsd-wireless 邮件列表。
赞助商:FreeBSD 基金会
联系方式:John Baldwin <jhb@FreeBSD.org>
在过去几个月中,我合并了几项内核更改,以更好地支持 WireGuard 驱动程序。这些更改包括扩展 struct enc_xform
接口,以更好地支持 AEAD 加密算法,修改 struct enc_xform
以支持多块操作,从而提升性能,以及将 XChaCha20-Poly1305 AEAD 加密套件添加到 OCF。此外,内核现在包括一个新的“直接”API,用于处理小型平面缓冲区上的 ChaCha20-Poly1305 操作。一个正在审查的更改添加了一个 API 来支持 curve25519 操作。通过这些更改,WireGuard 驱动程序大多可以使用内核中的加密 API,而不是其内部实现。
与此同时,我一直在更新 WireGuard 驱动程序,以使用这些新的 API,并验证与现有驱动程序的互操作性。接下来的任务之一是进一步完善这些更改(以及一些小的错误修复),以便将它们作为候选项提交到 WireGuard 驱动程序的上游。
赞助商:FreeBSD 基金会
影响 Ports 的更改,无论是对树中大部分内容的广泛更改,还是对单个 Port 的修改。
链接:
KDE FreeBSD 链接: https://freebsd.kde.org/
KDE Community FreeBSD 链接: https://community.kde.org/FreeBSD
联系方式:Adriaan de Groot <kde@FreeBSD.org>
FreeBSD 上的 KDE 项目旨在将 KDE 社区的软件及其依赖项和相关软件打包进 FreeBSD 的 Ports。这包括一个完整的桌面环境 KDE Plasma(支持 X11 和 Wayland)以及数百个可以在任何 FreeBSD 机器上使用的应用程序。
KDE 团队(kde@)也是 desktop@ 和 x11@ 的一部分,致力于构建 FreeBSD 的软件栈,使其成为一个既美观又可作为日常使用的图形桌面系统。
本季度仅进行了一些 CMake 更新,最终更新为 CMake 3.22.1。更多补丁已提交到上游,CMake 很快就会在 FreeBSD 上切换到 share/man
目录来存放手册页。届时,将会有大量的 pkg-plist
改动。
KDE Frameworks、KDE Plasma 和 KDE Gear 的月度版本发布保持了 exp-run 的进行。kde@ 感谢 Antoine 监督我们大量的 exp-run 请求。目前,我们已使用 KDE Frameworks 5.89(截至 2021 年 12 月的最新版本),KDE Plasma Desktop 5.23.4 和 KDE Gear 21.12。
Qt 5 不再收到 Qt 公司提供的开源更新,但 KDE 社区维护着自己的补丁集,后者将 Qt 6 中的许多修复反向移植。我们正在进行导入 KDE 补丁集的工作。
Qt 6 依然令人期待,但关于程序退出时崩溃的问题尚未取得实质性进展。
deskutils/kalendar 是一个相对较新的 Port,使用 KDE 技术构建桌面日历(约会)。
deskutils/latte-dock 是 KDE Plasma(以及其他环境)的一种替代启动器,已更新到每个 bugfix 版本。
devel/qbs 和 devel/qtcreator 已更新。Qbs(或称“Qt 构建系统”)是一种声明式构建系统,风格类似于声明式 QML 程序。(注意:Qbs 并不被 Qt 本身使用)。
graphics/digikam 已更新到最新版本,并现在支持 ImageMagick 6 和 ImageMagick 7。顺便提一下,新增了 USES=magick
,以简化依赖 ImageMagick 的 Port。
graphics/ksnip,KDE Plasma(以及其他环境)中的多个截图应用之一,进行了大量的 bugfix 更新。
graphics/skanpage 是一个新 Port,能够扫描多页并生成包含所有页面的 PDF 文件。
multimedia/qt5-multimedia 现在忽略 gstreamer-gl(而不是在构建时如果安装了该依赖项就隐式地构建它)。
net-im/ruqola 是一个 Rocket Chat 客户端,已更新至最新版本。
security/qtkeychain 发布了新版本。
在软件栈的其他地方,kde@ 还维护了支持桌面的一些 Port。部分亮点包括:
devel/libphonenumber 不断追踪全球电话号码的变更(FreeBSD 基金会可以通过 +1.720.207.5142 联系)。
graphics/poppler 更新了这个广泛使用的 PDF 渲染库。
multimedia/pipewire,pulseaudio 的音视频继任者,已更新,现在也支持 SSL。
net/py-pytradfri 获得了几次更新,使你可以从 FreeBSD 控制你的灯光。
print/freetype2 更新至最新版本;相关的 x11-toolkits/libXft 也进行了更新。
print/harfbuzz,文本排版库,已更新以支持更多字体类型。
sysutils/bsdisks 实现了用于检查磁盘(驱动器、分区等)的 DBus 接口。它也用于可移动磁盘的通知。
x11-themes/adwaita-qt,将 Adwaita 主题引擎连接到基于 Qt 的应用程序,已更新。
链接: FreeBSD office 项目 链接: https://wiki.freebsd.org/Office
联系方式:FreeBSD office 团队邮件列表 <office@FreeBSD.org>
联系方式:Dima Panov <fluffy@FreeBSD.org>
联系方式: 許立文 <lwhsu@FreeBSD.org>
FreeBSD office 团队致力于多个与办公相关的软件套件和工具,如 OpenOffice 和 LibreOffice。
本季度的工作重点是为所有 FreeBSD 用户提供 LibreOffice 套件及其附属应用程序的最新稳定版本。
最新的季度 Ports 分支获得了 LibreOffice 套件的新分支(7.2),并更新至 7.2.4 版本,而新的预发布版本,如 7.2.5.RC2 和 7.3.0.RC1,正在 WIP(工作进行中)阶段准备中。
与此同时,我们的 WIP 仓库 又恢复了工作中的 CI 实例,感谢許立文的帮助。
我们还在继续更新 Boost WIP 仓库,将最新的 Boost 库引入 Port。
我们正在寻找愿意帮助处理以下开放任务的人:
开放错误列表,包含所有需要关注的已提交问题
在 Port 中向上游提交本地补丁
欢迎在邮件列表和 Bugzilla 上提交补丁、评论和异议。
许多项目基于 FreeBSD 构建,或将 FreeBSD 的组件集成到其项目中。由于这些项目可能对更广泛的 FreeBSD 社区感兴趣,我们有时会在季度报告中简要介绍这些项目提交的更新。FreeBSD 项目对于这些提交中的任何声明不作任何准确性或真实性的表态。
链接: 文档 链接: https://hellosystem.github.io/
联系方式:Simon Peter <probono@puredarwin.org>
联系方式:#helloSystem
在 irc.libera.chat
,并镜像至 #helloSystem:matrix.org在 Matrix
helloSystem 是基于 FreeBSD 预配置的桌面操作系统,专注于简洁、优雅和易用性。其设计遵循“Less, but better”(少即是多)哲学。
发布了版本 0.7.0,包含许多第三方的功能和 bug 修复
helloSystem 现在基于 FreeBSD 13.0-RELEASE
完全重新设计的 Live ISO 架构,启动时间缩短为原来的三分之一,大小不足 800 MB(适合 CD-ROM)
开发者工具现在是一个单独的下载项
磁盘映像在系统中的使用越来越多,例如用于应用程序分发和 Linux 兼容层用户空间部署
许多新功能和 GUI 工具使桌面更加易用,甚至无需终端即可让“普通用户”使用
可安装的 Live ISO 映像和完整的变更日志可在 https://github.com/helloSystem/ISO/releases/tag/r0.7.0 获取。
链接: 在 GitHub 上的 Pot 链接: https://github.com/pizzamig/pot
Potluck 仓库与项目 链接: https://potluck.honeyguide.net/
在 GitHub 上的 Potluck 链接: https://github.com/hny-gd/potluck
在 GitHub 上的 Potman 链接: https://github.com/grembo/potman
联系方式:Luca Pizzamiglio (Pot) <pizzamig@freebsd.org>
联系方式:Stephan Lichtenauer (Potluck) <sl@honeyguide.eu>
联系方式:Michael Gmelin (Potman) <grembo@FreeBSD.org>
Pot 是一款 jail 管理工具,也支持通过 Nomad 进行编排。
在过去的一个季度中,发布了新版本 0.14.0,修复了多个问题并增加了新特性,例如新的 copy-in-flv 命令。
Potluck 的目标是为 FreeBSD 和 Pot 提供类似于 Dockerhub 对 Linux 和 Docker 的支持:作为一个包含 Pot 风味和完整容器镜像的仓库,用于 Pot 和许多情况下的 Nomad。
在过去的一季度,我们也非常忙碌。所有镜像已针对 FreeBSD 12.3 和 pot 0.13.0 进行了重建。同时,用于构建虚拟数据中心的镜像,如 Nomad、Consul 和 Vault,得到了更多的改进,目前已在一家金融科技公司的集群中投入生产使用。 这些更改中的大部分尚未提交到 GitHub 仓库,但计划在下个季度提交。此外,还新增了 多主 OpenLDAP 等新镜像。
Potman 旨在简化基于 Potluck 方法的 Pot 镜像构建,使用 Vagrant 和 VirtualBox,作为软件开发 DevOps 工作流的一部分,包括测试并将其发布到仓库。
至于我们的计划,尚未在 Potluck 库构建过程中充分利用 Potman,但它仍在我们的待办事项清单上,例如改进使用 Potluck 库中的虚拟数据中心镜像的文档。
一如既往,欢迎反馈和补丁。