请教xtang和高手们关于内存映射的问题?

关于内存映射查看了一些资料,但是越看越糊涂,能不能解释一下,尤其是mmap_device_memory这个函数,万分感谢!!

QNX使用虚拟内存. 对一个进程来说,能看到(编程时使用的地址如0x0000FF00)的并不是实际的物理内存地址,可能它被系统影射到物理地址的0x10000000处.当然这是操作系统的事,通常你并不关心使用的是那段物理地址.

但如一显卡里的内存,你想操作怎么办呢.你可能只知道物理地址0x00FF假设.那么你可以用mmap_device_memory()来把物理地址影射成虚拟地址,0x20FF.这样,写程序的时候,你就可以使用0x20FF这个地址来作相关的操作了.

我用的PCI卡上本身有个128m的存储芯片,在QNX系统下通过pci命令查看到设备的信息,其中有一段是 :
PCI Mem Address= d9000000h 32bit length 512 enabled
PCI IO Address= a800h length 256 enabled
PCI Mem Address= d9001000h 32bit length 64 enabled
PCI Mem Address= d0000000h 32bit length 134217728 enabled

请问PCI Mem Address= d0000000h 32bit length 134217728 enabled应该就是这个板卡128m的存储芯片在内存地址空间映射的物理地址吧?

然后通过ptr = mmap_device_memory(0,134217728 ,PROT_READ|PROT_WRITE|PROT_NOCACHE, 0,0xd000000) 是不是这个ptr获得的返回值就是指向虚拟地址空间的首地址呢?


mmap_device_memory这个函数最后一个参数所谓的物理地址是指板卡上存储芯片的地址还是这个存储芯片映射到计算机内存空间的地址呢??

请nakeyfish和高手们赐教,谢谢!

万分紧急阿,求救求救阿!!

mmap_device_memory这个函数最后一个参数是指板卡上存储芯片的地址.
返回的是映射到进程虚拟内存空间的地址.

mmap_device_memory在QNX的帮助文档里有个例子呀,如0xb8000就是物理地址.

/* map in the physical memory, 0xb8000 is text mode VGA video memory */
    
ptr = mmap_device_memory( 0, len, PROT_READ|PROT_WRITE|PROT_NOCACHE, 0, 0xb8000 );
if ( ptr == MAP_FAILED ) {
    perror( "mmap_device_memory for physical address 0xb8000 failed" );
    exit( EXIT_FAILURE );
}

并确定mmap前先取得相应的权限:ThreadCtl(_NTO_TCTL_IO, 0) ;

权限我已经用了,但是板卡上存储芯片的地址从哪能获得呢?还有我读取了板卡PCI配置空间的第四个基地址寄存器值是 d0000000h (32bit length 134217728 enabled ),这个地址是代表什么呢?

谢谢!!

PCI上的设备专门有一个扫描的标准,用来找出像设备基地址,中断号什么的。你可以去查PCI的说明。

在QNX上,有一个PCI服务器,自动扫描所有的PCI设备,所以你可以用pci_*函数来得到这些东西。