Bootloader
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。