Kernel

共 257 篇文章。

系统调用、符号版本与数据结构演进:FreeBSD 如何处理兼容性

• Kernel

操作系统在演进过程中经常会碰到一个很现实的问题:一方面,内核和基础系统不可能几十年保持原样,数据结构会变,系统调用会增加,某些早期设计也迟早需要推倒重来;另一方面,一个已经发布出去的ABI 又不能想改就改。如果几十年间内核里的数据结构换了一批又一批,这艘船究竟还是不是当年那艘船?保证它在用户态眼里仍然是同一艘船的关键,就在于 ABI 的稳定性。否则系统每升级一次,过去编译好的程序都有可能需要重新编译,整个生态很快就会变得难以维护。

阅读全文… ( 本文约 4855 字,阅读大致需要 10 分钟 )

errno 的实现

• Kernel

IEEE Std 1003.1-2024 (POSIX) 中对于 errno 的定义如下:

The lvalue to which the macro errno expands is used by many functions to return error values.

在更早期的 POSIX(Issue 5 及以前)以及 X/Open 文档中,曾经规定 errno 是一个外部变量(extern int errno),但这使得 errno 无法实现线程安全,因为所有线程共享同一个全局变量,一个线程的系统调用返回的错误码会覆盖另一个线程的值。因此,POSIX Issue 6(即 SUSv3 / IEEE Std 1003.1-2001)将这一要求删除,改为现在的定义:只要求 errno 是一个展开为 int 类型的可修改左值(modifiable lvalue)的宏。这为实现者提供了足够的自由度,以支持线程安全的 errno。

ISO C 标准在 C90/C89 时期已经不再要求 errno 是外部变量。

阅读全文… ( 本文约 1554 字,阅读大致需要 4 分钟 )

新的 arc4random_uniform 实现

• Kernel

本月初, Robert Clausecker 替换了 FreeBSD的 arc4random_uniform(3)。

arc4random_uniform(3) 是 arc4random(3) 之上封装的一个生成一个较小范围伪随机数的函数。arc4random(3) 采用密码学安全的伪随机数生成一个在 32-bit 范围,即 [0, 232−1][0,\ 2^{32}-1] 内均匀分布的伪随机整数,此处的随机分布是依靠对称加密算法(目前采用的是 Chacha20)中用于实现加密的伪随机置换(Pseudorandom Permutation)来保证的。

阅读全文… ( 本文约 3403 字,阅读大致需要 7 分钟 )

BIOS 串口波特率设置

• Kernel

今天 Warner 改了一段注释,我于是学到了一些新的 犀利而无用的知识,在这记一笔。

当从 BIOS 引导时,假如是使用 FreeBSD 的 boot manager(写入VBR的boot0或boot0sio),该 boot manager 实现了一个菜单,因为这个菜单的原因,实现串口异步通讯的代码就塞不下了,于是 boot0sio 会调用 BIOS int 14h 去初始化串口。

然而 int 14h 提供的接口是1981年的设计(IBM 5150的BIOS是1981年4月24日发表的,当时只有 8 kB),用来表达波特率的只有3个bit,这3 bit作为波特率除数表的索引值,该表在1981年写死成了:1047, 768, 384, 192, 96, 48, 24, 12,因此最高的波特率就是115200 / 12 = 9600。

由于 9600 还是比较慢(每秒只能传1200字节),因此现时的 BIOS / EFI 往往默认将串口波特率设为115200,然而 FreeBSD 的 boot0sio 在引导时仍然会一上来就把串口波特率设为 9600,解决方法是干脆不要用 boot0sio 而是使用 BIOS 提供的 Console Redirect 功能,或是在编译时将 BOOT_COMCONSOLE_SPEED 设置为 0。

阅读全文… ( 本文约 666 字,阅读大致需要 2 分钟 )

用 BHyVe 虚拟机解决 FreeBSD Wi-Fi 驱动的问题

• Kernel

BHyVe

https://www.FreeBSD.org/ 10.0-RELEASE 起,系统提供了一个最早由 NetApp开发的使用处理器提供的虚拟化硬件支持 (目前是 Intel VT 和 AMD-V;针对 ARM 平台的支持也在 https://reviews.freebsd.org/D26976)的虚拟化环境 https://wiki.freebsd.org/bhyve,这套虚拟化环境可以运行支持 VirtIO规范的各种操作系统,并提供了 UEFI 支持。

阅读全文… ( 本文约 1153 字,阅读大致需要 3 分钟 )

多年以前搞的 8086 实模式模拟器竟然又派上了用场

• Kernel

最近张师傅在折腾一个模拟器,在感慨他老人家的工作不饱和之余,我向他隆重介绍了我多年前埋到 FreeBSD 里的 x86模拟器。

这些代码我自己已经多年没有碰过了,后续也有一些其他开发人员在其上做了新的改进(比如没必要真的分配那么多内存给模拟器,等等)。不过这份来自 SciTech Software Inc (是的,就是 DOS 时代写 UniVBE.exe 的那个公司),后来辗转经过 XFree86、NetBSD 最终来到 FreeBSD 的模拟器的主体部分还是没有什么变化,稍微改一改就可以直接作为一个新的模拟器的基础了。由于不依赖 VM86,它的可移植性要比需要 VM86 的要好很多。从调试方面,由于它的结构,只需要在 x86emu_exec_* 设置断点就可以很容易地在用户态挂调试器进行调试了。

参与评论

geli(8)的HMAC设计

• Kernel

读到哪算哪的先记一笔。

geli(8)在启用了数据完整性检测的时候采取的设计是将HMAC数据保存在同一扇区中,换言之它在保存数据时,物理扇区(通常是512字节)中占用了32字节来保存HMAC数据。

阅读全文… ( 本文约 590 字,阅读大致需要 2 分钟 )

关于闰秒

• Kernel

phk 老大如此 吐槽:

来自 X (Twitter)

背景

关于时间,A core 几年前写过一个 时间是什么? 的系列: 序言 续一 续二 续三。

为了兼顾天文观测获得的时间 UT1(更符合普通人的需要)和由铯-133原子震荡获得的时间 TAI (更稳定),将两者综合一下就获得了协调世界时 UTC。UTC 和 UT1 之间的差距永远保持在 1 秒以内。UTC 中的一秒和 TAI 相同,但 UTC 和 UT1 保持最多一秒的差距,这是通过 IERS 在 UTC 事件中人为插入或减少闰秒这样的人为调整来实现的。从1972年这套系统投入运营到今天为止,总共插入了35个闰秒(2015年6月30日还将再插入一个闰秒)。

闰秒只在每年的6月30日和12月31日的UTC时间 23:59:59 之后插入,表示为当天的 23:59:60。

阅读全文… ( 本文约 1446 字,阅读大致需要 3 分钟 )

FreeBSD -CURRENT随机数发生器问题

• Kernel, Security

今天 John-Mark Gurney 修正了一个影响过去4个月左右的 FreeBSD -CURRENT 的随机数发生器问题,具体受影响的版本是 r273872(引入问题)到 r278907 (修正)。

由于问题只影响 -CURRENT,因此我们不会就此发表安全公告。

阅读全文… ( 本文约 407 字,阅读大致需要 1 分钟 )

FreeBSD 10.0-RELEASE

• Postmortem

这是我加入 FreeBSD Release Engineering Team (re@) 之后,我们发布的第一个主要(X.0)版本。

这个版本对整个系统进行了大量的改进。其中的重要变化包括在基本系统中用 clang 取代了 gcc(所有 Tier-1平台)、新增了 unbound(用于取代BIND的部分功能,后者十分复杂,且支持计划经常与 FreeBSD 的发生冲突)、基本系统中提供了转码API iconv(3) (我在2010年指导的 Summer of Code项目)、使用了 PkgNG 包管理工具、BHyVe虚拟机、对于虚拟化支持的大幅改进(virtio(4)以及 Hyper-V支持)、ZFS新增了TRIM支持、ZFS的LZ4完整支持(我在去年新增的功能),等等。

阅读全文… ( 本文约 783 字,阅读大致需要 2 分钟 )