使用 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 操作进行编译时优化。
我正在 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 操作进行编译时优化。