深入探讨DOSBox-X与Linux的兼容性

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(); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485