QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
阅读:2484回复:18

DS中物理地址转虚拟地址的问题!

楼主#
更多 发布于:2002-07-04 19:23
我在用KMemoryRange得到PCI的基地址时,如何把这个基地址转化为相应的虚拟地址?

最新喜欢:

hapihapi
eagle7902
驱动牛犊
驱动牛犊
  • 注册日期2002-10-14
  • 最后登录2003-05-14
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-15 16:32
你读取的基地址本身就是一个虚拟地址,类KMemoryRange的成员Base()是用来获取这个虚拟地址对应的物理地址的,这个虚拟地址和获取的物理地址都不能被上层应用程序所用,在他们中间被系统阻断了。上层应用程序都是通过系统的硬件抽象层来实现对硬件的访问的。因此你的问题并不是如何获取虚拟地址,而是如何在上层程序中对PCI硬件进行控制。
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-12 00:36
Ray_he说得对
magiz
驱动牛犊
驱动牛犊
  • 注册日期2002-05-22
  • 最后登录2004-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-05 09:43
把物理地址转化为虚拟地址很容易,参考ds上的帮助就可以了,
不过根据我的了解,好象有点问题,就是映射内存时不能够在任意
空间映射,必须低于1M的空间上,这可以在BAR寄存器上设置(pci2.1以下版本),我也不知道如何会这样,请教各位高手?
magiz
magiz
驱动牛犊
驱动牛犊
  • 注册日期2002-05-22
  • 最后登录2004-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-05 09:32
Here are the steps a driver takes to create a physical to virtual mapping
that a user mode process uses to read and write to a memory-mapped
device.
1 Here is an example that creates a mapping of address 0xF8000000
for 0x10000 bytes.
ULONGLONG p = 0xF8000000;
KMemoryToProcessMap* DeviceRegion =
new (NonPagedPool) KMemoryToProcessMap(
PCIBus, // bus type
0, // bus number, may vary
p, // peripheral memory address
0x10000, // number of bytes
(HANDLE)-1, // current process
FALSE, // don’t do kernel mapping
NULL, // any address
ViewShare // view inherit by child process);
Do not map the region to system space (by setting the second to
last parameter to TRUE) unless you also need to access the device’s
memory window from your driver.
2 Verify that the constructor succeeded.
if ( !DeviceRegion )
{
// insufficient memory
}
if ( !NT_SUCCESS( DeviceRegion->ConstructorStatus()))
{
// constructor failed
}
Access the virtual address for the current process:
ProcessVirtualAddress =
DeviceRegion->ProcessAddress();
The process virtual address should not be used in the driver. It
might only be returned to the application (usually by
DeviceIoControl).
3 When the mapping is no longer needed, delete it. The destructor
does all necessary clean up.
delete DeviceRegion;
It is also possible to map physical memory to system space. To map a
memory buffer (as opposed to a memory mapped device), see
KMemory::MapToUserSpace or the next topic.
magiz
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-08 20:23
为什么要把地址传到应用程序,而不把应用程序的数据传到内核驱动中呢?
我也使用的是内存映射方式,用KPciConfigure定义并得到映射的内存资源,用KMemoryRange访问这段内存。


我只是试试看而已。
Ray_he
驱动牛犊
驱动牛犊
  • 注册日期2001-08-23
  • 最后登录2003-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-08 19:17
为什么要把地址传到应用程序,而不把应用程序的数据传到内核驱动中呢?
我也使用的是内存映射方式,用KPciConfigure定义并得到映射的内存资源,用KMemoryRange访问这段内存。
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-05 15:18
是的,我很同意你的看法,不过我只想试试看而已。
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-05 14:01
点发信按钮不就行了?不过我也是菜鸟。
我还是觉得你的做法不太妥当。似乎对设备映射的内存空间访问应该在驱动程序中进行。只是我个人的想法。
打一枪……换个地方……再打一枪……
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-05 13:24
我是对映射到Memory空间的寄存区进行访问,IO我倒没试过。
brucezh,你的邮件地址是什么,以后我可以问你问题。
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-05 11:41
不好意思,我没做过这样的尝试。
我只作过对映射到IO空间的寄存区进行访问。并且是在内核态访问,用了WRITE_POR_ULONG、READ_POR_ULONG函数。
如果你解决了问题,一定要说一下方法啊
打一枪……换个地方……再打一枪……
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-05 11:25
我现在的问题是这样的。我想把PCI配置寄存器中的BAR0中的地址转换为虚拟地址,比如说BAR0中的地址为0xE9200000,现在我想把这个物理地址转换为虚拟地址,接下来再把这个虚拟地址传到上层的应用程序,再对此操作。KPciConfiguration的成员函数ReadBaseAddress()能读出BAR0中的地址,这个地址是物理地址,但如何转换成虚拟地址呢?
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-05 10:45
另外,在KMemoryRange的构造函数中不是已经有一个参数BOOLEAN MapToSystemVirtual 吗,也就是说,地址应该已经转换成了系统地址。
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-07-05 10:38
对不起,我没用过这个类。
不过,在ds中得到pci配置空间基址直接用KPciConfiguration类就行了,很方便的,可以不用KMemoryRange。
打一枪……换个地方……再打一枪……
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-05 09:37
我这个地址是KMemoryRange得到的,而MapToSystemMode()或者MaptoUserMode()并不是它的成员函数,到底如何使用?请讲清楚一些。

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-07-05 09:11
那到底是什么? :D
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-05 08:29
好像用MapToSystemMode();
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-05 08:29
好像用MaptoUserMode();
打一枪……换个地方……再打一枪……
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-07-04 20:12
好像用KMemoryRange的成员函数Base()得不到啊?
游客

返回顶部