找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2933|回复: 0

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

[复制链接]

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24225 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-3-19 03:02:37 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
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编程真好玩
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 17:15 , Processed in 0.047419 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表