0xAA55 发表于 2014-3-19 03:02:37

【DOS】DOS下涉及到文件读取与DMA操作的一些难以发现的坑

1、调用INT 0x21,AH=0x3F直接读取文件内容到某DMA读内存缓冲区->已证实这个在Virtual PC虚拟机、Virtual BOX虚拟机是一定会出错的!

当时我正在编写DOS版BAD APPLE,我设置Sound Blaster 16声霸卡(占用DMA通道1)的缓冲区为0x80000-0x9FFFF,然后我图省事,直接调用INT 0x21,AH=0x3F把声音文件数据读取到缓冲区0x80000-0x9FFFF处。在DOSBox下运行成功,但是在VBox和VPC两款虚拟机上都出现了一样的错误:刚开始运行没事,十几秒后屏幕突然黑掉,或者屏幕定格,或者声音无限循环0.2秒这样的问题。

推测:DOS中断INT 0x21,AH=0x3F读取文件的中断处理程序直接或间接(调用INT 0x13)使用了DMA从介质(硬盘)读取文件内容到内存,而同时另一个DMA通道却从同样的DMA缓冲区读取数据传到别的硬件(Sound Blaster 16声霸卡),也就是我同时使用两个DMA通道读写同一处内存,导致总线出现问题。。。

后来我只好乖乖地malloc了一块内存,读取数据到这个内存块然后来一个远指针拷贝移动数据到声卡缓冲区。

2、调用INT 0x21,AH=0x3F直接读取文件内容到显存->已证实这个在Virtual PC虚拟机、Virtual BOX虚拟机是一定会出错的!

当时我正在编写DOS版BAD APPLE,我设置图形模式为INT 0x10,AX=0x0013(分辨率320x200,256色,每个调色板颜色位数比为R:G:B=6:6:6),然后我图省事,直接调用INT 0x21,AH=0x3F把图像文件读取到显存0xA0000-0xAF9FF处。在DOSBox下运行成功,但是在VBox和VPC两款虚拟机上都出现了一样的错误:直接就无法看到图像。

推测:DOS中断INT 0x21,AH=0x3F读取文件的中断处理程序直接或间接(调用INT 0x13)使用了DMA从介质(硬盘)读取文件内容到内存,但是它没法把数据读到显存……

后来我只好乖乖地malloc了一块内存,读取数据到这个内存块然后来一个远指针拷贝移动数据到显存。

总结:16位DOS编程真好玩
页: [1]
查看完整版本: 【DOS】DOS下涉及到文件读取与DMA操作的一些难以发现的坑