xiaohan
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2001-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2535回复:7

!!!求救:关于将物理地址转换为虚拟地址的问题

楼主#
更多 发布于:2001-07-10 16:14
我第一次开发驱动程序,任务是做公司专用板的驱动程序,是pci接口,芯片采用plx9052,在win2000下将物理地址转换为应用层使用的线形地址时总是转换不成功。

我尝试用MmMapIoSpace函数直接进行转换,程序刚开始运行时正常,但程序运行一段时间后,地址的内容就被全部改变了。是不是系统给更改了。

另外我用厂商提供的函数,主要应用ZwMapViewOfSection函数,但返回的是空地址,具体代码实现见附件。

我真是很着急,请高手们快帮帮忙,我先谢了。


最新喜欢:

PolomWUSPolomW...
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-07-10 23:22
在NTDDK中有个例子memmap,跟你的需要差不多,不过是讲将一个ISA卡的地址映射的问题。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
xiaohan
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2001-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-07-11 12:56
我没有ntddk在2000ddk中找不到这个函数
WDM123
驱动牛犊
驱动牛犊
  • 注册日期2001-06-15
  • 最后登录2004-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-07-12 08:44
看看WIN98或WIN2K的帮助,里面有个KMemoryRange ,具体我没用过,或许对你有帮助?祝顺利!
xiaohan
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2001-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-07-13 10:47
 我没有找到你讲的KMemoryRange 在那里可找到请赐教,谢谢
WDM123
驱动牛犊
驱动牛犊
  • 注册日期2001-06-15
  • 最后登录2004-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-07-14 09:59
不好意思,说错拉,在DRIVERWORKS的帮助里,拷贝一段算补偿!!!对拉搞掂了,告诉我一下!!!!

How to Map Peripheral Addresses to System Space
Many hardware devices decode addresses and respond to memory cycles as a means to provide input and output, i.e., they are memory-mapped devices. If the memory-mapped regions on the device are accessed only via DMA, there is no need for the processor to maintain logical addresses that correspond to the physical addresses decoded by the hardware. However, in the case where the processor must generate the cycles to which the hardware responds, then it is up to the driver to create a physical to virtual mapping.
Here is an example that creates a mapping of address 0xF8000000 on PCI bus 0 for 0x10000 bytes:.................

KMemoryRange DeviceRegion;
status = DeviceRegion.Initialize(
   PCIBus, // bus type
   0, // bus number
   0xF8000000, // bus phys address
   0x10000 // number of UCHARs
   TRUE // do mapping
);


xiaohan
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2001-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-07-16 09:11
老大,麻烦你,DRIVERWORK的帮助再那里?
请详细告之.
最好把代码用附件贴出来,我很着急,多谢
skysky
驱动小牛
驱动小牛
  • 注册日期2001-07-18
  • 最后登录2003-06-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-07-18 13:27
你可以这样做:
如果你做的是即插即用的wdm驱动程序,在
case IRP_MN_START_DEVICE中使用:

stack = IoGetCurrentIrpStackLocation(Irp);


stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList中可以得到地址,如果是port端口地址,那么可以直接用,如果是memory端口地址(sdram),需要用MmMapIoSpace将该地址映射到系统内存空间。

如果你要将一段设备内存映射到系统空间以供上端程序直接操作设备内存,则要参考ntddk的sample,就如上面朋友说的。ZwMapViewOfSection也会用到,但是过程很复杂,需要很长的代码。

我想你只是想在驱动程序里使用,对吧。
至于地址还会变化,那倒是很奇怪的。用ddk的pcitools查看。
以德服人,以德服人
游客

返回顶部