阅读:1723回复:6
问一个port和memory地址转换的问题
最近才开始接触pci driver编程,看到人家用0xcf8和0xcfc写驱动,有的需要先call HalTranslateBusAddress 然后再mmmapiospace()在进行READ_PORT_UCHAR操作,为什么有的程序里面就没有这些,直接就READ_PORT_UCHAR()?这是为什么?
还有一个问题mmmapiospace()怎么知道要map的是一个port还是mem? 在线等回复。 |
|
沙发#
发布于:2004-07-29 07:57
应该是总线地址
|
|
|
板凳#
发布于:2004-07-28 09:11
那你怎么知道是io addr还是mem addr?从pci配置空间读出来的是总线地址还是物理地址?
|
|
地板#
发布于:2004-07-28 00:04
地址有好多种,总线相关地址,系统物理地址,虚拟地址,这些地址中,驱动程序能够操作的是虚拟地址。
总线相关地址的含义是,对于某条总线,他又某个地址,这个地址不能直接在系统内使用,因为其他某个总线可能也有相同的地址,这样的话,如果直接使用会有冲突。决绝的办法,系统范围你只能使用系统物理地址,需要总线地质转化为物理地址,这就是HalTranslateBusAddress 做的工作,在HalTranslateBusAddress 结束后,他又一个输出将告诉你转换的是io地址还是内存地址 最后,通过mmmapiospace将会把一个系统物理地址转换为驱动认识的虚拟地址 |
|
|
地下室#
发布于:2004-07-14 14:58
斑竹,那你就以cfc为例子给我说说吧,你的意思我明白,可是还是不理解这套机制
多谢了 |
|
5楼#
发布于:2004-07-14 13:53
NT本来支持的不仅是X86结构. X86的CPU有IO地址空间的概念. 对IO地址空间的操作有单独的指令完成. 但是NT支持的另外一种结构, ALPHA, 却是没有IO空间的. 所有的IO空间都映射到了系统地址空间. 为了能让自己DRIVER作者少写点代码. HAL"抽象"了IO空间的概念. 标准的做法自然是要用HAL去转换.
至于要MAP的到底是PORT还是MEM, 你写DRIVER的人自己都不知道的话还是转行做其他的毕竟好. |
|
|
6楼#
发布于:2004-07-13 09:19
DDK中有例子.你可以参考一下.
|
|