采用此方法必须十分精通Windows内部体系结构、MicrosoftMASM汇编语言和设备驱动程序结构体系方法以及具有丰富的经验,否则会造成软件极不稳定甚至系统崩溃。这种方法在开发设备虚拟驱动程序时非常实用,但需要花费的时间和精力也比较多。(3)利用WinDriver实现的方法利用WinDriver也可以实现物理内存的分配,用这中方法的好处有:WinDriver的函数以文件形式独立出来,开发时只需将其文件加入模板接口API动态链接库(DLL)源文件中
采用此方法必须十分精通Windows内部体系结构、Microsoft MASM汇编语言和设备驱动程序结构体系方法以及具有丰富的经验,否则会造成软件极不稳定甚至系统崩溃。这种方法在开发设备虚拟驱动程序时非常实用,但需要花费的时间和精力也比较多。
(3)利用WinDriver实现的方法
利用WinDriver也可以实现物理
内存的分配,用这中方法的好处有:
WinDriver的函数以文件形式独立出来,开发时只需将其文件加入模板接口API 动态链接库(DLL)源文件中即可,使用方便而且独立性较强。
由于模板接口API DLL主要是利用WinDriver实现的,这样使整个DLL有较强的统一性和稳定性。
在整个DLL中,每个数据采集模板只有一个句柄,避免了有其他方法实现时的每个数据采集模板多句柄问题。
如上所诉,利用KRFTech’s公司开发的WinDriver是可以实现物理内存分配的。WinDriver本来是硬件驱动程序开发工具,运用它很容易完成访问I/O端口、存储区域、处理中断、执行
DMA操作及访问
PCI和自定义寄存器的工作。利用WinDriver 库函数WD_DMALOCK()可以动态地分配一段物理内存。这个函数的作用是:分配和锁定物理内存区,并返回已分配内存的物理地址。下面对此函数做一详细介绍。
WD_DMALOCK(HANDLE
Hwd,WD_DMA *pDma)
这里用到WD_DMA结构,它的成员如下:
pUserAddr – 内存的基地址
dwBytes – 内存的大小
dwOptions – 内存分配方式,常为 0。
=DMA_KERNEL_BUFFER_ALLOC 时,内存地址是连续的,内 存地址放在pUserAddr中
=DMA_LARGE_BUFFER 将分配大于1MB 的内存
Page[] – 内存地址数组
Page[i].pPhysicalAddr – 第i页的物理地址
比如向上位机申请64KDWORD物理内存,则:
{ WD_DMA Dma;
BZERO(Dma);
Dma.dwBytes = 262144;//64KDWORD
Dma.pUserAddr = NULL;
Dma.dwOptions= DMA_KERNEL_BUFFER_ALLOC;
WD_DMALock (hWD, &
amp;Dma);