PCI内存访问的奇怪问题
PCI内存空间事先通过mmap()系统调用映射到了用户空间的BufPci,在应用程序中,我在将一个Buf中的数据拷贝到PCI设备内存空间BufPci后,紧接着从BufPci读出来跟原数据Buf中对比发现部分数据变了,很可能是cache一致性问题引起的,我将这两个指针都定义为volatile类型也不能解决问题,mmap()系统调用好像没有mmap_nocache()这种版本吧?不知怎么解决,希望得到高手指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你说的“PCI内存空间”指什么,是指从设备上映射到内存中的地址吗?这个是否cache和mmap没什么关系吧,而是映射时BAR寄存器里的值确定的。
就是PCI设备上的内存,我发现逐字节拷贝会出现数据不一致现象,逐字(4字节)拷贝就没问题了,还没弄清楚什么原因。
发现一个问题,就是逐字拷贝之前把字节序颠倒(PPC CPU是大端,PCI小端)再写入,写完后读出发现跟原始数据竟然也是一致的,为什么字节swap不起作用呢?
现在在驱动中用get_free_pages()为一个PCI设备分配了一段内存,作为与该PCI设备通信的共享内存,现在的问题是该PCI设备访问这段内存时候就会死机,应该是这段共享内存的访问属性设置有问题,不知道怎么设置这样分配出来的内存的属性,函数get_free_pages()参数用__DMA_GFP也不行,不知是否应该用其他内存分配函数。请高人指点一下
用pci_alloc_consistent()分配不到64K的空间也不行,老是不成功,oops