*Nix and Win32 Kernel
记录一下当年把 FreeBSD 中 zlib 砍到只剩一份的过程
软件项目中,实现同一功能的源代码只保留一份是一项十分重要的最佳实践,这种做法可以带来许多显而易见的好处:
- 简化依赖关系管理。 对于 C/C++ 项目来说,如果同一个函数库有不同的版本,意味着必须设法确保其中不包含同一符号的多个变体。
- 减少技术债的积累。 只保留一个版本意味着参与项目的所有开发者都使用最新版本的库,或是从一个接近最新版本的库升级到最新版本,这要比把技术债留给后人去解决要容易许多。尽管升级时需要考虑的问题会更多一些,但这也意味着更好的一致性。只留一份版本意味着在升级时必须通盘考虑全局的影响,配合持续集成测试的使用,这也会带来更好的代码品质,并让整个团队能够更快地进行迭代。
- 节省各类存储占用。
- 改善整体安全性。问题只需在一处进行修正。
2009年的时候 kmacy@ 做了 一些初步的工作,但后续没有继续推进。 这之后 我 考虑重新把这个事给做掉,但苦于平时比较忙因此未能如愿。最终, Yoshihiro Ota 完成了大部分的工作。
阅读全文…Moving toward a standarized qsort_r(3)
History of qsort_r(3)
First introduced in Research Unix V3 and eventually standardized as part of C Standard Library as of ANSI/ISO C89, qsort(3) provided an abstract interface where programmers can perform sort operation over an array of objects, by supplying a pointer to that array, the total number of the member objects, the size of individual member object, as well as a compare function. The compare function is expected to take two parameters, both pointers to a member object, and it shall return a negative number, 0, or a positive number, if the first object is considered smaller, equal, or greater respectively.
阅读全文…BIOS 串口波特率设置
今天 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
。
TCP 协议合订本出了
我们现在所说的 TCP 协议通常是指 1981 年 9 月 发表的 RFC 793 和一系列后续 RFC 定义的协议,其主体定义距今已经超过 40 年了(当然如果细究下去的话, 第一份正式的文档是 RFC 675, 而 RFC 793 本身也是针对一年前的 RFC 761 的修正,不过大部分实现者使用的基础依然是 RFC 793)。
阅读全文…用 BHyVe 虚拟机解决 FreeBSD Wi-Fi 驱动的问题
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 支持。
阅读全文…多年以前搞的 8086 实模式模拟器竟然又派上了用场
最近张师傅在折腾一个模拟器,在感慨他老人家的工作不饱和之余, 我向他隆重介绍了我多年前埋到 FreeBSD 里的 x86模拟器。
这些代码我自己已经多年没有碰过了,后续也有一些其他开发人员在其上做了新的改进(比如没必要真的分配那么多内存给模拟器,
等等)。不过这份来自 SciTech Software Inc (是的,就是 DOS 时代写 UniVBE.exe 的那个公司),后来辗转经过 XFree86、
NetBSD 最终来到 FreeBSD 的模拟器的主体部分还是没有什么变化,稍微改一改就可以直接作为一个新的模拟器的基础了。
由于不依赖 VM86,它的可移植性要比需要 VM86 的要好很多。从调试方面,由于它的结构,只需要在 x86emu_exec_*
设置断点就可以很容易地在用户态挂调试器进行调试了。
重建了 IPv6 隧道
之前 提到我换了一家ISP。这家ISP目前尚未提供IPv6服务,因此想要用IPv6的话就需要自己动手。 此前也有一些其他朋友问过我关于为什么一定要有 IPv6,毕竟 狼来了 的故事已经讲了这么多年, 而且 十几年前 IPv4 的中央地址池其实就已经用完了,只是在工业界抱残守缺^H^H^H^H食古不化^H^H^H^H我也不知道该管这种行为叫什么, 总之苟延残喘了十几年依然没有把服务迁移到 IPv6 上去,所以目前用 IPv6 往往也只是满足一下一些技术宅的恶趣味, 例如看 kame.net 那只能动的海龟之类。
当然,我自己用 IPv6 有一些更加现实的动力,比如我的一些服务是只在 IPv6 上提供的,这样做可以把那些做的不好的客户端直接排除在外, 有点类似于在当年我把网站的 TLSv1.2 和更早版本的 TLS/SSL 支持全都砍掉一样。
话说回来,由于新的 ISP 出于一些我不理解的原因死活不愿意支持 ping (唯一可能的解释是,这样做会导致扫描起来容易不少,毕竟扫描 IPv4 地址段比扫描 IPv6 地址段要容易太多了, 但安全不能建立在别人不知道的基础上,anyway,打电话、开票之后未能解决该问题),而大河的隧道服务又要求必须可以 ping 到终点,于是陷入了死循环。
阅读全文…FreeBSD终于换了git
FreeBSD 最近终于完成了从 subversion 到 git 的转换(其实还没算彻底完成,不过 src/ 和 doc/ 都已经完成了)。
我个人用 git 用了蛮久了,最早开始严肃地用 git 大概是2012年年底 Illumos 从 hg 换成 git 的时候的事情,当时 FreeNAS 的开发也从 subversion 迁移到了 git,后来,我们也把 FreeNAS 内嵌的 FreeBSD 的开发搬到了 git 上面。
阅读全文…geli(8)的HMAC设计
读到哪算哪的先记一笔。
geli(8)在启用了数据完整性检测的时候采取的设计是将HMAC数据保存在同一扇区中,换言之它在保存数据时,物理扇区(通常是512字节)中占用了32字节来保存HMAC数据。
阅读全文…RIP Dr. Bruce Evans
Bruce Evans (bde@),那个愿意花时间在你改了三行看似无关紧要代码的时候写上整整两页回信细数为什么这么做不对,之前他们还做过什么以及为什么那么做也不行的老爷子在上周(12月18日)突然去世了。我已经开始想念他了。
阅读全文…