汇编

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

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

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

| Kernel | #x86 | #Emulator | #FreeBSD | #DOS | #Assembly | #汇编 | #模拟器

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

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

参与评论