下边我们用到的v86即指虚拟8086模式. 在以前的教程中,你学习了怎样模拟v86中断,但还有一个问题没有解决:在vxd与v86代码之间交换数据.我们将在此学习如何使用v86内存管理器来实现这个功能.在这里下载例子程序 【程序编程相关:导出新东方背单词的单词】
虚拟8086模式的内存管理 【推荐阅读:利用NameValueCollectio】
假如你的vxd与一些v86程序一起运行,如何传送大量数据到v86程序中或从v86程序中传送大量数据迟早是一个大问题.通过寄存器传送大量数据是不现实的.可能你的下一个想法是在ring0中分配一大块内存,并且通过一些寄存器传送其指针到v86程序,使其能访问这些数据.假如你这样做,可能会破坏你的系统,因为v86的地址定位方式需要segment:offset对,而不是线性定位方式.对这个问题,有很多解决的方法.然而,我选择了一个由v86内存管理器提供的一种简便的方法. 【扩展信息:ABAP学习笔记之五-报表的事件】
理论
如你能在你可使用的v86内存范围内找到一个空闲的内存块作为通讯缓冲区,这将解决其中的一个问题.然而,指针传送的问题依然存在.你可以通过v86内存管理器的服务来解决这两个问题.v86内存管理器是为v86应用管理内存的静态vxd.它还为v86应用提供ems与xms服务与为其他vxd提供api传送服务.api传送是一个从ring0拷贝数据到v86范围内的缓冲区并且传送v86缓冲区地址到v86代码的过程.v86内存管理器有一个在v86内存范围内的传送缓冲区,其含有vxd拷贝到v86内存范围内的数据,反之亦然.初始的缓冲区是4k.你以调用v86mmgr_set_mapping_info来增加它的大小.
现在你知道了传送缓冲区,我们如何拷入或拷出数据呢?这个问题通过调用两个服务来解决:v86mmgr_allocate_buffer与v86mmgr_free_buffer.
v86mmgr_allocate_buffer从传送缓冲区分配一块内存并且从ring0拷贝一些数据到分配的v86缓冲区.v86mmgr_free_buffer正好相反:它从分配的v86内存块拷贝一些数据到ring0缓冲区并且释放由v86mmgr_allocate_buffer分配的内存块.
记住,v86在内存管理器象堆栈一样管理被分配的缓冲区.这意味着分配/释放必须按先进后出的规则.所以如你调用了两次v86mmgr_allocate_buffer,第一个v86mmgr_free_buffer将释放由第二个v86mmgr_allocate_buffer调用而分配的缓冲区.
我们来看一下v86mmgr_allocate_buffer的定义,它是一个基本寄存器传送参数的服务.
ebx 当前vm的句柄 ebp 指向当前vm的客户寄存器结构的指针 ecx 从传送缓冲区分配的字节数 carry flag 进位标志位,如你不想从ring0缓冲区拷贝数据到分配的内存块就清零, 如你想从ring0缓冲区拷贝数据到分配的内存块就置1 fs:esi 指向ring0缓冲区的selector:offset指针,缓冲区中有要被拷贝到被分配的 缓冲区中的数据如果进位标志位被清零,则忽略它.假如调用成功,进位标志位被清零并且ecx包含在传送缓冲区中的字节数.这个数值应小于你要求的数值,所以你应保持这个数值,v86mmgr_free_buffer待会要用到它.edi的高字包含被分配的内存块的v86段地址,偏移地址在在低字中.... 下一页