<b>Windows NT下实现对I/O地址的拜候</b>[VC/C++编程]
本文“<b>Windows NT下实现对I/O地址的拜候</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Windows NT 操作系统设置的进程情势会使运行在此中的利用程序拜候I/O地址的指令惹起保护性的失利.这使得利用程序需求附以一个设备驱动程序举行I/O操作.设备驱动程序运行在内核情势,这使得在这种状况的中运行的进程可以履行I/O操作.
---- Windows 95/98 是仅为 Intel 范例机械计划的,没有额外复杂的I/O需求,而Windows NT 被计划成可以在差别机械机构上举行移植.这使得Windows NT 的系统情势要求驱动程序的编写者要考虑一台机械大概有多种范例的总线,这大概需求在总线之间传送地址.这种情势还要辨别I/O空间和内存空间.在多总线的机械中每一总线可以既支持内存又支持I/O循环.
---- 按照定义,I/O存放器大概端口拜候是通过I/O循环实现的.但是,在一些系统中外部总线的I/O空间可以被映像到进程内存空间.硬件抽象层(Hardware Abstract Layer)决意这些.要拜候I/O存放器,驱动程序编写者必须知道存放器在那一总线,它的I/O空间地址在那条总线.一条总线是由其接口类行 (如 ISA 、PCI 等)和编号(从零开始)决意的.
---- 下面是一个假象设备拜候I/O的例子,接口范例:ISA 编号 0 地址 0xE700.设备描写以下: Offset Size Usage 0 1 Command register 1 1 Status register 2 2 Word data register 4 4 Dword data register
---- 用开辟NT 设备驱动程序的工具包DriverDorks 可以用以下 步骤拜候设备:
---- 成立一个KIoRange的对象映像设备存放器.
KIoRange DeviceIos; Status = DevceIos.Initialize(
Isa, // 总线范例
0, // 总线号
0xE700, // 总线地址
8, // 设备数
TRUE // 映像到系统空间(假如端口是内存映像的)
);
if(NT_SUCCESS(status)) //成立成功
---- 可以用KIoRange 的成员函数拜候存放器:
//存放器偏移量
#define COMMAND 0
#define STATUS 1
#define WDATA 2
#define DDATA 3
//读状况存放器
UCHAR DeviceStatus = DeviceIos.inb(STATUS);
//写号令存放器
DeviceIos.outb(COMMAND,CMD_RESET);
//写20个字到端口
DeviceIos.outw(WDATA,buffer,20);
---- 别的也可以成立KIoRegister 的对象来拜候设备:
KIoRegister CommandReg = DeviceIos[COMMAND];
KIoRegister StatusReg = DeviceIos[STATUS];
CommandRge=(UCHAR)RESET; //写 RESET号令
UCHAR status=StatusReg; //读状况存放器
假如在同一函数中频繁拜候存放器用KioRegiser 比用KIoRange 的成员函数的性能好一些.无论若何,数据范例必须精确(UCHAR,USHORT,ULONG),这些决意了到总线上数据的实际大小.
以上是“<b>Windows NT下实现对I/O地址的拜候</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |