DOSBox-X是一款用于模拟DOS操作系统的软件,其主要目的是启动DOS环境。然而,除了CPU限制(可以通过使用如DOSBox-X这样的版本来模拟Pentium III CPU,这对于早期的Linux发行版如Ubuntu 8来说已经足够)之外,DOSBox并不完全模拟各种设备,如软盘或IDE。这些设备仅通过BIOS呈现给客户机,这对于查询BIOS以获取系统信息的DOS(和早期版本的Windows)来说是可行的,但对于直接与控制器通信的Linux来说则不够,Linux会发现软盘/IDE设备没有响应。
尽管如此,通过在DOSBox-X上挂载映像并启动它们,许多仅软盘的Linux发行版无法启动,尽管选择了最新的CPU(pentium_iii)在dosbox.conf
中。默认配置下,所有测试的发行版首先报告“fd0 is 1.44M”,然后是“no floppy controllers found”,接着是内核恐慌:
“从硬盘或CD-ROM启动”也不可行,因为IDE控制器会显示相同的错误消息。在调整了[fdc]
和[ide]
中的各种软盘和IDE设置,如软盘驱动器数据速率限制、int13fakeio、模式和启用pio32之后,能得到的最好的错误消息是“软盘读取超时”。显然,DOSBox的软盘/IDE控制器模拟对于Linux启动来说是不够的。
但并非一切都失去了。经过进一步的努力,找到了一个预装的Ubuntu 9.10 Alpha版本,这个版本是为VirtualBox准备的,但在DOSBox下只需进行一些小的修改就可以很好地启动到initramdisk。启动过程会下降到initramdisk,因为IDE控制器无法定位,sda1无法挂载,但这仍然是一个重大的进步:
令人难以置信的是,有限的initramfs shell仍然非常有用。许多常见的Linux命令,如ls、cd、cat、cp或rm都得到了支持。总是可以在initramfs shell中添加想要加载的模块,通过编辑/etc/initramfs-tools/modules
,然后运行update-initramfs
:
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
对于使用来说,这个解决方案已经足够了,因为只是想研究一个特定的Linux设备驱动程序是如何与硬件交互的。感兴趣的设备驱动程序可以通过initramfs提示符加载modprobe。如果想做同样的事情,需要选择一个32位的Linux构建,尽可能早,并且不需要物理地址扩展,或者PAE,这是DOSBox无法模拟的。可能还想将RAM增加到256MB,否则ramdisk映像的内存将不足。可以运行这个命令将VirtualBox VDI磁盘转换为DOSBox支持的原始(DD)磁盘格式:
C:\Program Files\Oracle\VirtualBox\VBoxManage.exe clonehd ubu910.vdi c:\dosbox\ubu910.raw --format raw
调试工作是在DOSBox-X上完成的,其源代码可以在找到,并且可以使用Visual Studio 2019或Visual Studio 2022直接编译。在这个过程中,发现如果DOSBox-X在后台运行,并且由于仍在输入而意外获得焦点,initramfs控制台窗口会被清除,只显示一个闪烁的光标。然后模拟机会挂起,输出窗口中会打印出大量的C++异常,需要重置。
这个问题的根本原因是位于sdlmain.cpp大约第5974行的NUM LOCK/CAPS LOCK/SCROLL LOCK同步代码。注释掉这些行可以修复错误,但代价是缺乏同步。出于某种原因,这个问题只发生在Linux上,而不是DOS或Windows上。
C++
SetPriority(sdl.priority.focus);
CPU_Disable_SkipAutoAdjust();
if
(strcmp(RunningProgram,
"
LOADLIN
")) {
BIOS_SynchronizeNumLock();
BIOS_SynchronizeCapsLock();
BIOS_SynchronizeScrollLock();
}