首页
/ DOSBox-X项目中PC-98 BIOS扩展内存拷贝功能实现问题分析

DOSBox-X项目中PC-98 BIOS扩展内存拷贝功能实现问题分析

2025-06-26 04:54:36作者:苗圣禹Peter

在DOSBox-X模拟器的PC-98兼容性实现中,BIOS中断1Fh的AH=90h功能(扩展内存拷贝)存在一个关键性的实现缺陷。该功能用于在保护模式下执行大容量内存块拷贝操作,是PC-98架构特有的重要功能。

问题的核心在于内存地址计算逻辑的不完整实现。当前代码仅从参数块中读取32位地址(24位基地址+8位段选择器),但忽略了SI和DI寄存器提供的偏移量。正确的实现应当将寄存器偏移量纳入最终地址计算:

// 错误实现
PhysPt source = (mem_readd(data+0x12u) & 0x00FFFFFFu) + ((unsigned int)mem_readb(data+0x17u)<<24u);
PhysPt dest = (mem_readd(data+0x1Au) & 0x00FFFFFFu) + ((unsigned int)mem_readb(data+0x1Fu)<<24u);

// 正确实现应包含寄存器偏移
PhysPt source = (mem_readd(data+0x12u) & 0x00FFFFFFu) + ((unsigned int)mem_readb(data+0x17u)<<24u) + reg_si;
PhysPt dest = (mem_readd(data+0x1Au) & 0x00FFFFFFu) + ((unsigned int)mem_readb(data+0x1Fu)<<24u) + reg_di;

这个缺陷会导致实际拷贝操作的目标地址与预期不符,特别是在处理分段内存访问时。典型症状包括:

  1. 程序试图访问高地址内存时发生错误
  2. 内存拷贝内容错位
  3. 依赖精确内存定位的应用(如音效播放器)无法正常工作

该问题在ELKS(Embeddable Linux Kernel Subset)的PC-98移植版本中尤为明显。测试用例显示,当程序设置SI寄存器为8000h时,模拟器未能正确识别该偏移量,导致拷贝操作指向了错误的内存区域。

值得注意的是,虽然这个问题在普通实模式下可能不易察觉,但在涉及保护模式或unreal模式(一种特殊的32位寻址模式)操作时就会显现出来。这也解释了为什么部分测试人员在常规使用中未能发现该问题,而特定应用场景下会出现异常。

登录后查看全文
热门项目推荐
相关项目推荐