写入/ dev / mem时是否真的需要msync?

时间:2017-06-20 13:59:56

标签: linux arm embedded uart

我正在使用mmap打开/ dev / mem来读/写UART寄存器。 它运作良好,但我的问题是: 写入后,是否真的需要带有MS_SYNC标志的msync系统调用?

根据我的理解,/ dev / mem是一个虚拟设备,它通过转换虚拟内存地址来提供对物理内存区域(在我的情况下为UART寄存器)的访问,因此可以从用户空间访问某些物理内存。

这不是一个常见的文件,我猜测寄存器的修改不会被缓冲/缓存。出于性能原因,我实际上想避免这个系统调用。

由于

1 个答案:

答案 0 :(得分:4)

我的理解是,需要msync()来更新普通文件中的数据,该文件通过使用mmap()创建的映射进行修改。

但是当您在mmap上使用/dev/mem时,您没有在磁盘上映射普通文件,而只是将所需的硬件内存范围直接映射到您的进程虚拟地址空间,因此{{1} off topic ,它什么都不做。

在写入mmapped虚拟空间和硬件设备之间唯一的问题是CPU缓存。为了强制你可以强制缓存刷新(msync()可能?),但这通常是不必要的,因为内核识别内存映射设备寄存器并禁用该范围的缓存。在通常使用MTRR完成的X86 CPU中,但是使用ARM我不知道细节......