zenglOX v2.4.0 DMA(Direct Memory Access)

当前版本实现了DMA传输模式, 并且在bochs, VirtualBox及VMware下都测试通过,
目前只有ATA硬盘读写操作使用的是DMA模式, ATAPI光盘使用的还是PIO模式,
读者有兴趣的话, 可以自行修改驱动来实现ATAPI的DMA传输模式。

DMA传输模式是直接在内存与磁盘之间传输数据, 所以理论上速度比PIO模式要快, 这点在
VirtualBox与VMware下得到了很好的验证。

但是在bochs下, 如果你不修改它的源代码的话, 默认情况下, DMA表现的速度比PIO模式还要
慢, 主要是它的代码里, 和DMA读写操作相关的定时器的值, 设置的太大了。

因此作者对其定时器值做了些修改, 并放到sourceforge对应版本的网盘里,
文件为pci_ide.cc , 假设你的bochs源码的路径为/mnt/zenglOX/bochs-2.6 ,
那么就将该pci_ide.cc文件放置到/mnt/zenglOX/bochs-2.6/iodev/目录下, 覆盖掉
该目录下原来的pci_ide.cc文件。

(我这里是对之前一直在用的bochs-2.6的版本进行的修改,
请确保你和我是一样的版本, 在之前zenglOX v0.0.1的网盘里, 我提供过bochs-2.6
的源代码, 并在zenglOX v0.0.1及zenglOX v2.0.0的文章里介绍过bochs-2.6的编译过程
, 目前bochs的编译过程请以zenglOX v2.0.0版本为主, 因为该版本的编译过程中
加入了E1000网卡与PCI总线的支持, 如果你之前已经按照zenglOX v2.0.0版本的要求,
编译过bochs了, 那么在替换了pci_ide.cc文件后, 就只需执行make和make install命令
即可(请用root权限), 这样它就只会去编译修改过的文件, 其他没修改过的文件就可以跳过编译)

pci_ide.cc文件里, 主要修改了第397行的代码：

//bx_pc_system.activate_timer(BX_PIDE_THIS s.bmdma[channel].timer_index, 1000, 0);
bx_pc_system.activate_timer(BX_PIDE_THIS s.bmdma[channel].timer_index, 1, 0);

也就是将activate_timer函数的第二个参数由1000改为1 , 这样每次触发DMA读写操作时,
就不用等那么久了(原来的定时器间隔大概是1000 usecond的时间)

读者可以在修改pci_ide.cc之前, 先运行一下zenglOX, 看下默认情况下原始的DMA
读写速度, 然后修改pci_ide.cc并编译安装bochs后, 再看下DMA的读写速度情况,
你就会发现他们在速度上的差异了。

在VirtualBox与VMware下则不存在这种情况, 他们的DMA速度明显比PIO模式要快。

zenglOX当前版本中, 和DMA相关的驱动代码主要集中在新增的zlox_ide.c文件里。

需要参考sourceforge网盘里的DMA_program.pdf手册, 才能理解代码的含义。

在前一个版本的说明文档里, 作者曾说过DMA驱动很难写, 原因就是作者只有PDF
手册可以作为参考, 没有实际的源代码可供研究, 作者根据手册里的说明写出来的
驱动程式在一开始时, 遇到了很多问题, 最后都是通过调试bochs源代码, 分析其中IDE
控制器, ATA驱动器相关的代码, 在充分理解其工作方式后, 才写出一个比较通用的DMA驱动程式的。

因此, 如果没有bochs的源代码的话, 这个驱动程式估计还写不出来(PDF手册里的
说明信息并不是完全正确的, 有些说明信息甚至有非常致命的错误, 只有通过调试
bochs源代码才能分析出来, 因此PDF手册也只能作为一种大概的参考)

当前版本只是增加了DMA驱动, 并修复了一些小BUG, 除此之外, 没作别的大的改动,
zenglOX源代码的编译运行过程和之前v2.3.0版本的方式一样, 也没有增加新的命令行程式。

时间: 2014年11月15日
作者: zenglong
官网: www.zengl.com