CE6中虚拟地址与物理地址之间的转换(高分!)

red526   2010-1-25 20:22 楼主
在CE6中,因为用户态的程序不能直接访问物理地址和内核态的空间,在CE5.0能用的FILTER移植到6。0就不能用了
因为在FILTER中用到了MmMapIoSpace 这个函数,造成数据访问中止。

所以我写了个流驱动,通过调用DeviceIoControl来获取MmMapIoSpace 所得到的虚拟地址,然后传给在用户态的FILTER中

问题来了:
    DeviceIoControl 所获得的虚拟地址竟然也是内核态的高地址,NND应用访问不了.

大虾们有没有碰到这种情况,有没有什么办法在驱动里把物理地址指定映射到用户态的虚拟地址上

希各位大侠指点指点。大家共同进步.

回复评论 (25)

帮顶下。

MARK,学习下。
点赞  2010-1-25 20:24
MmMapIoSpace 在ce6.0 的应用程序中是不能使用的,
在驱动中用就可以。呵呵,你可以去看看www.armce.com关于这个的讨论。
点赞  2010-1-25 21:18
引用: 引用 2 楼 gooogleman 的回复:
MmMapIoSpace 在ce6.0 的应用程序中是不能使用的,
在驱动中用就可以。呵呵,你可以去看看www.armce.com关于这个的讨论。

你呀,越来越假了,根本没看清楚我的问题/
点赞  2010-1-25 21:24
应用和驱动和驱动通过DeviceIoControl使用BUFFER及一些命令进行通信,然后只在驱动层访问应用层访问不了的地址不可以吗?
点赞  2010-1-25 22:28
DeviceIoControl所获取的虚拟地址要在应用层用,这是比较麻烦的.
点赞  2010-1-25 22:45
看来只能改架构了,想到头就大,还是等等看吧,,,,555
点赞  2010-1-25 22:51
引用: 引用 3 楼 wlc311 的回复:
引用 2 楼 gooogleman 的回复:
MmMapIoSpace 在ce6.0 的应用程序中是不能使用的,
在驱动中用就可以。呵呵,你可以去看看www.armce.com关于这个的讨论。

你呀,越来越假了,根本没看清楚我的问题/

O(∩_∩)O哈哈哈~ Sorry。
不过你要注意排版啊。
你在驱动也不能读出高地址吗?
这个真没有度过呢,检查一下看看是否读错地方了。
点赞  2010-1-25 22:59
贴代码....
点赞  2010-1-25 23:00

O(∩_∩)O哈哈哈~ Sorry。
不过你要注意排版啊。
你在驱动也不能读出高地址吗?
这个真没有度过呢,检查一下看看是否读错地方了。

[/quote]
嘻嘻
点赞  2010-1-25 23:31
内核态的地址,应用层是不能访问的,所以,
我想问问能不能让驱动把物理地址和用户态的虚拟地址映射起来.
点赞  2010-1-25 23:35
引用: 引用 10 楼 wlc311 的回复:
内核态的地址,应用层是不能访问的,所以,
我想问问能不能让驱动把物理地址和用户态的虚拟地址映射起来.


哦,原来你直接从应用传下来?
我觉得也要做个映射,比如switch 简单的语句等。
点赞  2010-1-25 23:53
哦,我的blog里好像有个这个方面的涂鸦,随便看看了,呵呵
点赞  2010-1-26 08:44
楼主我是这样理解的 MmMapIoSpace 这个函数是临时创建一个可以读写物理地址的虚拟地址,在流接口里你创建以后,要用UnIOSpace(名字忘了)。然后这个地址就不能使用了,而且为什么一定要取出来这个地址呢。
CE6里面做这样的限制就是为了操作的标准化,限制到你不可以在应用里面操作物理地址。要在CE6里面你只要把寄存器的操作写在流接口里就行了,也不麻烦吧。
点赞  2010-1-26 08:52
引用: 引用 13 楼 jjyyhema 的回复:
楼主我是这样理解的 MmMapIoSpace 这个函数是临时创建一个可以读写物理地址的虚拟地址,在流接口里你创建以后,要用UnIOSpace(名字忘了)。然后这个地址就不能使用了,而且为什么一定要取出来这个地址呢。
CE6里面做这样的限制就是为了操作的标准化,限制到你不可以在应用里面操作物理地址。要在CE6里面你只要把寄存器的操作写在流接口里就行了,也不麻烦吧。

说得很明白,但小弟对DDSHOW的FILTER不了解,要去改的话也要花一定的时间,呵呵
看来物理地址和用户态的虚拟地址是映射不起来的了,等有时间,我还是试试按楼上的方法做
点赞  2010-1-26 09:36
引用: 引用 14 楼 wlc311 的回复:
引用 13 楼 jjyyhema 的回复:
楼主我是这样理解的 MmMapIoSpace 这个函数是临时创建一个可以读写物理地址的虚拟地址,在流接口里你创建以后,要用UnIOSpace(名字忘了)。然后这个地址就不能使用了,而且为什么一定要取出来这个地址呢。
CE6里面做这样的限制就是为了操作的标准化,限制到你不可以在应用里面操作物理地址。要在CE6里面你只要把寄存器的操作写在流接口里就行了,也不麻烦吧。

说得很明白,但小弟对DDSHOW的FILTER不了解,要去改的话也要花一定的时间,呵呵
看来物理地址和用户态的虚拟地址是映射不起来的了,等有时间,我还是试试按楼上的方法做

呵呵我只是说说我自己的看法,楼主也不要被我误导,能不能映射楼主多查查资料吧。
点赞  2010-1-26 09:48
lz的做法好奔放
点赞  2010-1-26 17:02
可否用VirtualAlloc?

LPVOID VirtualAlloc(
  LPVOID lpAddress, // region to reserve or commit
  SIZE_T dwSize, // size of region
  DWORD flAllocationType, // type of allocation
  DWORD flProtect // type of access protection
  );
lpAddress 指定了一个虚拟基地址,不知是否会出错,还没试,明天试试
点赞  2010-1-26 18:10
引用: 引用 17 楼 wlc311 的回复:
可否用VirtualAlloc?

LPVOID VirtualAlloc(
  LPVOID lpAddress, // region to reserve or commit
  SIZE_T dwSize, // size of region
  DWORD flAllocationType, // type of allocation
  DWORD flProtect // type of access protection
  );
lpAddress 指定了一个虚拟基地址,不知是否会出错,还没试,明天试试


不用试的,肯定不可以。你看下MmMapIoSpace就源码就知道,这个函数就是用VirtualAlloc和VirtualCopy实现的,只不过MmMapIoSpace实现了地址自动对齐
点赞  2010-1-28 13:26
引用: 引用 18 楼 jjyyhema 的回复:
引用 17 楼 wlc311 的回复:
可否用VirtualAlloc?

LPVOID VirtualAlloc(
  LPVOID lpAddress, // region to reserve or commit
  SIZE_T dwSize, // size of region
  DWORD flAllocationType, // type of allocation
  DWORD flProtect // type of access protection
  );
lpAddress 指定了一个虚拟基地址,不知是否会出错,还没试,明天试试


不用试的,肯定不可以。你看下MmMapIoSpace就源码就知道,这个函数就是用VirtualAlloc和VirtualCopy实现的,只不过MmMapIoSpace实现了地址自动对齐


对。
点赞  2010-1-28 13:42
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复