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。
另一个事是FreeBSD的 loader(8) 也越来越膨胀了。经过讨论后的解决方案是增加一个人为的 508,000 字节的限制(我的机器上今天的尺寸是 503,808)。由于实模式的常规内存只有 640 kB,而其中还需要有一些空间留给类似中断向量表一类的结构去使用,因此这些内存并不能完全给代码使用,这样如果loader(8) 再膨胀下去的话就必须采取别的措施了。
比较明显的可以砍掉的功能是图形支持(如果机器够新,就用EFI;如果机器很老,就去掉图形支持);把Lua换回Forth的话大约可以省掉 60 kB,或是把解释器砍成最基本的(可以省掉 116 kB)。更激进一些的做法则是把UMA / HMA区域的内存给用起来,但在2022年使用这类禁术的风险确实不太合算了。