阅读:1077回复:3
可否这样使用转换的用户缓冲区!
我的板卡上有两块DSP,分别有自己的内存资源,我将它们映射为虚拟地址后,然后分别映射到用户地址以供使用,但是同样的办法,最后始终只有一块DSP能够正常运行,另一块怎么也不动!
在其中两次将虚拟地址映射为用户地址,不知道映射有没有什么要求。最后始终只有后者的内存能够正常使用。 太郁闷了,希望各位给点意见. 映射的方法如下: if ( ( Mdl = IoAllocateMdl ( (PVOID)DeviceList->SDRAMAddrKernel, 0x2000000, FALSE, FALSE, NULL ) ) == NULL ) { DbgPrint(\"tmman:sectionMapPhysicalAddress:IoAllocateMdl:FAIL\\n\"); // goto sectionMapPhysicalAddressExit1; } MmBuildMdlForNonPagedPool ( Mdl ); if ( ( SDRAMAddrUser = MmMapLockedPages ( Mdl, UserMode ) ) == NULL ) { DbgPrint(\"tmman:sectionMapPhysicalAddress:MmMapLockedPages:FAIL\\n\"); // goto sectionMapPhysicalAddressExit2; } SDRAMAddrUser就是最后所获得的用户地址。 (PVOID)DeviceList->SDRAMAddrKernel,是最开始将物理地址映射后的虚拟地址。 |
|
沙发#
发布于:2003-06-24 21:27
Bar0, bar1
|
|
|
板凳#
发布于:2003-06-24 22:23
your code just for one on board mem, can you pls print out both so we can help you to check why one is ok and the other is not.
|
|
地板#
发布于:2003-06-25 23:45
0x2000000 硬编码,只能有一块映射进来,pci配置空间里,可以控制需要哪些地址空间,在这些配置空间确定了,系统将会分配地质空间给你,而这些地质空间究竟隐射到哪儿,是由你的配置空间设置的,好像是在Bar0, bar1,...bar5里面设置的,假设你现在需要两端地址空间,你应该将bar0,bar1设置好,驱动程序将会自动获得内存资源,假设你是wdm驱程
|
|
|