使用 mmap() 时如何避免缓存

how to avoid caching when using mmap()

我正在 petalinux 中为我的 FPGA 中的设备编写驱动程序,并且我已经实现了 mmap 功能以控制用户中的设备 space。我的问题是,如果我使用

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

在用户应用程序的mmap函数和MAP_SHARED标志中,似乎启用了缓存。

我做的测试是将一个值(比如 5)写入我的 mmaped 设备的特定寄存器,该寄存器实际上仅存储来自 AXI 总线的数据的最低有效位。如果我在写入操作后立即读取,我希望读取 1(在 Microblaze 上使用裸机应用程序时发生这种情况),而不是读取 5。但是,该值已正确写入寄存器,因为必须发生的事情.. ..发生了。

提前致谢。

根据问题评论中讨论的内容,此处分配的 address 指针:

address = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

未使用类型限定符 volatile 声明,允许编译器对其进行假设,从而可能对 read/write 操作进行编译时优化。