FreeBSD 2017 年 10 月-2018 年 9 月状态报告
引言
随着 FreeBSD 已经发布到版本 12,现在回顾一下所有已经完成的工作可能是有益的,无论是许多显著的变化,还是发生在幕后确保 FreeBSD 在设计、实现和执行方面持续提供替代方案的工作。
你可以期待阅读的内容有很多,涉及的内容几乎涉及了从发布的最终确定、行政工作、优化和性能提升、添加和修复的功能、以及许多可能会让你稍感惊讶的改进。
请准备好一杯咖啡、茶、热可可,或一切你喜欢的饮品,享受这份从 2017 年 10 月起至今的总结报告。
——Daniel Ebdrup
来自各种官方和半官方团队的条目,详见 管理页面。
联系方式:Jenkins 管理员 <jenkins-admin@FreeBSD.org>
联系方式:許立文 <lwhsu@FreeBSD.org>
FreeBSD CI 团队负责维护 FreeBSD 的持续集成任务。CI 系统定期检查提交到项目 Subversion 仓库的更改是否能够成功构建,并对构建结果进行各种测试和分析。CI 团队还维护着 CI 系统构建的工件存档,以供进一步的测试和调试使用。
自 2018 年 6 月起,该项目得到了 FreeBSD 基金会在硬件和人员方面的赞助。有关赞助项目的更多细节,请参阅:
此外,我们还帮助检查 OpenSSL 1.1.1 更新的回归,并持续为 12-STABLE 分支进行测试。
在 2018 年第三季度,我们在两个开发者峰会上举行了会议和工作小组:
正在进行的工作:
修复失败的测试用例和构建
增加对 -CURRENT 构建的 drm Port 测试
为选定的项目分支添加测试,例如:clang700-import
为嵌入式测试平台添加新硬件
在裸金属硬件上实施自动化测试
计划运行 ztest 和网络堆栈测试
联系方式:FreeBSD 核心团队 <core@FreeBSD.org>
过去几个月,核心团队的重点主要集中在三个方面:
各个小组之间的协调,以支持即将发布的 12.0 版本。OpenSSL 1.1.1 的发布时间带来了挑战。新的 OpenSSL 版本包含了 API 更改,因此许多基本系统和 Ports 需要进行相应的更改。在 12.0 中继续使用旧版 OpenSSL 并不可行,因为这意味着需要向一个上游已不再维护的 OpenSSL 版本回移许多更改。
与发布工程团队和 Scott Long 的讨论,关于更新 FreeBSD 发布流程的事项。探讨的主题包括:
更频繁的点版本发布
更改支持模型
修订并改进用于管理树和发布的工具
其他在过程中发现的主题
收集信息,以便做出更具数据驱动的决策。例如,我们计划进行开发者和用户调查。如果你有认为应当加入调查的问题,请在 freebsd-arch@ 上讨论。我们也在探索收集自动化硬件使用数据的方式。这将帮助项目了解我们软件使用方式的变化,并改进硬件支持。
以下是自上一季度报告以来的一些值得注意的事件(按时间顺序):
2017 第四季度
Sean Eric Fagan (sef@) 的提交权限在 Alexander Motin (mav@) 的辅导下被重新激活。
MIPS 架构被提升为二级地位。
核心团队批准了《行为规范》的修改。
所有 Fortune 数据文件,除了 freebsd-tips,都在 r325828 中被删除。
核心团队批准了采用一个政策,要求记录任何许可证例外,并与代码一同记录。
Gordon Tetlow (gordon@) 成为新的安全官。
核心团队批准了使用 SPDX 标签。
2018 第一季度
Jeb Cramer (jeb@) 在 Sean Bruno (sbruno@) 和 Eric Joyner (erj@) 的辅导下获得了源代码提交权限。
行为规范审查团队的成员被批准。该成员资格将每年审查一次。
Mellanox Technologies 的 Slava Shwartsman (slavash@) 在 Konstantin Belousov (kib@) 和 Hans Petter Selasky (hselasky@) 的辅导下获得了厂商提交权限。
Walter Schwarzenfeld 获得了项目成员资格。
Brad Davis (brd@) 在 Allan Jude (allanjude@) 的辅导下,并由 Baptiste Daroussin (bapt@) 共同辅导,获得了源代码提交权限。
Vincenzo Maffione (vmaffione@) 在 佐藤広生 (hrs@) 的辅导下获得了源代码提交权限。
Ram Kishore Vegesna (ram@) 在 Kenneth D. Merry (ken@) 和 Alexander Motin (mav@) 的辅导下获得了源代码提交权限。
2018 第二季度
Tom Jones (thj@) 在 Jonathan T. Looney (jtl@) 的辅导下获得了源代码提交权限。
Matt Macy (mmacy@) 的提交权限在 Sean Bruno (sbruno@) 的指导下恢复。
Breno Leitao (leitao@) 在 Justin Hibbits (jhibbits@) 的指导下,并由 Nathan Whitehorn (nwhitehorn@) 共同指导,获得了源代码提交权限。
Leandro Lupori (luporl@) 在 Justin Hibbits (jhibbits@) 的指导下,并由 Nathan Whitehorn (nwhitehorn@) 共同指导,获得了源代码提交权限。
第九届核心团队向第十届核心团队的交接完成。第十届核心团队成员为:Allan Jude (allanjude@)、Benedict Reuschling (bcr@)、Brooks Davis (brooks@)、佐藤広生 (hrs@)、Warner Losh (imp@)、Jeff Roberson (jeff@)、John Baldwin (jhb@)、Kris Moore (kmoore@) 和 Sean Chittenden (seanc@)。
Joseph Mingrone (jrm@) 被任命为核心秘书,指导老师为即将退休的核心秘书 Matthew Seaman (matthew@)。
新的团队联络人已确定。portmgr: Sean,doceng: 佐藤広生,secteam: Brooks,re: John,clusteradm: Allan,CoC: Warner,Foundation: Benedict,bugmeister: John,CI: Sean。
David Maxwell (dwm@) 获得了项目成员资格。
Daichi Goto (daichi@) 的提交权限在 George Neville-Neil (gnn@) 的指导下被重新恢复。
Intel 的 Ben Widawsky (bwidawsk@) 在 Ed Maste (emaste@) 的指导下获得了厂商提交权限。
2018 第三季度
核心团队决定开始每月召开两次会议,以应对大量新的议程事项。
許立文 (lwhsu@) 在 Mark Johnston (markj@) 的指导下,并由 Ed Maste (emaste@) 共同指导,获得了源代码提交权限。
Samy al Bahra 获得了项目成员资格。
George Neville-Neil (gnn@) 被批准开始共同辅导 Vincenzo Maffione (vmaffione@)。
联系方式:René Ladan <portmgr-secretary@FreeBSD.org>
在 2018 年第一季度,ports 的数量增长至接近 32,000。在 2018Q1,存在 2,100 个开放的 PR,其中少于 600 个未分配。共有 7,900 次提交,来自 169 名提交者。与上个季度相比,提交次数增长了 18%,而 PR 数量减少了 25%。这些都是不错的数字!
在 2018Q2 和 2018Q3 季度,ports 的数量增长至接近 34,000。开放的 PR 数量增长至接近 2,500,其中少于 600 个未分配。共有 175 名提交者进行了接近 14,200 次提交。与第一季度相比,提交次数减少了 10%,而 PR 数量增长了 19%。
在过去的三个季度中,portmgr 暂时保管了十二项提交权限:daichi@、deichen@、ian@、junovitch@、kevlo@、maho@、nemysis@、pawel@、rea@、tabthorpe@、vg@ 和 wxs@。
Portmgr 在 2018Q2 和 2018Q3 欢迎了十三名新提交者:
Devin Teske (dteske@)
Eric Turgeon (ericbsd@)
Fernando Apesteguía (fernape@)
Fukang Chen (loader@)
Gleb Popov (arrowd@)
Jesper Schmitz Mouridsen (jsm@)
John Hixson (jhixson@)
Kevin Bowling (kbowling@)
Koichiro IWAO (meta@)
Mateusz Piotrowski (0mp@)
Matthias Fechner (mfechner@)
Sergey Kozlov (skozlov@)
以下提交者在休假后回归:
Ion-Mihai Tetcu (itetcu@)
Kevin Lo (kevlo@)
Sean Chittenden (seanc@)
在过去的三个季度中,Antoine Brodin (antoine@) 对 Ports 进行了不少于 113 次 exp-run。执行这些运行的目的是测试更新、进行清理并改进框架和基本系统。大多数运行是针对 Port 升级的,但也包括 LLD 进展、默认 Port 版本的更改、对 armv6、armv7 和 RISC-V 架构的改进支持、移除旧的基本系统功能、新的 USES,以及更好的 pkg-plist 与 Makefile 选项的匹配(DOCS 和 EXAMPLES)。
引入了五个新的 USES 值:
apache: 处理对 Apache 网络服务器及其模块的依赖
eigen: 自动依赖 math/eigen2 或 math/eigen3
emacs: 处理对 Emacs 编辑器及其模块的依赖
gl 替代了 bsd.port.mk 中的旧 USE_GL
qt-dist、qt:4 和 qt:5 替代了 bsd.qt.mk 中的旧 USE_QT
EXTRA_PATCHES 功能已扩展,支持目录,其中它将自动应用所有 patch-* 文件到 Port。
使用 USES=php:phpize、php:ext、php:zend 和 php:pecl 的 Port 已经进行风味化,并且现在会为所有支持的 PHP 版本(5.6、7.0、7.1 或 7.2)自动构建软件包。
2018Q3 更新了主要 Port:pkg 1.10.5、Chromium 65.0.3325.181、Firefox 59.0.2、Firefox-ESR 52.7.3、Ruby 2.3.7/2.5.1 和 Qt5 5.9.4。默认的 PHP 版本从 5.6 更改为 7.1。开发者不再支持 PHP 的旧版本。默认版本的 Samba 和 GCC 现在分别为 4.7 和 7。Port Xorg 进行了重新组织,并且对 net/openntpd 进行了更改。请查看 UPDATING 文件以获取相关细节。
待办事项
在过去的三个季度中,提交次数有所下降,导致更多的 PR 未解决。如果可能的话,请挑选一些 PR,改善大家的体验。
联系方式:FreeBSD 发布工程团队 <re@FreeBSD.org>
FreeBSD 发布工程团队的职责包括:
为 FreeBSD 的正式项目发布设置和发布发布计划
宣布代码冻结、解冻等发布阶段
维护所有受支持版本的相应分支
由 Marius Strobl 领导的 FreeBSD 发布工程团队于 2017 年 10 月初完成了 10.4-RELEASE。FreeBSD 10.4-RELEASE 是稳定/10 分支的第五个版本,建立在 10.3-RELEASE 的稳定性和可靠性基础上。
FreeBSD 11.2-RELEASE 循环于 2018 年 4 月 20 日启动,并宣布进入代码冻结阶段。该阶段的进展持续到整个季度,并经历了代码冻结、三次 BETA 构建、三次 RC 构建,最终发布版本于 2018 年 6 月 27 日宣布。
FreeBSD 发布工程团队于 2018 年 8 月 10 日启动了 12.0-RELEASE 循环,宣布进入代码冻结阶段。代码冻结随后于 2018 年 8 月 24 日进行。稳定/12 分支的初步发布日期预计为 2018 年 9 月 21 日。
由于需要包括的上游代码发生了不可预见的变化,12.0-RELEASE 的初步发布计划不得不多次调整。上游代码更新版本中的 API 变化要求对所有与上游代码链接的基本系统实用程序进行更改。到 2018Q3 季度结束时,由于此延迟,稳定/12 分支尚未创建。
在 2018Q3 余下的时间里,发布了多个开发快照版本,涉及了 head、稳定/11 和稳定/10 分支。
这一工作的大部分由 FreeBSD 基金会赞助。
联系方式:Deb Goodkin <deb@FreeBSDFoundation.org>
FreeBSD 基金会是一家 501(c)(3) 非营利组织,致力于支持和推广全球范围内的 FreeBSD 项目和社区。资金来自个人和企业捐赠,用于赞助和管理软件开发项目、会议和开发者峰会,并向 FreeBSD 贡献者提供差旅赞助。基金会购买并支持硬件,以改进和维护 FreeBSD 基础设施,并提供资源以改善安全性、质量保证和发布工程工作;发布营销材料以推广、教育和宣传 FreeBSD 项目;促进商业供应商与 FreeBSD 开发者之间的合作;最后,代表 FreeBSD 项目执行合同、许可协议和其他需要合法实体的法律安排。
以下是 FreeBSD 基金会在上个季度为支持 FreeBSD 所做的部分工作亮点:
合作伙伴关系与商业用户支持
作为一家 501(c)(3) 非营利组织,我们不会直接支持商业用户,但我们确实与他们合作,了解他们的需求,并帮助促进与社区的合作。在上个季度,我们与一些关键的 FreeBSD 用户和支持者进行了会面,讨论了他们遇到的问题、如何回馈 FreeBSD 以及他们希望支持的技术,以便在更多的技术和产品中使用 FreeBSD。
正如许多人所知,我们与英特尔的合作始于约一年半前。自那时以来,我们直接合作的人员已经离开公司,但这使我们进入了与其开源技术中心(OTC)的新关系。
我们非常高兴地看到英特尔从 OTC 调配了额外的资源来支持 FreeBSD,除了网络组和其他技术(如 QuickAssist)现有的资源之外。许多工作集中在安全性和操作系统缓解措施上,但我们也在关注其他领域,如电源管理和持久内存。我们在 5 月和 7 月分别前往英特尔的 Hillsboro 校区,与 OTC 和网络团队的管理人员及工程师进行了会面。我们展示了项目和基金会的概述,并讨论了使用 FreeBSD 的关键市场和供应商,以及他们的未来需求。
英特尔也对了解更多关于谁在贡献 FreeBSD 感兴趣。在这方面,我们与 OTC 合作创建了脚本和组织映射,以回答这个问题。请注意,我们确实需要开发者帮助我们更新和维护这些组织映射,因为我们了解到开发者往往会变动,而承包商通常为多个组织工作。
筹款工作
我们的工作完全由你的捐赠赞助。截至 9 月 30 日,我们筹集了 328,482 美元。我们的 2018 年筹款目标是 1,250,000 美元,我们将继续努力实现并超越这一目标!请考虑捐款,帮助我们继续并增加对 FreeBSD 的支持:https://www.FreeBSDfoundation.org/donate/
我们还有一个新的合作伙伴计划,为我们较大的商业捐赠者提供更多福利。了解更多信息请访问 https://www.FreeBSDfoundation.org/FreeBSD-foundation-partnership-program/ 并与你的公司分享!
改进操作系统
基金会通过聘用技术人员来改进 FreeBSD 操作系统,维护和改进关键的内核子系统,增加功能和特性,并修复问题。这还包括赞助独立的项目赞助,如 arm64 移植、黑名单访问控制守护进程的移植,以及 VIMAGE 支持的集成,以确保 FreeBSD 仍然是研究、教育、计算、产品等领域的可行解决方案。
在上个季度,我们启动或继续了以下项目:
OpenZFS RAID-Z 扩展项目
为 Beaglebone Black 等嵌入式 ARM 板提供开箱即用的无头模式
性能和可扩展性改进
通过拥有软件开发人员,基金会能够直接参与项目,改进 FreeBSD,例如:
改进 ZFS
支持新的 Intel 服务器
更新kqueue(2)
支持 64 位 inode
堆栈保护
内核未定义行为检查器
工具链项目
调查 i915 驱动程序
在 acpiconf(8) 中支持 NVDIMM
持续集成仪表盘(网页和物理硬件)
makefs(8) 中的 FAT 文件系统支持
持续集成与质量保证
基金会提供了一名全职员工,专门致力于改进我们的自动化测试、持续集成以及整体质量保证工作。
基金会员工許立文设置了新的 CI 服务器,以加速 amd64 构建和测试任务,减少从提交更改到结果可用之间的延迟。Li-Wen 还设置了一个暂存/开发服务器,以便测试 CI 系统本身的更改,而不会影响生产环境的结果。我们还启动了一个小型硬件测试实验室,当前与暂存服务器连接,测试物理硬件上的完整启动和测试周期。未来将增加更多硬件设备,且该实验室将迁移到生产 CI 服务器。
发布工程
基金会提供了一名全职员工领导发布工程工作。过去五年里,这一工作确保了及时且可靠的发布。
基金会员工 Glen Barber 继续领导即将发布的 12.0-RELEASE 工作。有关 12.0-RELEASE 的工作细节和进展,请参见本季度状态报告中的 FreeBSD 发布工程团队部分。
支持 FreeBSD 基础设施
基金会提供硬件和支持,以改进 FreeBSD 基础设施。上个季度,我们继续支持全球范围内的 FreeBSD 硬件。
FreeBSD 宣传与教育
我们的大部分工作致力于宣传项目。这包括推广他人使用 FreeBSD 的工作;制作宣传资料,帮助人们了解 FreeBSD,并简化开始使用 FreeBSD 或参与项目的路径;参与并鼓励其他 FreeBSD 贡献者志愿举办 FreeBSD 活动、管理 FreeBSD 展台、进行 FreeBSD 演讲。
FreeBSD 基金会赞助了全球范围内的多个会议、活动和峰会。这些活动可以是 BSD 相关、开源的,或是面向代表性不足群体的技术活动。我们支持 FreeBSD 相关活动,以提供一个共享知识、共同开展项目、促进开发者与商业用户之间合作的场所。所有这些都有助于提供一个健康的生态系统。我们支持非 FreeBSD 活动,以推广和提高 FreeBSD 的认知度,增加 FreeBSD 在不同应用中的使用,并招募更多贡献者。
查看我们在上个季度的一些宣传与教育工作:
组织并举办了德国埃森的 FreeBSD 黑客马拉松
参加了英国剑桥的 FreeBSD 开发者峰会 BSDCam
在 ARM 合作伙伴会议上代表 FreeBSD
在苏丹喀土穆的 SdNOG 5 上展示并讲授 FreeBSD
在俄勒冈州波特兰的 OSCON 2018 展示并进行讲座
参加了 2018 年的 Grace Hopper 庆典并作为银牌非营利赞助商赞助
参加了 2018 年的 COCON 展会,在台湾台北展示
作为赞助商并在罗马尼亚布加勒斯特的 EuroBSDCon 上进行演讲和教程
组织并举办了布加勒斯特的 FreeBSD 开发者峰会
作为行业合作伙伴赞助了 2018 年 USENIX 安全研讨会(美国马里兰州巴尔的摩)
提供了 FreeBSD 宣传材料
作为行业合作伙伴赞助了 2018 年 USENIX 年度技术大会(美国马萨诸塞州波士顿)
作为银牌赞助商赞助了 OpenZFS 开发者峰会
在孟加拉国达卡的 SANOG32 上展示并讲授 FreeBSD
作为合作伙伴赞助了 2018 年 SNIA 存储开发者大会
向 FreeBSD 贡献者提供了 11 个差旅赞助,以参加上述多个活动。
我们继续制作 FreeBSD 宣传材料,帮助全球推广 FreeBSD。
通过我们每月新闻通讯中的会议回顾和旅行报告,了解更多关于我们的会议历程:https://www.freebsdfoundation.org/news-and-events/newsletter/
我们通过出版专业制作的 FreeBSD 期刊来帮助全球了解 FreeBSD。在上个季度,我们出版了 7 月/8 月期,你可以在 https://www.FreeBSDfoundation.org/journal/ 查阅。
你可以通过 https://www.FreeBSDfoundation.org/news-and-events/ 了解我们参加过的活动和即将举行的活动。
法律/FreeBSD 知识产权
基金会持有 FreeBSD 商标,保护这些商标是我们的责任。我们还为核心团队提供法律支持,调查出现的问题。
请访问 http://www.FreeBSDfoundation.org 了解我们如何支持 FreeBSD 以及我们如何帮助你!
涵盖多个领域的项目,从内核和用户空间到 Ports 或外部项目。
联系人:Brooks Davis <brooks@FreeBSD.org>
作为维护外部 ABI(应用程序二进制接口)兼容层的一部分,我一直在改进 FreeBSD 基础设施,主要是 32 位兼容层。FreeBSD 的一个优势是我们可以轻松支持许多 ABI。这包括对 a.out 格式可执行文件(与标准 ELF 相对)、对 amd64 上的 i386 支持、Linux 模拟层等的支持。
这一基础设施已存在数十年,并非每个设计决策都经得起时间的考验。在多个领域(例如 32 位模拟下的网络管理)的支持也并不完整。
已提交的改进包括:
改进 ioctl 和 sysctl 支持,使 ifconfig 和 netstat 能在 32 位兼容模式下正常工作。
从内核边界翻译 ioctl 命令和数据结构的模型迁移到翻译命令处理位置的模型。这是一个正确性改进(
ioctl
命令在特定文件描述符之外没有意义),并改善了代码的可重用性(我的非树外工作很快将包括一个 64 位兼容层)。Ed Maste、John Baldwin 和我自己简化了通用 ELF 进程执行路径。已提交了一些简化内容,包括轻微的性能提升。
部分工作由 SRI 国际和剑桥大学计算机实验室(计算机科学与技术系)在美国国防高级研究计划局/美国空军研究实验室合同 FA8750-10-C-0237(“CTSRD”)下开发,作为美国国防高级研究计划局 CRASH 研究计划的一部分,以及在美国国防高级研究计划局合同 HR0011-18-C-0016(“ECATS”)下,作为美国国防高级研究计划局 SSITH 研究计划的一部分。
正在进行的工作包括清理内核创建进程时使用的 API,以及持续的 ioctl 改进。我们还在努力从“默认”列表生成 32 位系统调用列表。
剩余的 ioctl 命令需要迁移到实现点,可以参考 sys/compat/freebsd32/freebsd32_ioctl.c 进行进一步工作,欢迎提供帮助。
联系人:Konstantin Belousov <kib@FreeBSD.org>
过去十年,随着软件大小的迅速增长,大多数 32 位 FreeBSD 架构(包括 i386)开始遭遇问题。当 32 位地址空间足够满足某一任务时,32 位模式在内存流量更少和缓存使用更经济等方面仍然具有固有优势。然而,由于构建工具的体积不断增大,提供自托管的 i386 系统构建变得越来越困难。
FreeBSD i386 内核在 12.0-RELEASE 版本之前,将平台的 4GB 地址空间分为 3GB(减去 4MB)供用户空间访问,1GB 供内核访问。无论是内核还是用户空间,都无法访问完整的 4GB 地址空间。需要非常大的虚拟地址空间的程序,例如 clang 编译时或 lld 链接时,可能会耗尽地址空间:3GB 的地址空间不足以满足它们的操作。内核也很难适应传统的 1GB 地址空间限制,尤其是现代网络缓冲区、ZFS 和其他需要大量 KVA 的内核子系统。
在 FreeBSD 12 中,i386 架构已经改变,为用户空间和内核提供了专用的独立地址空间,使每种模式都可以完全访问 4GB(减去 8MB)的可用地址空间。i386 架构上的用户空间现在可以访问与 amd64 架构内核中的 compat32 子系统相同的地址空间量。内核地址空间的增加使得 i386 架构的进一步增长和可维护性成为可能。
4GB/4GB 用户/内核实现使用两个页目录项(PDE)在模式间共享:一个用于映射页表,另一个用于模式切换跳板和其他所需的系统表。必须始终映射的系统表,不论是内核模式还是用户模式,包括 GDT/IDT/TSS 条目等。locore 代码进行了重大修改。代码的页表创建部分从汇编重写为 C,提高了代码的可读性和可维护性。
由于用户地址空间不再与内核共享,copyout(9) 函数已被重写,以在需要访问时为用户空间页面创建临时映射。初始实现使用了 vm_fault_quick_hold_pages() 框架,但随后通过从跳板暂时切换到用户模式映射,并使用手写汇编例程执行更快速的小块拷贝操作进行了优化。
未来 i386 的持续维护计划包括使 i386 pmap 能够在运行时选择 PAE 或非 PAE 页表格式,并支持常规 i386 内核的 NX(不可执行)映射。
该项目由 FreeBSD 基金会赞助。
联系人:Konstantin Belousov <kib@FreeBSD.org>
NVDIMM 是一种技术,提供类似于常规 DRAM 的访问特性,且具有非易失性内存,是实现主机常规内存地址空间的技术。ACPI 和 UEFI 规范定义了平台独立的方式来检测和枚举 NVDIMM 的存在。这些规范允许检索大多数所需的数据,以便正确地使用 NVDIMM 存储。
一个新的 FreeBSD 驱动程序解析 ACPI NFIT 表,该表列出了 NVDIMM、其操作特性和 NVDIMM 内存的物理地址空间。该驱动程序将每个地址区域呈现为两个设备:一个设备允许用户空间打开(2)一个 devfs 节点,可以从应用程序读取/写入/映射。此映射为零拷贝。第二个设备是一个 geom disk(9),它使得可以将 NVDIMM 用作常规 FreeBSD 文件系统(如 UFS、ZFS 或 msdosfs)的后端存储。请注意,创建在 NVDIMM 上的传统文件系统上的文件的缓冲区缓存/映射会导致不必要的双重缓冲。
根据经验,在典型的现代硬件上,NVDIMM 区域位于地址空间中远离常规 DRAM 支持的内存,并且具有与常规 DRAM 内存不兼容的属性。这使得将内核的直接映射扩展以为 NVDIMM 区域提供内核映射变得不可行。设计了一个新的 pmap KPI,即 pmap_large_map(9),它允许高效地将非常大的物理区域映射到 KVA。新代码对映射区域的缓存刷新操作进行了一些优化,这是为了高效支持使用 NVDIMM 存储的文件系统的 bio 刷新。NVDIMM 驱动程序是该新 KPI 的第一个使用者,但该新 KPI 也可能对 NTB 驱动程序有用。
待办事项
英特尔目前正在扩展驱动程序以支持 UEFI 名称空间。
需要一个支持 DAX 的文件系统,解决双重缓冲问题。我们的 tmpfs 已经提供了 VM 功能,允许它避免 mmap 的双重缓冲,这可以在此处重用。
该项目由 FreeBSD 基金会赞助。
联系人:Warner Losh <imp@FreeBSD.org> 联系人:Kyle Evans <kevans@FreeBSD.org> 联系人:Toomas Soome <tsoome@Freebsd.org>
FreeBSD 引导加载程序位于 src/stand(以前的版本位于 sys/boot 和 lib/libstand)。它涉及了项目提供的所有与硬件交互的代码,这些代码在内核启动之前运行。
2018 年初添加的 LUA 解释器已在 2018Q3 中成为默认选项。由于引导问题未解决,已在 sparc64 和所有 powerpc 平台上禁用 LUA 解释器。计划在 FreeBSD 13 中完全用 LUA 解释器替换 FORTH 解释器,尽管 FORTH 解释器将在 FreeBSD 12 中作为构建选项继续可用。计划是在 12.0 发布后的约一年内(即 2020 年 1 月)不删除 FORTH 加载程序。当前不支持 LUA 解释器的平台将在此日期之前解决问题。
目前,LUA 脚本实现了 FORTH 脚本的所有功能。在规格不明确或 FORTH 脚本比严格文档化的更宽容的地方,已尽力改进文档,并遵循旧的 FORTH 行为,或在旧行为显然是错误时文档化新行为。
预计不会再对 FORTH 加载程序或 FORTH 脚本进行任何更改。它们目前非常成熟且无可挑剔,发现未修复的错误的可能性很小,除非在退役之前出现。
正在进行的其他工作包括 Toomas Soome 移植到 OpenIndiana。除了移植工作,他还以多种方式增强了代码(包括块层和 UEFI)。他的许多改进已经提交到 FreeBSD,虽然仍有一些改进尚未提交,预计在冻结解除后不久将进入主干。
UEFI 启动得到了极大增强。仍有一些机器存在与默认的 BootXXXX 变量或环境中的其他问题,正在进行调查。我们希望能足够了解这些问题,并在 FreeBSD 12.0 中提供修复。
Ian Lepore 已重新设计 GELI 支持,使其具有架构独立性,可以在我们支持的任何架构上使用。
此外,还有支持启动签名镜像、改进加密启动选项和实现 Multiboot 2.0 支持的工作。
联系人:Alex Richardson <arichardson@FreeBSD.org>
目前,FreeBSD 只能在 FreeBSD 主机上构建。然而,大多数免费的 CI 工具只能在 Linux 和 macOS 上构建,因此无法用于构建 FreeBSD 基本系统。有时,即使构建主机不是运行 FreeBSD,也需要交叉构建 FreeBSD,尤其是针对远程机器或模拟器。本项目的目标是使得在 Linux 和 macOS 主机上构建 FreeBSD 成为可能,并且后续可能扩展到支持在 Windows 主机上进行编译。此工作源自 CHERI 项目,起初是为了满足许多用户希望尝试 CheriBSD,但由于没有可用的 FreeBSD 系统进行编译而无法编译的需求。待完成,该项目还将允许开发人员即使没有访问 FreeBSD 构建系统,也能为 FreeBSD 做出贡献。
本项目当前的补丁集可以在 GitHub 上找到。使用当前的原型,能够为使用 clang 编译器的架构以及使用 gcc 的 MIPS64 编译 world 和 kernel。然而,像 LOCALES 这样的选项目前尚不支持,需要进一步修改才能使得启动工具在 Linux/macOS 上构建。
一些为在非 FreeBSD 上构建所需的更改已经合并到 HEAD 中,但仍有相当多的更改需要审查。
如果你有兴趣将这些更改合并到 HEAD 并希望提供帮助,请尝试当前原型并将任何问题报告给 arichardson@FreeBSD.org。如果你能帮助审查这些更改,请联系 arichardson@FreeBSD.org 以便加入任何待处理的 Phabricator 审查。
联系人:Edward Tomasz Napierala <trasz@FreeBSD.org>
许多嵌入式板载硬件支持设备端 USB —— 即板子能够作为 USB 驱动器、网络适配器或虚拟串口向另一系统呈现自己。FreeBSD USB 堆栈已经支持这一功能一段时间,但其功能并未得到充分利用。
本项目的目标是解决这个问题——文档化功能,修复一些 bug,并使其易于使用,尽可能地自动化。
从 FreeBSD 12.0 开始,这一功能开箱即用。这意味着你可以将 BeagleBone Black(使用其 USB 客户端插座)和树莓派 Zero(使用 On-The-Go(OTG)端口)连接到笔记本电脑,你将获得虚拟 USB 串口,作为系统控制台,getty(8)会等待你登录。这意味着你不再需要寻找键盘和屏幕,或处理控制台电缆来配置系统。你还可以将其切换为提供网络接口,或作为 USB 驱动器呈现——所有内容都在 FreeBSD 手册中有详细说明。
该项目由 FreeBSD 基金会赞助。
联系人:Michał Krawczyk <mk@semihalf.com>
ENA(弹性网络适配器)是用于 Amazon Web Services(AWS)虚拟化环境中的智能网卡。它支持多个队列,并根据所使用的实例类型,能够处理高达 25 Gb/s 的数据传输速度。
自上次报告以来,ENA 版本 v0.8.0 和 v0.8.1 已发布,包含了许多 bug 修复、新功能、优化、稳定性和错误恢复改进。最后一项对于 AWS 尤为重要,因为这些实例必须保持可靠性,因其可能运行非常敏感的功能,且虚拟机的停机时间应尽量减少。
v0.8.0 和 v0.8.1 版本的补丁内容包括:
将 HAL 升级到 v1.1.4.3 版本
改进重置例程——驱动程序现在可以从更多故障点触发重置,并将重置原因传递给设备,设备可以根据遇到的错误执行适当的重置操作。
设备统计信息(如全局 Tx 和 Rx 计数器)不再直接从设备读取。唯一的例外是 Rx 丢包,仍然使用 AENQ 描述符读取。
添加了 RX 出序完成特性,该特性通过跟踪所有空闲描述符来清理不按顺序的 RX 描述符。
现在监控 RX 环,以防止环被卡住。
错误处理路径已被重构和修复。
驱动程序覆盖了分支预测语句,以便在热路径中充分利用此 CPU 特性。
修复了 IP 数据包中 DF 标志的处理。
增加了动态日志记录,并减少了驱动程序打印的消息数量。
MTU 配置现在使用设备能力进行验证,而不是使用常量值。
不将数据包头长度提示传递给设备,因为对于链式 mbuf,当头部拆分为多个段时,可能很难确定头部长度。
该项目由亚马逊公司赞助。
联系人:FreeBSD 图形团队 <x11@FreeBSD.org> 联系人:Niclas Zeising <zeising@FreeBSD.org>
FreeBSD X11/图形团队负责 FreeBSD 图形堆栈的低层部分。这包括图形驱动程序、图形库(如 MESA OpenGL 实现)、X.org xserver 及相关库和应用程序,以及 Wayland 和相关库及应用程序。
自上次报告以来,发生了很多变化。最重要的一点是驱动程序分发和更新方式的变化。在 FreeBSD 11.2 及以后的版本中,使用 Linux KPI 子系统的现代图形驱动程序可以在 ports 中找到。这些驱动程序大大改善了对 Intel 和 AMD 图形硬件的支持,但目前仅适用于 amd64 架构。
FreeBSD 基本系统中的传统驱动程序也可在 Ports 中找到,因为它们与新驱动程序存在冲突。它们将在 11.2 和 12 版本中继续存在,但正在进行工作,计划在 13 版本中移除,除了 arm 架构之外。
安装新驱动程序的最简单方法是安装 graphics/drm-kmod
,它会根据你的架构和 FreeBSD 版本自动安装正确的驱动程序。
ports 中也有一些变化。最显著的是 OpenGL 依赖项的处理方式发生了变化,现已转移到 USES 中,而不再直接在 bsd.port.mk
中处理。另一个重要的基础设施变化是将单独的 *proto
包合并为 xorgproto
,并将其作为构建时依赖项。感谢 portmgr 对这些变更的 exp-runs 帮助。
根据需要,应用程序和库也得到了更新。
在项目管理方面,正在开展一项工作,旨在建立一种更高效的工作方式,包括每两周一次的电话会议,讨论当前的工作进展。这些电话会议的记录将会发布到邮件列表上。
展望未来,目前正在进行的主要工作是将图形驱动程序更新到与 Linux 4.17 相当的版本。代码已经合并,但修补和 bug 修复仍在进行中。
另一个工作是将 VMware 虚拟机图形驱动程序 vmwgfx 移植到 FreeBSD 并支持 Linux KPI,以便在 VMware 中提供更好的图形支持。
最后,驱动程序方面的工作是使新图形驱动程序也能在 i386 上工作。对此的实验性支持已存在于代码库中,但尚未合并到 FreeBSD Ports 中。
在用户空间方面,最大的变化是输入堆栈的更新,包括 libinput 和支持库。
MESA 库的更新工作也在进行中。
在项目管理方面,最重要的任务是继续致力于团队建设,并优化内部工作流程。
我们还在努力建立一份测试需求清单,以确保更新不会导致回归问题。
有兴趣帮助的人可以通过 x11@FreeBSD.org 邮件列表联系我们,或者加入我们的 Gitter 聊天:https://gitter.im/FreeBSDDesktop/Lobby。我们还在 EFNet 的 #freebsd-xorg 频道中可用。
我们还在 GitHub 上有一个团队区域,你可以在那里找到我们的工作仓库:https://github.com/FreeBSDDesktop
联系人:George Neville-Neil <gnn@FreeBSD.org>
联系人:Domagoj Stolfa <domagoj.stolfa@cl.cam.ac.uk>
DTrace 是 FreeBSD 中一款全系统调试工具,是过去一年内积极支持的项目之一。
目前,剑桥大学在 CADETS 项目中开发了 DTrace 的分布式版本原型以及一个可以从宿主 FreeBSD 系统跟踪 bhyve 虚拟机的 DTrace 版本。最近的进展包括创建了 dlog,一个内核中的 DTrace 消费者,能够发布到 Kafka,并且对早期启动和关闭跟踪进行了改进。在虚拟化方面,通过在 DTrace 中实现对 Intel 架构的嵌套页表遍历,改进了从宿主系统在探针上下文中取消引用并跟踪虚拟机中的指针的能力。CADETS 项目已开始在 HOL4 中正式化 DTrace,这使得可以自动生成测试,确保 DTrace 实现严格遵循规范,并探索给定 D 脚本的所有允许行为。目前,正式模型包含大多数 DIF 指令及其代码生成器,提供了使用 FreeBSD 的 DTrace 实现运行通过模型指定的 DIF 程序的能力。
因此,许多更改已经上游合并到 FreeBSD 审计子系统,并且新增了诸如 jid 和 jailname 等变量,DTrace 中的 D 脚本可以访问这些变量。
OpenDTrace 规范 1.0 已发布,涉及了 DTrace 的内部工作原理,尤其是其在各种操作系统中的适配。此工作由 AFRL/DARPA 通过 CADETS 项目赞助。
Ruslan Bukin (br@) 为 RISC-V FBT 提供程序添加了 C 压缩 ISA 扩展支持,作为 ECATS 项目的一部分。
Mark Johnston (markj@) 对 FBT 和 ifuncs 之间的交互做了一些修复。ifuncs 是一种工具链特性,允许程序员在启动时选择函数的实现,而不是在编译时选择。例如,在 amd64 上,memcpy() 是一个 ifunc,并且可以由 memcpy_erms() 或 memcpy_std() 实现。FBT 为实现函数创建了探针,但我们需要一些额外的支持,以确保 fbt::memcpy:entry 按预期工作。PID 提供程序也需要类似的工作,但仍在待处理状态。
微软展示了 DTrace 的工作演示,该演示是从 FreeBSD 移植过来的。
在 FreeBSD 11.2 中添加的 dwatch 是一个新的 DTrace 工具,由 Devin Teske (dteske@) 开发,用于自动化复杂的数据查询和精确地监视内核。在基本系统中,有 85 个用于解释特定领域数据的配置文件,另有 17 个可从 ports 获得,总共有超过 100 个不同的数据管道,你可以从中提取多种格式的数据。dwatch 还简化了对 FreeBSD 中超过 100,000 个探针点的观察,使得很容易找到触发任何探针的进程、线程或 jail。最重要的是,dwatch 配置文件可以利用 Python、Perl、sh 等高级语言。
联系人:Konstantin Belousov <kib@FreeBSD.org>
联系人:Ed Maste <emaste@FreeBSD.org>
联系人:Mark Johnston <markj@FreeBSD.org>
联系人:Mateusz Guzik <mjg@FreeBSD.org>
ifunc 是 ELF 对象中的一种特殊构造,允许在运行时选择给定符号的实现,当 ELF 模块应用最终重定位时。选择使用哪段代码由一个用户提供的小段代码控制,附加到符号上,这就是所谓的解析函数(resolver function)。ifunc 提供了一种方便的方式,在不同的机器特定实现之间进行选择,而不需要使用替代方法(如运行时修补程序)所带来的复杂性和不安全性。
ifunc 需要静态链接器 ld(1) 和相应执行环境的运行时链接器支持。在 FreeBSD 上,随着从古老的 GPLv2 许可的 BFD 基础的 ld(1) 转向树内的 LLD 或外部现代 BFD ld,ifunc 的使用变得可能。对于以下环境,已实现 ifunc 支持的运行时链接器:
i386、amd64 和 arm64 内核
i386 和 amd64 上的用户模式动态链接器 ld-elf.so.1
i386 和 amd64 的静态二进制启动代码
ifunc 以前已应用于优化以下 amd64 内核的部分:
上下文切换代码,避免了大量的运行时检查(PTI 与非 PTI,是否支持 PCID,是否支持 INVPCID 指令),现在使用一组特定模式的例程,见 pmap_activate_sw()。除了消除运行时检查外,还使代码更加简洁易懂。
TLB 和缓存刷新实现。
memcpy/memmove,copyin/copyout 变体的选择,针对 ERMS 和 SMAP。
FPU 状态保存与恢复,取决于是否支持 AVX,这在 i386 上也有使用。
对于 amd64 用户空间,我们目前使用 ifunc 优化与架构相关的 TLS 基础集和 get 函数。
此项目由 FreeBSD 基金会赞助。
联系人:Ben Widawsky <bwidawsk@FreeBSD.org>
英特尔成立了一个新团队,专门帮助解决侧信道安全缓解问题以及核心启用工作。他们正在评估来自所有领域的工作,除了网络领域。该团队目前专注于两个领域:
改进电源管理
NVDIMM 命名空间支持
电源管理工作的最终目标是实现“机会空闲”状态的运行时电源管理。这意味着,当设备空闲时,操作系统将使其断电,并且当所有设备空闲时,某些 SoC 将允许平台进入非常低的功耗状态。FreeBSD 当前没有运行时电源管理的概念,许多设备也没有正确实现挂起和恢复功能。此外,某些初步工作正在进行中,预计将有助于启用机会空闲。相关初步工作已完成,并正在审查中:
NVDIMM 命名空间支持也已提交审查。ACPI 规范将命名空间定义为一种将设备划分为独立标签的方式。目前的工作将与 geom(4) 集成。如何使用这些命名空间取决于应用程序。此项工作也正在审查中:https://reviews.FreeBSD.org/D17619
该团队还承担了较小的任务,如移植 turbostat(8),处理 git svn 初始化脚本,进行一些小的 ACPI 工具修改,以及创建 PMDK 的 Port。
联系人:Mateusz Guzik <mjg@FreeBSD.org>
在一台拥有 128 个线程的机器上使用 poudriere 构建包时,会遇到一些瓶颈。
请参见 10 月份的 FreeBSD 基金会新闻简报中的简短说明:https://www.freebsdfoundation.org/news-and-events/newsletter/freebsd-foundation-update-october-2018/
一个遇到的问题源于进程处理。
类 UNIX 系统上的标准进程生命周期如下:
使用 fork(2) 创建一个进程
它可以执行常规工作或使用 execve(2) 启动一个新二进制文件
它退出,成为僵尸进程
父进程收集退出代码并移除僵尸进程
还有其他变体(例如,vfork(2) 可以代替 fork)。
当你在 shell 中键入 'ls' 时,它通常会 vfork 一个新进程,然后 execve /bin/ls。
所有这些操作都受到多个全局内核锁的保护,但其粒度可以显著提高。
另一个问题源于管道。
管道经常被使用,例如,“du -s | sort -n” 创建了一个管道,其中一个端点是 du 的标准输出,另一个端点是 sort 的标准输入。
默认情况下,管道最多可以容纳 16KB 数据,超过这个容量后就会被填满。
内核将其虚拟地址空间的一部分分配给管道缓冲区,并在创建/销毁管道时分配/释放物理页面。这会导致 TLB 无效化请求,从而导致不必要的性能下降。
一种简单的解决方法是缓存一定数量的缓冲区。
此项目由 FreeBSD 基金会赞助。
联系人:David Carlier <devnexen@gmail.com>
为了增强 FreeBSD 工具链以发现用户空间中的代码错误,自上个 6.0 版本以来,已增加了更多的 compiler-rt 组件支持和静态代码分析改进。
从 sanitizers 开始,Memory Sanitizer(用于 amd64)主要用于检测未初始化的指针。大多数 sanitizers 还提供了简单的 W^X 页请求检测功能。
此外,libFuzzer 支持也终于得以实现。它允许通过输入语料库中的随机值测试代码。可以重写这些随机输入的变异和组合算法。它还可以与 ubsan、asan、msan 等一起使用。
最后,X-Ray 仪器功能也得到了支持。它主要用于性能分析,以合理的运行时成本进行性能分析。
在静态代码分析方面,可靠的 strlcpy(遗憾的是,strlcat 未能及时合并到发布版本中)错误使用情况现在得到了覆盖,并且添加了 W^X 代码检测工具。
目前,Dimitry Andric 已将 7.0 版本导入到 Git 分支中,该分支仅适用于 12 版本之后的 FreeBSD。
联系人:Matthew Macy <mmacy@FreeBSD.org>
FreeBSD 12 引入了多个性能改进:
引入了新的同步原语 epoch(9),以替代使用读取锁来提供数据结构的存在性保证。
epoch(9) 被用于减少高核数系统中 pcb 查找的开销,降低幅度超过 85%。
epoch(9) 被用于减少高核数系统上 UDP 发送的开销,降低幅度超过 85%。有关更多细节,请参见链接:http://scalebsd.org/blog/2018/06/16/UDP-and-epoch-for-liveness-guarantees
系统调用开销现在是 FreeBSD 11 的一半。
UNIX 套接字的扩展性现在接近线性(之前最多支持 3-4 个线程)。
NUMA 工作导致页面故障处理的扩展性提高了 20 倍到 80 倍。
联系人:Elena Mihailescu <elenamihailescu22@gmail.com>
联系人:Darius Mihai <dariusmihaim@gmail.com>
联系人:Sergiu Weisz <sergiu121@gmail.com>
联系人:Mihai Carabas <mihai@FreeBSD.org>
保存/恢复功能是一个可以暂停和恢复虚拟虚拟机镜像的功能,已添加到 FreeBSD/amd64 的虚拟化程序 bhyve 中。bhyvectl 工具用于将虚拟虚拟机保存为三个文件:
虚拟机内存的文件
每个设备/CPU 状态的文件
包含恢复过程中使用的元数据的文件
要暂停 bhyve 虚拟机,必须使用 --suspend <state_file_name>
选项运行 bhyvectl 工具,后跟虚拟机名称。
要从检查点恢复 bhyve 虚拟机,只需在启动虚拟机时,添加 -r
选项并跟随主要状态文件(与 --suspend
选项中提供的文件相同)。
迁移功能使用保存/恢复实现将 bhyve 虚拟机从一台 FreeBSD 物理机迁移到另一台 FreeBSD 物理机。要迁移 bhyve 虚拟机,需在目标主机上使用 -R
选项启动一个空的虚拟机,并从共享的虚拟机镜像启动,后跟源主机 IP 和监听迁移请求的端口。在源物理机上,迁移通过执行 bhyvectl 命令并使用 --migrate
选项启动,后跟目标主机 IP 和发送消息的端口。
新增功能:
在源主机和目标主机之间创建套接字连接
通过套接字迁移虚拟机状态
将挂起/恢复/迁移代码从 bhyverun.c 和 bhyvectl.c 中分离,新增了两个文件:migration.c 和 migration.h
为 xhci 添加保存/恢复状态
为 fbuf 添加保存/恢复状态
修复 vhpet 恢复状态问题(与计时器相关)
为 Linux 虚拟机提供部分挂起/恢复支持
未来任务:
检查是否可以使用 FreeBSD 的写时复制机制实现实时迁移
通过 EPT(英特尔)增加实时迁移支持
通过 NPT(AMD)增加实时迁移支持
增加 nvme 的挂起/恢复支持
增加 virtio-console 的挂起/恢复支持
增加 virtio-scsi 的挂起/恢复支持
修复恢复计时器问题
修复挂起 bhyve - 线程问题
修复挂起 bhyve - 锁问题
增加 Windows 虚拟机的挂起/恢复支持
该项目由 Matthew Grooms 和 iXsystems 赞助。
联系人:Konstantin Belousov <kib@FreeBSD.org>
已向 amd64 内核添加对 SMAP(Supervisor-Mode Access Prevention,特权模式访问防止)的支持。SMAP 功能使得任何从特权模式访问用户模式可访问的页面都会导致故障,除非在访问时设置了 %eflags.AC 位。
SMAP 实现使用了 ifunc 框架,避免在每次调用 copyout(9) 和其他函数时检查硬件的 SMAP 能力。
在 amd64 架构中,FreeBSD 在内核空间和用户空间之间共享地址空间。启用 SMAP 后,几乎将共享地址空间分为两个不重叠的地址空间,这些地址空间有不同的访问标准。这种地址空间的划分提供了一种相对低开销的方式来捕捉从内核到用户模式的直接访问,尤其是当不使用 copyout(9) 系列函数时。copyout(9) 系列函数允许直接访问用户空间。任何不是通过 copyout(9) 系列函数执行的从内核模式到用户地址空间的直接访问,都会提示潜在的编程错误。
有趣的是,在启用 SMAP 功能后,FreeBSD 内核几乎没有发现什么错误。一个已识别的问题出现在 pci(9) 用户驱动程序中。启用 SMAP 功能后,至少发现了两个 Port(VBox 和 acpi_call)似乎以不安全的方式访问了用户空间。
该项目由 FreeBSD 基金会赞助。
联系人:Mateusz Guzik <mjg@FreeBSD.org>
像 memset、memmove 和 memcpy 这样的函数是几乎所有程序都会频繁使用的。它们可以通过多种方式进行优化,但 FreeBSD 使用的是非常基础的实现,通过 rep movsq/stosq 指令。rep 前缀具有较高的启动延迟,对于处理小尺寸数据时成本过高。
该项目的短期目标是为内核实现更快的变体,并将其导入到 libc 中。主要的性能提升来自于不再对小尺寸数据(小于 256 字节)使用 rep 指令,并且在使用 rep 时对目标缓冲区进行 16 字节对齐。此外,还可以通过运行时检测增强的 REP MOVSB/STOSB 扩展,仅使用 rep movsb/stosb 指令。
中期目标是扩展到用户空间。可以利用 SIMD 扩展使这些函数变得更快。但在内核中不能轻易使用 SIMD:由于性能原因,SIMD 寄存器在用户与内核之间的转换时不会保存。因此,任何使用 SIMD 的操作都必须负责保存这些寄存器,这可能会消耗原本使用 SIMD 的优势。而在用户空间代码中则没有这个问题。
bionic 中有一个 BSD 许可的实现:https://android.googlesource.com/platform/bionic/+/master/libc/arch-x86_64/string/,可以通过一些修改稍后在 libc 中使用。
参考资料:英特尔优化手册:https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf
该项目由 FreeBSD 基金会赞助。
联系人:Konstantin Belousov <kib@FreeBSD.org>
现代的 PCI(e) 设备通常定义内存映射的 BAR(基地址寄存器),以便将内存区域提供给设备。每个 BAR 都有一个单独的页面对齐边界和与之关联的内存区域。这一点由超监控器(hypervisors)通过 VT-d 提供通道来强制执行,VT-d 操作的是内存,并且在访问控制方面具有一个页面的粒度。这样一来,BARs 的配置就适合提供用户模式的访问,并通过常规的页表来控制访问。
Linux 已经通过 sysfs 提供了用户空间映射 BAR 的方法。
当然,如果用户空间程序具有足够的权限,它可以读取一个 BAR,确定该映射在 CPU 中看到的物理地址,并使用 mem(4)(即 /dev/mem)来 mmap() 那个内存区域。这种方式非常繁琐,并且留下了许多未解决的问题。例如,某个 BAR 可能没有激活,这在某些架构下需要 IOMMU 的参与。此外,这种粗暴的方法使得创建具有正确缓存属性的映射变得非常困难。
FreeBSD 的 pci(4) 驱动已增强以支持这样的映射,pciconf(8) 工具也进行了扩展,以便使用新支持的功能。有关详细信息,请参阅 pci(4) 中的 PCIOCBARMMAP ioctl(2) 请求描述,以及 pciconf(8) 中的 -D 开关。
待办事项在映射时自动激活 BAR,这部分尚未完成。还存在避免内核驱动将来可能附加时资源冲突的问题。
该项目由 FreeBSD 基金会和 Mellanox Technologies 赞助。
更新平台特定功能并引入对新硬件平台的支持。
联系人:Emmanuel Vadot <manu@FreeBSD.org>
为 A64 SoC 添加了 SPI 驱动
为 A64/H3/H5 SoC 添加/修复了热管理驱动
修复了 mmc 驱动中的许多错误,稳定性应该更好
为 A64 SoC 的电源芯片伴侣 AXXP803 添加了新的驱动
添加了覆盖功能,在 A64 中如果默认计时器出现故障,可以使用另一个计时器控制器。默认在 PINE64/LTS 镜像中启用此覆盖功能。
联系人:Marcin Wojtas <mw@semihalf.com> 联系人:Patryk Duda <pdk@semihalf.com> 联系人:Rafał Kozik <rk@semihalf.com>
Marvell Armada 38x 是一款非常流行的基于 ARMv7 的双核 SoC。凭借多个低速和高速接口,该平台被广泛应用于网络附加存储(NAS)、Wi-Fi 接入点(WAP)等多种产品中。
自上次报告以来,剩余的 Armada 38x 支持已集成到 HEAD,现在可以使用 armv7 GENERIC 配置进行编译,并使用未修改的 sys/gnu/dts 设备树。具体情况如下:
GENERIC 配置
引入 sys/arm/mv 目录的大规模重构,用于 arm 和 armv7 平台。
启用对 Marvell ARMv7 SoC 的 PLATFORM 支持,现在可以使用 GENERIC 内核引导。
基于动态检测 SoC 类型和设备树,而不是使用 ifdefs,为维护 Marvell 平台提供更灵活的环境。
sys/gnu/dts 设备树
改进平台代码和驱动程序(例如 CESA、PCIE、GPIO),以便与原始 Linux 设备树正常工作。
GPIO
为 sys/arm/mv/gpio.c 添加了多个修复和改进
重构驱动程序,使其能够与 HEAD GPIO 框架(主框架和 gpioled)正常集成
启用对旧版和 Linux GPIO 设备树绑定的支持,以便可以使用多个控制器。
该项目由 Stormshield 和 Semihalf 赞助。
联系人:Emmanuel Vadot <manu@FreeBSD.org>
现在所有镜像都使用 loader.efi 作为主要的 FreeBSD 加载程序,而不再使用基于 U-Boot API 的 ubldr 版本。这使得我们可以为所有 arm 和 arm64 镜像提供共同的引导路径。
联系人:Emmanuel Vadot <manu@FreeBSD.org>
已更新 DTS 文件(设备树源代码),以与 Linux 4.18 版本保持一致,适用于 12.0 版本发布。
现在,这些 DTS 文件已经为一些 arm64 开发板进行编译,因为 U-Boot 中存在的 DTS 文件现在始终是最新的。
联系人:Matthew Macy <mmacy@FreeBSD.org>
在 Justin Hibbits 大致稳定了基于 POWER9 的 Talos II 上的 powerpc64 移植后,我决定购买一台。我一直在努力使 powerpc64 达到与 amd64 的兼容性。我正在进行一个树外的 GitHub 项目,部分目的是消除继续支持已经有 11 年历史的树内 gcc4 的需求。
至今的进展:
调整 lock_delay,使其使用 POWER 的 SMT 调度提示,而不是使用旧版 ISA 的 yield 提示
添加了 ifunc 支持
移植了 amd64 的 pmap,以便 FreeBSD 可以使用 POWER9 的新径向树页面表。这将使我们能够几乎免费获得超级页面。
减少了径向树的 copyinout 原语的开销。
将 copyinout 原语转换为 ifunc,以便在初始化时切换使用旧版和新版。
将 pmap 转换为使用 ifunc,消除了 kobj 调度的开销。
热补丁去除仅由旧版哈希页面表支持所需的陷阱处理路径。
正在进行的工作:
NMI 语义:NMI 需要通过仅软禁用中断来模拟,禁用中断会阻止所有中断,除了机器检查异常和系统重置。
超级页面支持:在运行 SMT4 的功能模拟器中,超级页面已正常工作,但由于不完全的页面遍历缓存/TLB 失效,当前在真实硬件上会崩溃。
内核迷你转储:启用径向 MMU 后,迷你转储的支持是一个相对直接的移植,但仍需花费时间进行测试和调试。
EARLY_AP_STARTUP:初步补丁已存在,但由于 IPI 设置与 CPU 代码未绑定,在非 x86 架构上需要更多工作。
欲了解实现内核功能与(愿望清单)里程碑的其他必要事项,请访问:https://github.com/POWER9BSD/freebsd/projects/1
联系人:Patryk Duda <pdk@semihalf.com>
联系人:Wojciech Macek <wma@FreeBSD.org>
联系人:Michal Stanek <mst@semihalf.com>
联系人:Nathan Whitehorn <nwhitehorn@FreeBSD.org>
Semihalf 很高兴宣布现在可以在 IBM POWER8 上运行 FreeBSD。该项目是 Nathan Whitehorn 所做的工作的延续,他提供了 PowerNV 仿真器的基本支持。
IBM POWER8 系列 CPU 相比之前的 Power 系列提供了更高的性能。它提供了完整的 NUMA 支持,最多可在双插槽系统中支持 192 个核心(每个核心最多 8 个线程)。所有 IO 通信都通过集成的 PCIe 接口处理,配备多个 IOMMU 引擎。
在非虚拟化环境中,支持 POWER8 系统运行 FreeBSD 包括:
OPAL 超监控器的通用驱动程序
修改 kboot 加载程序,使其允许 Little-Endian 加载程序加载 Big-Endian 内核 ELF 文件
更新 skiboot ELF 解析器,使其能够理解 FreeBSD 内核文件格式
基本支持 PowerNV 架构,包括操作模式、MMU、interrupt controller
支持 SMP 操作(已测试 128 核心配置)
PHB 子系统驱动程序,包括外部总线的 IOMMU 映射
PCIe 主控驱动程序
USB-3.0 XHCI 驱动程序
重构驱动程序,以兼容 Big-Endian:
Chelsio cxgbe(4) 10/25G 网络适配器
NVMe SSD 驱动
所有工作已合并到 HEAD 中,并将在 FreeBSD 12.0-RELEASE 中包含。
赞助商:IBM、FreeBSD 基金会、QCM Technologies、Semihalf、Limelight Networks。
该项目由 Limelight Networks(Kevin Bowling)发起并支持。
联系人:Ruslan Bukin <br@FreeBSD.org>
FreeBSD/RISC-V 是过去一年中积极支持的项目之一。
在编译器方面,我们已经将 FreeBSD 特定的部分提交到 GNU 工具链的上游。它已更新至 GCC 8.1 和 Binutils 2.30,并且 FreeBSD 的软件包也已提供。
FreeBSD 测试套件及其所需的依赖项已成功为 RISC-V 构建,并进行了测试运行:5186 个测试中有 152 个失败,这显示出初始运行的非常良好结果,同时揭示了需要改进的领域。
我们已为 KDB 调试器和 DTrace FBT 提供程序添加了对压缩 ISA 扩展的支持,默认启用 C 压缩的内核和用户空间。在 KDB 中反汇编指令的输出类似于 objdump。
QEMU 已更新至最新的权限规范,允许我们在其上启动 FreeBSD。仿真速度相当快:在 QEMU 中启动 FreeBSD 到单用户模式仅需一秒钟:https://www.youtube.com/watch?v=FnWpRBaWF18
已添加平台级中断控制器(PLIC)驱动程序。中断支持已转换为 INTRNG。PLIC 在 QEMU 中用于 virtio 网络和块设备。通过这些更改,现在可以在 QEMU 中启动完整的 FreeBSD 发行版。
网络虚拟化支持(VIMAGE)已修复并默认启用。
为了支持 RocketChip 及其衍生产品,我们必须处理 A(访问)和 D(脏)PTE(页表条目)位的管理。我们已在 lowRISC 开发板上成功测试,并且系统可以顺利启动到多用户模式。lowRISC UART 驱动程序已添加。
现在在状态寄存器中使用了超级用户-用户修改(SUM)位:内核只能在明确处理用户/内核边界跨越的某些函数内访问用户空间。
联系人:Emmanuel Vadot <manu@FreeBSD.org>
我们现在为 PINE64-LTS 提供一个镜像。此镜像可在 PINE64-LTS 和 Sopine 与基板组合的设备上使用。
联系人:Emmanuel Vadot <manu@FreeBSD.org> 联系人:Tom Jones <thj@FreeBSD.org>
Pocket Beagle 是 BeagleBoard 系列的最新成员。我们已为其添加支持,并且可以直接在其上使用 Beaglebone 镜像。
联系人:Emmanuel Vadot <manu@FreeBSD.org> 联系人:U-Boot 邮件列表 <uboot@FreeBSD.org>
树莓派固件根据型号从 FAT 分区加载 DTB 文件。现在,U-Boot 使用这个 DTB,并将其传递给 FreeBSD 加载程序/内核,而不是使用嵌入在 U-Boot 中的 DTS 文件。这样,FreeBSD 内核可以使用树莓派基金会提供的 DTB 覆盖来启用 HAT。通过安装 rpi-firmware 软件包,可以获取这些覆盖。
已为 RPI0 的 W 型号提交了新的 Port U-Boot ,命名为 u-boot-rpi-0-w。Edward Tomasz Napierala(trasz@)开始的一些实验表明,我们可能能够为所有 armv6 版本的 RPI(RPI-B、RPI0 和 RPI0W)生成一个通用镜像。
涉及 Ports 的更改,无论是影响大部分树的广泛更改,还是单个 Port 本身的更改。
联系人:Adriaan de Groot <adridg@FreeBSD.org> 联系人:Tobias C. Berner <tcberner@FreeBSD.org>
KDE FreeBSD 负责 Plasma5 和 KDE4 桌面的 Port,以及所有相关的应用程序。此外,我们还管理 Qt4 和 Qt5 的 Port,以及 CMake。
我们还负责 KDE 上游 CI 在 build.kde.org 上的 FreeBSD 构建器。
自上次状态报告以来,许多事情发生了变化。首先,Plasma5 桌面和基于 Qt5 的 KDE 应用程序终于进入了官方 Ports,结束了在我们开发仓库中多年的停滞。
其次,KDE4 被标记为已弃用,将在年底前移除。Qt4 将不晚于明年被移除(因为维护负担呈指数增长)。
在更技术的层面上,bsd.qt.mk
被 qt.mk
和 qt-dist.mk
替代。Port 手册正在更新中(感谢 Tobias Kortkamp)。
此外,我们一直在保持 CMake 和 Qt5 以及几乎所有其他我们控制的 Port 的最新状态。SDDM 已更新到次新版,并回溯了安全修复。
我们面临的一个大问题是 www/qt5-webengine
,它需要大量时间来保持更新,因为其底层的 Chromium 需要许多补丁,并且每次发布时这些补丁都会有所变化。另一个即将到来的问题是 FreeBSD 的 libinput
版本滞后。这阻碍了 KDE Plasma 和 Wayland 改进的未来更新。幸运的是,x11@ 已经在处理这个问题,因此很快就能解决——在此期间,想要尝试最新 KDE Plasma 桌面的用户可以使用我们 GitHub 上的相关分支。
愿意贡献的人可以通过在 freenode 上的 #kde-freebsd
,或通过 kde@FreeBSD.org 邮件列表找到我们。此外,我们接受在 github.com/freebsd/freebsd-ports-kde
上的拉取请求和贡献。
联系人:Puppet 团队 <puppet@FreeBSD.org>
自上次状态报告以来,puppet@ 团队定期更新了 Puppet Port,以跟上上游发布的进度。我们还在 BSDCan 举办了一个 Puppet 讲座。
最近,Puppet 6 已发布,并且在 FreeBSD Ports 中出现了许多新 Port:sysutils/puppet6
、sysutils/puppetserver6
、databases/puppetdb6
等(显然是最重要的)。在此次更新中,Puppet 语言没有做重大修改。因此,相较于之前的主要版本更新,从 Puppet 5 升级到 Puppet 6 是一项轻松的任务。如果你仍在使用 Puppet 4,我们建议尽早计划升级:预计 Puppet 4 将于 2018 年底停止支持。
由于通过 Puppet 分发 Marionette Collective 模块比使用软件包更高效,因此 Port sysutils/mcollective-*{agent,client}
已弃用。Marionette Collective 本身正在被 PuppetLabs 淘汰,Port sysutils/mcollective
预计在未来某个时刻将被弃用,但我们计划在找到替代方案之前继续保留它。这个替代方案称为 Choria,由 Marionette Collective 的原作者 R.I.Pienaar 积极开发。我们正在与他合作,支持 FreeBSD,且待被认为可以替代 Marionette Collective,我们将把 sysutils/choria
提交到 Ports 中。
联系人:Oleksandr Tymoshenko <gonzo@FreeBSD.org>
scarab 是一款命令行工具,旨在使 Bugzilla 的一些功能能够从命令行使用。通常,用户通过 bugtracker 使用 Web 浏览器与 Bugzilla 交互,但对于某些工作流程,Web UI 可能反而成为障碍,要求执行比命令行工具更多的步骤。
Bugzilla 提供了可用于自动化/集成的 XML-RPC 接口,并且有几个可以直接与 bugs.FreeBSD.org 配合使用的命令行工具,例如 pybugz。这些工具是通用的“一刀切”工具,意味着它们可以做很多事情,但代价是命令行变得更加复杂。
scarab 的创建旨在更加专注和简化,遵循以下原则:
作为辅助工具,而非 Web UI 的替代品
将复杂性转移到配置文件中,使参数尽可能简单
针对最常见/繁琐的任务进行优化
根据我与 Bugzilla 的经验,以下任务被认为是工具第一次发布时的候选任务:
在主机上下载附件并将其复制到开发箱中
在开发箱中创建文件并将其复制到主机上,通过 Web UI 附加
创建带有常见字段值的 PR
前两个操作实现为工具的 files
、fetch
、fetchall
、attach
命令。
第三个操作通过引入 PR 模板来实现,模板包含一组预定义的字段/值对,可以在运行时组合提供更高的灵活性。更多信息和使用示例可以在 配置文件示例 中找到。
文档树中的显著变化或新的外部书籍/文档。
联系人:<wiki-admin@FreeBSD.org>
FreeBSD Wiki 曾是 FreeBSD 开发者用来组织项目、存储笔记并发布即将添加到手册中的文章的便签。最近,FreeBSD wiki 开始吸引更多来自广泛 FreeBSD 社区的人士,导致 Wiki 的性质发生了变化。
因此,我们决定讨论在 FreeBSD 中使用文档工具的未来(其中一次讨论是在 BSDCam 2018 上举行的,你可以在 这里查看一些笔记)。总的结论是,Wiki 是一个很棒的工具,适合用于组织开发者社区中的项目和笔记。我们不应将所有文档(尤其是手册)迁移到 Wiki,因为这样质量和可维护性会受到影响。另一方面,当前提交文档补丁的工作流程,需要检出文档树并修补 XML 文件,这对许多最终用户来说并不理想。因此,我们正在从多个方向解决这个问题:
Wiki 正在清理旧内容。我们正在尝试定义明确的子页面和类别层级,以便更容易地浏览 Wiki。
Wiki 中的一些文章将迁移到文档树或手册页中。
联系人:Edward Tomasz Napierała <trasz@FreeBSD.org> 联系人:Mateusz Piotrowski <0mp@FreeBSD.org>
季度报告在几乎一年的中断后重新恢复。旧的工作流程包括用户提交 XML 格式的条目,这些条目随后会被手动组装成 DocBook,现在已被新的工作流程替代,改用 Markdown。XML 提交表单被 GitHub 拉取请求所替代。这将使提交和编辑变得更加简单和用户友好。
许多项目基于 FreeBSD 或将 FreeBSD 的组件整合进他们的项目中。由于这些项目可能对更广泛的 FreeBSD 社区有兴趣,我们有时会在季度报告中包含这些项目提交的简要更新。FreeBSD 项目不对这些提交中的任何声明的准确性或真实性做出任何保证。
联系人:Shawn Webb <shawn.webb@hardenedbsd.org>
我们的最后报告是 2017年6月。自那时以来,发生了许多变化。在这次状态报告中,我们将尝试简要概述我们所取得的所有进展,包括一些已提交到 FreeBSD 上游的提交。
2018年7月1日,我们重新切换回 OpenSSL 作为基本系统的加密库提供者。我们之所以这么做,是因为我们缺乏适当支持 LibreSSL 在基本系统中的资源和文档。我们仍然在基本系统中维护 LibreSSL;然而,OpenSSL 只是默认的加密库(即,WITHOUT_LIBRESSL 是默认设置)。我们期待着在 HardenedBSD 中建立一个关于 LibreSSL 的开发社区,以便我们能重新启用 LibreSSL 作为默认选项,通过拒绝软件单一化,为用户提供更强的安全性。
跨 DSO 控制流完整性(Cross-DSO CFI)是来自 llvm 的一种漏洞缓解技术,提供了跨共享库和应用程序边界的前向边缘保护。在 HardenedBSD 12-STABLE 中,我们启动了基本系统中对非跨 DSO CFI 的支持。这意味着 CFI 仅应用于应用程序,而不应用于共享库。与 SafeStack 一起,SafeStack 提供了后向边缘保护,跨 DSO CFI 需要 ASLR 和 W^X 的支持,以确保它们存储的关键元数据得到保护。HardenedBSD 通过其 PaX ASLR 和 PaX NOEXEC 实现,精确、高效和稳健地满足了这些要求。
在过去的两年里,我们逐步开展了对 HardenedBSD 中跨 DSO CFI 的支持工作。到 2018 年中期,我们取得了足够的进展,可以发布 Alpha 测试通知 (CFT)。我们需要将跨 DSO CFI 支持与 RTLD 集成,使得通过 dlopen(3)
/dlsym(3)
解析的函数指针能正常工作。我们还需要进行实验性的软件包构建,找出崩溃并修复它们。我们希望在 2019 年下半年正式推出跨 DSO CFI,推迟到 2020 年的可能性也存在。HardenedBSD 仍然是第一款且唯一一款在基本应用集上使用 CFI 的企业级操作系统。
2018年8月20日,我们推出了一款新工具,名为 hbsdcontrol(8),可以按应用程序切换漏洞缓解措施。hbsdcontrol(8) 使用文件系统扩展属性,并且是支持扩展属性的文件系统(如 UFS、ZFS)中切换漏洞缓解措施的首选方法。我们的原始工具 secadm 应与不支持扩展属性的文件系统(如 NFS)一起使用。
在 2018年9月 ,HardenedBSD Foundation Corp 成为美国的一个 501(c)(3) 税收豁免非营利组织。这意味着美国公民的捐款可以享受税收减免。HardenedBSD Foundation 的成立将确保 HardenedBSD 长期成功。我们期待与 BSD 社区合作,提供基于公开文档的 grsecurity 补丁集的开源、干净的重新实现。
我们协助 Kyle Evans 开发了新的 bectl(8) 工具,主要是增强了 jail 支持并修复了回归问题。我们感谢 Kyle Evans 在将增强功能合并到 FreeBSD 上游时的帮助,以及他在总体响应和协作方面的支持。
与 bectl(8) 相关的提交记录如下:
我们让 bhyve(8) 学会了如何在 jail 环境中运行,允许用户将虚拟化管理程序限制在 jail 中。我们通过使用 guard pages 对 bhyve(8) 的虚拟地址空间进行了加固。这些工作已成功提交到 FreeBSD 上游。我们感谢 FreeBSD 社区中那些为提高我们补丁质量和效率提供见解的成员。
最后更新于
这有帮助吗?