OpenBSD 7.7 Released
OpenBSD 7.7 发布,带来了多项改进。主要更新包括:针对 arm64、amd64 等平台的特定优化,如 SVE 支持、SEV 引导等;内核方面的增强,如提高 OOM 响应、完善 ptrace 接口、SMP 改进等;Direct Rendering Manager 和图形驱动程序的更新;VMM/VMD 改进;以及用户空间的新功能和错误修复,如改进 imsg API、增强 hw.perfpolicy 语义等。此外,还改进了硬件支持和驱动程序,涉及多个设备和驱动程序。
OpenBSD 7.7 发布
OpenBSD 7.7
| 发布于 2025 年 4 月 28 日。(第 58 个 OpenBSD 版本) 版权所有 1997-2025, Theo de Raadt. 艺术作品由 Tomáš Rodr 提供。
- 请查看 FTP 页面 上的镜像站点列表。
- 访问镜像站点上的
pub/OpenBSD/7.7/
目录。 - 查看 7.7 勘误表页面,其中列出了错误和解决方法。
- 查看 7.6 和 7.7 版本之间的 详细更改日志。
- 此版本的 signify(1) 公钥: | openbsd-77-base.pub: | RWSbCCUoGpcxVRmNb/XFYBbthxWMK7G6fNbJhb993Ohuh29WFaT9vhe2 ---|--- openbsd-77-fw.pub: | RWSJsKh8CzZG93aXHWDPCNM04iMwt7wRzfWzs1nL/2K6OsUvmAEfQavY openbsd-77-pkg.pub: | RWQ0omJ8AdcUd41n7fqEccjc/VyLhJLKVJo7oFUg7epg6lUHRtgMgT52 openbsd-77-syspatch.pub: | RWRtcHFMyeKCcG4TkoK/TbEvDd1vch0tq8VgRR5UBpvAQkUcgja3jtV9
所有适用的版权和声明都在 src.tar.gz、sys.tar.gz、xenocara.tar.gz、ports.tar.gz 文件中,或通过 ports.tar.gz
获取的文件中。
新特性
以下是 OpenBSD 7.7 中包含的新功能和系统的部分列表。有关完整列表,请参见 7.7 的 更改日志。
- 平台特定改进:
- arm64:
- 设置 AP 电源状态,修复了具有最新系统固件的 M1 MacBook 上的 SMC 初始化问题。
- 在 arm64 和 riscv64 上实现了一个新的 pmap_populate() 接口,以帮助 pmap_enter(9) 在有足够的可用物理内存但我们无法分配 KVA 来映射该内存时成功。
- 通过跳过 TLB 刷新优化了 pmap 拆卸,从而为内核构建提供了约 5% 的性能提升。
- 在使用了新的 QARMA3 密码的硬件上启用了 PAC。
- 实现了对 SVE (Scalable Vector Extension) 的支持。
- amd64:
- 添加了允许 bus_dmamem_alloc(9) 识别 BUS_DMA_64BIT 标志并为 DMA 分配内存的功能,而 amd64 上没有任何 4GB 限制。
- 允许引导加载程序在 QEMU 上作为具有 EFI 的 AMD SEV 访客运行。
- 允许在 QEMU 上使用 AMD SEV 引导内核。
- 允许将 MSI 与 QEMU 默认的 pc-i440fx 机器一起使用。
- 停止了 amd64 内核堆栈保护页面的泄漏。
- 实现了 AMD SEV psp(4) 下载固件命令,以将新固件加载到芯片上,并使 AMD SEV 在 vmd(8) 启动期间自动加载 psp(4) 固件。
- 其他 架构:
- 更多平台特定更改可以在下面的 硬件支持 部分找到。
- arm64:
- 各种内核改进:
- 提高了 OOM 情况下的响应能力,并使可用目标检查连贯。
- 删除了在 st(4) 上指定根设备、转储设备或交换设备的功能。
- 在 uvm 中,防止在我们要旋转以展开它时被映射对象被截断的竞争。
- 仅查找低页面时,优化页面守护程序活动和非活动列表遍历。
- 添加了一个帮助程序,用于检查是否已为给定请求释放内存,以提高页面守护程序循环的速度。
- 在页面守护程序计算页面短缺时,开始计算正在写入磁盘的正在进行的页面。
- 调整了 ptrace 接口以正确支持单线程继续,并使其可以在 gdb 中的多线程进程中使用断点。
- 添加了 ptrace(2) 命令,用于读取/写入跟踪进程的 XSAVE 区域。
- 正确地遵守了 ddb(4) break 命令的计数可选参数,确保在断点至少被击中那么多次之前不会停止执行。
- 教会了 ddb(4) 如何反汇编 endbr64。
- 将 dt(4) 移动到使用每个 CPU 的环形缓冲区。
- 将 'socket' refcnt 类型添加到 dt(4)。
- 使 btrace(8) 支持其他间隔/配置文件单位 (hz, us, ms, s)。
- 将多行字符串支持添加到 bt(5) 脚本解析器。
- 添加了 kern.audio.kbdcontrol sysctl(2) 变量,如果设置为 0,则允许将多媒体键盘上的音量键作为常规键处理。
- 为原始内存实现 bus_dma(9) 反弹缓冲。
- 开始忽略 ACPI 树遍历中非功能节点的子节点,以修复同一 PCIe 根桥的双重和三重连接。
- 暂停/休眠支持
- Bugfixes
- 通过使其在多线程进程中调用时返回错误,修复了 pinsyscalls(2) 中的(主要是)假设竞争。
- 修复了 top(1) 在 macppc 上的 CPU 空闲百分比。
- 重新设计了进程因信号而停止的方式。现在可以可靠地停止和继续多线程进程。这应该可以解决在 golang、mpv 和我们的回归测试中看到的问题。
- 修复了因 pledge() [删除所有路径承诺] 或 unveil() [添加新路径] 引起的对每个进程的 unveil 数据结构的更改,与在其他线程系统调用中检查的 namei() 的可能竞争。
- SMP 改进
- 解锁 sysctl kern.timeout_stats。
- 解锁 sysctl kern.allowkmem。
- 解锁 sysctl kern.video.record。
- 解锁 sysctl net.inet.gre.allow 和 net.inet.gre.wccp。
- 解锁 sysctl kern.global_ptrace。
- 解锁 sysctl kern.wxabort。
- 解锁 sysctl kern.malloc.kmemstat。
- 减少了拆卸文件支持区域时的内核锁定争用。
- 通过使用 ps_mtx mutex(9) 解锁了 ptsignal、psignal 和 prsignal。
- 使用互斥锁使 psp(4) MP 安全。
- 锁定了 fstat(2) 系统调用的发送套接字缓冲区。
- 进行了锁定更改以减少 __thrsleep 和 __thrwakeup 系统调用中的锁定争用。go 性能特别受益于此。
- 解锁了 virtio(4)。
- 使
video_filtops
MP 安全。 - 并行运行 TCP 输出和 TCP 计时器。
- 解锁了 TCP 套接字的 accept(2)。
- 在互联网套接字上调用 shutdown(2) 时,开始使用共享的 net lock。
- 重新设计了 rwlocks 以减少调度程序和 SCHED_LOCK 上的压力。
- 将 KERNEL_LOCK() 推送到 stat(2)、lstat(2) & fstatat(2) 中的 namei(9),并解锁了 fstat(2)。
- 解锁了 wskbd(4) kqueue filterops。
- 使用
ws_mtx
mutex(9) 使 wsmux(4) filterops MP 安全。 - 解锁了 open(2) 和 openat(2)。
- 使 wsmouse(4) 和 wstpad filterops MP 安全。
- 将 KERNEL_LOCK() 推送到 __realpath(2) 中。
- 即使没有内核锁,也能可靠地唤醒 dowait6 中的父进程。
- 使用 ps_mtx mutex(9) 来锁定 dowait6 正在检查的子进程。
- Direct Rendering Manager 和图形驱动程序
- 将 drm(4) 更新到 Linux 6.12.21。
- amdgpu(4): 添加了对 Ryzen AI 300 (Strix Point, Strix Halo, Krackan Point), Radeon RX 9070 (Navi 48) 的内核支持.
- inteldrm(4): 添加了对 Arrow Lake 的支持.
- VMM/VMD 改进
- 添加了一个 IPI,用于执行 INVEPT 以刷新远程 CPU 上的 EPT,这是允许访客内存不被 UVM 线控的第一步。
- 实现了 psp(4) shutdown 命令和 ioctl(2) PSP_IOC_SHUTDOWN,vmd(8) 将使用它来在启动时重置 psp(4)。
- 开始在 hypervisors 上使用 acpipci(4)。如果 hypervisor cpuid 位已设置,则使用 acpipci 连接 PCI 总线。由于虚拟化并没有那么古老,我们可以假设在 VM 中我们不需要旧的、损坏的 ACPI 的怪癖。这解决了 QEMU 上 PCI BAR 访问和最新的 SeaBIOS 版本的问题。
- 各种新的用户空间功能:
- 对 imsg API 进行了大量更改,使其更加严格和更好,然后调整了整个树中的所有应用程序。
- 允许用户在电池供电时提供替代 perfpolicy,从而扩展 hw.perfpolicy 的语义以提供两个按钮来指定所需的行为。这使用户在设置交流供电与电池供电时的性能方面具有更大的灵活性。
- 使 calendar(1) 使用环境变量 RECIPIENT_EMAIL 发送邮件到。
- 使 security(8) 在检查设备节点和 setuid 文件中的更改时使用 GMT 而不是本地时区。避免在更改时区时出现误报。
- 添加了一个新的变量 PASSWDSKIP,可以在 /etc/daily.local 中设置,以防止 security(8) 抱怨没有密码的特定帐户。这通常用于 anoncvs 和 gotd 等服务。
- 将 [-f file] 添加到 sysctl(8) 以一次性应用 sysctl.conf(5),并开始在 rc(8) 中使用它而不是在 ksh 中实现的解析器。
- 添加了对 lldb(1) 的 xmm/ymm 寄存器的读/写支持。
- 用户空间中的各种错误修复和调整:
- 添加了 wsconscfg(8) -g 选项以获取当前虚拟终端的索引。
- 使 getgrouplist(3) 始终返回找到的总组数。
- 忽略不适合传递给 getgrouplist(3) 的缓冲区的额外组,仅提供内核的最大十六个组。
- 防止 newsyslog(8) 在条目需要根据大小轮换时通过时间检查运行。
- 更改了 ps(1) 以打印会话 id(会话领导者的 PID),而不是带有显示参数 'sess' 的指针。
- 在 cu(1) 中,使用与 MAKEDEV 相同的方案将 ucom 单元号映射到 cuaU 号,从而修复了 ucom 单元 > 10 的问题。
- 使 CPU 频率具有人类可读性,并带有 systat(1) sensors -h。
- 修复了一个错误,其中 getty(8) dx 标志应该设置 decctlq,但实际上设置的是 ixany。
- 如果共享库列表已更改,则使 pkg_add(1) 在每次 updateset 之后运行 ldconfig(8)。
- 更正了 sed(1) c 命令的行为以匹配 POSIX。
- 使 clang(1) -fzero-call-used-regs 意识到 retguard 使用的寄存器。QEMU 正在使用 -fzero-call-used-regs,导致崩溃。
- 磁盘分区信息现在由 security(8) 保存。
- 使 security(8) 在检查邮箱的所有权和模式时忽略 quota(1) 文件和 /var/mail 的所有子目录。
- 添加了对可重定位 .pc 文件的 pkg-config(1) 支持。
- 使 mandoc(1) "-T html" 和 "-T markdown" 输出将 ".%R RFC " 转换为 rfc-editor.org 的超链接。
- 支持像 roff(7) 缩放宽度和 tbl(7) 列宽度中的算术运算中的小数,如使用 DocBook 编写的一些手动页面所需。
- 当 syslogd(8) 充当带有 TLS (-S) 的日志服务器并且客户端证书用于身份验证 (-K) 时,使用客户端证书中的 CN 作为主机名。
- 调整了 df(1) 打印 inode 列时的对齐方式。这使得在具有大分区的系统上更容易在视觉上使用“df -hi”。
- 使 test(1) 使用 timespeccmp() 和 st_mtim 而不是比较 st_mtime 来修复修改时间相差不到一秒的文件比较。
- 使 ksh(1) 使用 timespeccmp() 和 st_mtim 而不是比较 st_mtime 来修复修改时间相差不到一秒的文件比较。
- 在 ps(1) 中,向 vsz 和 rss 添加了一位数字,以适应使用更多内存的进程。
- 将 tzfile(5) 从 https://github.com/JodaOrg/global-tz 更新到 2025bgtz。
- 更新了 libc/locale 支持,包括例如 wcwidth(3) 和 iswalnum(3) 系列函数到 Unicode 版本 15.0.0。
- 改进了硬件支持和驱动程序错误修复,包括:
- 增加了 psp(4) 超时,允许 EPYC 9124 及时连接。
- 将 PercentLoad 传感器添加到 upd(4),报告输出插座消耗的可用 UPS 电源的百分比。
- 修复了 upd(4) 中某些 EATON 型号上的 RunTimeToEmpty。
- 改进了检测 I2C 设备的启发式方法(使 Vivobook 上的 A 型端口在 ACPI 模式下工作)。
- 将对 CSI b 控制序列(重复上次打印的字符)的支持添加到 wscons(4) vt100 仿真。
- 修复了 BPP16 和 BPP24 的 simplefb(4) 颜色。
- 添加了对 U-Boot 提供的 BPP16 16 位颜色 EFI 帧缓冲格式的支持。
- 实现了 CSI s 和 CSI u 以在 wscons(4) 中保存和恢复光标位置。
- 使缩放可用于普通的 wsmouse.4 鼠标,而不仅仅是触摸板。
- 添加了 scmi(4) 邮箱传输和用于 Snapdragon X Elite 上 CPU 频率管理的 perf 协议。
- 移动到仅在连接期间为 ihidev(4) 设备发送单个重置,从而避免了 ThinkPad T14s Gen 6 上内置键盘等某些设备的问题。
- 更改了 sdhc(4) 总线电源行为,以便在卡已经以请求的电压运行时不再执行断电电压切换请求。
- 实现了对更新的 SMC 固件中用于控制电池充电水平的新 CHLS 密钥的 aplsmc(4) 支持。
- 为 Qualcomm Snapdragon SoC 的 qciic(4) 驱动程序添加了 pinctrl(4) 支持。
- 使 qcpas(4) 在 AC/电池寿命更改时发送 APM_POWER_CHANGE 事件,从而允许 upowerd 做出反应。
- 添加了 qccpucp(4),这是 Qualcomm CPUSS 控制处理器 (CPUCP) 邮箱控制器的驱动程序。
- 使 qcpon(4) 查询硬件以获取按钮状态,以检测释放,即使错过了按下事件,并在按下按钮时发出唤醒信号。
- 使 qcscm(4) 在 acpi(4) 处连接。这允许使用 qcscm(4) 的 Qualcomm 机器在 ACPI 模式下访问 EFI 变量。通过此更改,可以成功安装一些 arm64 机器,例如 Samsung Galaxy Book4 Edge。
- 修复了对 AMD 600 系列 ahci(4) 控制器的支持。
- 引入了 pckbc@acpi 驱动程序附件,该附件在中断配置与旧版 ISA 不兼容时使用而不是 pckbc@isa。这解决了各种 Chromebook 中的键盘问题。
- 如果 PMIC 在设备树中被标记为系统电源控制器,则实现了 rkpmic(4) 断电。
- 将 RK3399 支持添加到 rkusbphy(4)。
- 将 dwmmc(4) 支持添加到 MMC 电源排序中的“post-power-on-delay-ms”。
- 在 dwmmc(4) 中实现了基于调节器的信号电压切换支持,修复了使用 RK3588 模块在 MNT Reform2 上启动的问题。
- 添加了对 Jabra PanaCast 20 的 uvideo(4) 支持。
- 确保 uvideo(4) 正确填充 v4l2_capability(允许一些 V4L 使用者在使用 bus_info 识别所需的网络摄像头时尝试切换设备)。
- 添加了 uvideo(4) 对报告批量和同步端点的设备的支持。
- 使 uvideo(4) 绕过未知的 pixelformat 到使用者,而不是拒绝未知的驱动程序格式。
- 支持来自 uvideo(4) 设备的 colorformat。
- 修复了同步端点网络摄像头关闭时的 uvideo(4) 崩溃。
- 确保 uvideo(4) 将带有错误位的帧转发给 V4L 使用者,这增加了对 ThinkPad T14 Gen 5、ThinkPad X1 Nano Gen 2、ThinkPad X13 和许多其他设备上的集成摄像头的支持。
- 强制执行 32 位访问以读取 8 位或 16 位寄存器,允许在 Radxa Orion O6 上看到的 Cadence xHCI 控制器上使用 xhci(4)。
- 将 USB 3.0 速度支持添加到 xhci(4) 和 uvideo(4)。
- 修复了不支持采样率更改的 [uaudio(4)](https://