在Windows NT 下实现对I/O地址的访问

2016-02-19 15:04 3 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐在Windows NT 下实现对I/O地址的访问,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

  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, // 总线地址

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  8, // 设备数

  TRUE // 映像到系统空间(如果端口是内存映像的)

  );

  if(NT_SUCCESS(status)) //建立成功

  ---- 可以用KIoRange 的成员函数访问寄存器:

  //寄存器偏移量

  #define COMMAND 0

  #define STATUS 1

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  #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),这些决定了到总线上数据的实际大小.

来源:http://www.tulaoshi.com/n/20160219/1608783.html

延伸阅读
标签: 电脑入门
一局域网新增了一台客户机,但集线器端口已接满,这就意味着新增的那一台客户机不能接入局域网,连共享资源也访问不了,更不用说共享上网了。而网管又不打算增加集线器,这时Windows XP的网桥功能就派上用场了,不过需要一个前提条件,就是局域网中必须有一台安装了双网卡的Windows XP系统客户机。前提条件已具备,构思很快就会实现,为了容易...
标签: PHP
  PHPlet是什么? 很简单,它是一个使用PHP编写的Web服务器,可以替代我们常用的Apache或IIS。 为什么要介绍PHPlet? 因为它是PHPer们学习Web服务器原理的捷径。 因为它的程序结构很好,类似Java的面向对象编程,有很好的参考价值。 因为我认为PHP5和PHPlet相继发布稳定版本后,PHP5+PHPlet+SQLite(PPS)将是小型应用、程序演示的另外一种...
标签: Delphi
  很多时候,我们可能需要执行关闭计算机或重新启动计算机的操作,但在 WinNT 内核的操作系统中,我们不能只调用简单的 API 函数来完成这样的操作。这并不是一个复杂的问题,却有时候会让人“为难”,如果是这样,现在解决这个问题的办法来了。 *************************************************************************** ...
1.0  What is a Raw Partition? 2.0  When to use Raw Partitions            2.1 I/O Bound Application            2.2 Oracle Parallel Server          ...
标签: PHP
  作者: Tony Reeves () 发表日期: 08/19 14:40 前些日子,是我写了这篇文章!   本来我想为刚刚接触PHP且又使用WIN9X/NT的朋友们提供一些帮助,   为他们早日建立一个小型的调试环境而尽一点自己的微薄之力。   却不想,自己水平太次,文章写的不够全面,而使很多朋友陷入   麻烦之中。 很...

经验教程

943

收藏

80
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部