阅读:2483回复:18
DS中物理地址转虚拟地址的问题!
我在用KMemoryRange得到PCI的基地址时,如何把这个基地址转化为相应的虚拟地址?
|
|
最新喜欢:![]() |
沙发#
发布于:2002-07-04 20:12
好像用KMemoryRange的成员函数Base()得不到啊?
|
|
板凳#
发布于:2002-07-05 08:29
好像用MaptoUserMode();
|
|
|
地板#
发布于:2002-07-05 08:29
好像用MapToSystemMode();
|
|
|
地下室#
发布于:2002-07-05 09:11
那到底是什么? :D
|
|
5楼#
发布于:2002-07-05 09:37
我这个地址是KMemoryRange得到的,而MapToSystemMode()或者MaptoUserMode()并不是它的成员函数,到底如何使用?请讲清楚一些。
|
|
6楼#
发布于:2002-07-05 10:38
对不起,我没用过这个类。
不过,在ds中得到pci配置空间基址直接用KPciConfiguration类就行了,很方便的,可以不用KMemoryRange。 |
|
|
7楼#
发布于:2002-07-05 10:45
另外,在KMemoryRange的构造函数中不是已经有一个参数BOOLEAN MapToSystemVirtual 吗,也就是说,地址应该已经转换成了系统地址。
|
|
|
8楼#
发布于:2002-07-05 11:25
我现在的问题是这样的。我想把PCI配置寄存器中的BAR0中的地址转换为虚拟地址,比如说BAR0中的地址为0xE9200000,现在我想把这个物理地址转换为虚拟地址,接下来再把这个虚拟地址传到上层的应用程序,再对此操作。KPciConfiguration的成员函数ReadBaseAddress()能读出BAR0中的地址,这个地址是物理地址,但如何转换成虚拟地址呢?
|
|
9楼#
发布于:2002-07-05 11:41
不好意思,我没做过这样的尝试。
我只作过对映射到IO空间的寄存区进行访问。并且是在内核态访问,用了WRITE_POR_ULONG、READ_POR_ULONG函数。 如果你解决了问题,一定要说一下方法啊 |
|
|
10楼#
发布于:2002-07-05 13:24
我是对映射到Memory空间的寄存区进行访问,IO我倒没试过。
brucezh,你的邮件地址是什么,以后我可以问你问题。 |
|
11楼#
发布于:2002-07-05 14:01
点发信按钮不就行了?不过我也是菜鸟。
我还是觉得你的做法不太妥当。似乎对设备映射的内存空间访问应该在驱动程序中进行。只是我个人的想法。 |
|
|
12楼#
发布于:2002-07-05 15:18
是的,我很同意你的看法,不过我只想试试看而已。
|
|
13楼#
发布于:2002-07-08 19:17
为什么要把地址传到应用程序,而不把应用程序的数据传到内核驱动中呢?
我也使用的是内存映射方式,用KPciConfigure定义并得到映射的内存资源,用KMemoryRange访问这段内存。 |
|
14楼#
发布于:2002-07-08 20:23
为什么要把地址传到应用程序,而不把应用程序的数据传到内核驱动中呢? 我只是试试看而已。 |
|
15楼#
发布于: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. |
|
|
16楼#
发布于:2002-08-05 09:43
把物理地址转化为虚拟地址很容易,参考ds上的帮助就可以了,
不过根据我的了解,好象有点问题,就是映射内存时不能够在任意 空间映射,必须低于1M的空间上,这可以在BAR寄存器上设置(pci2.1以下版本),我也不知道如何会这样,请教各位高手? |
|
|
17楼#
发布于:2002-08-12 00:36
Ray_he说得对
|
|
18楼#
发布于:2002-10-15 16:32
你读取的基地址本身就是一个虚拟地址,类KMemoryRange的成员Base()是用来获取这个虚拟地址对应的物理地址的,这个虚拟地址和获取的物理地址都不能被上层应用程序所用,在他们中间被系统阻断了。上层应用程序都是通过系统的硬件抽象层来实现对硬件的访问的。因此你的问题并不是如何获取虚拟地址,而是如何在上层程序中对PCI硬件进行控制。
|
|