evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:934回复:1

一个很菜的基本问题

楼主#
更多 发布于:2002-11-11 18:39
PCI设备有三种地址空间,Configure Space, I/O Space和Memory Space。我下面的理解是不是对的。
I/O和Memory分别是PCI卡上的寄存器和自带的内存,他们被映射到主机系统的I/O空间和物理地址空间。这样,就可以访问它们了。
是不是所有的硬件设备上的寄存器和内存都是用这样的方式被访问的呢?如果不通过映射,直接使用访问I/O断口的命令例如IN,OUT行不行呢?为什么要映射呢?
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-12 09:02
别忘给分!
通常,CPU的内存地址空间和I/O地址空间是分离的。为了访问“内存映射”设备,CPU用load或store操作直接对一个虚拟地址进行内存引用,然后CPU利用一组页表把虚拟地址转换成物理地址。为了访问“I/O映射”设备,CPU必须使用特殊的机制,如使用x86处理器上的IN和OUT指令。
设备使用总线专有的方式解码内存和I/O地址。在PCI总线中,主PCI桥把CPU物理地址和I/O地址映射到总线地址空间,而设备可以直接访问总线地址空间。对于两种地址空间都支持的CPU,设备配置空间中的标志位决定了主PCI桥是把设备寄存器映射成内存地址还是映射成I/O地址。
某些CPU有分离的内存地址空间和I/O地址空间。例如,Intel架构的CPU同时支持这两种地址空间。其它CPU,例如Alpha,仅有一个内存地址空间。如果你的设备是I/O映射的,PnP管理器将赋予你端口资源。如果你的设备是内存映射的,它将赋予你内存资源。

为了避免为兼容各种平台而使用大量条件编译代码,Windows NT的设计者发明了硬件抽象层(HAL)。HAL提供了用于访问端口和内存资源的函数。正如这个表所指出的,你可以从或向一个PORT/REGISTER资源READ/WRITE一个或一组UCHAR/USHORT/ULONG值。有24个函数用于设备访问,但WDM驱动程序不直接依靠HAL做任何事,你可以把这24个函数看成是HAL的全部公共接口。

用于访问端口和内存寄存器的HAL函数:
READ_PORT_UCHAR
WRITE_PORT_UCHAR
READ_PORT_USHORT
WRITE_PORT_USHORT
READ_REGISTER_USHORT
WRITE_REGISTER_USHORT
等等。
生命驱动,活力无限!
游客

返回顶部