我正在使用mmap
打开/ dev / mem来读/写UART寄存器。
它运作良好,但我的问题是:
写入后,是否真的需要带有MS_SYNC标志的msync
系统调用?
根据我的理解,/ dev / mem是一个虚拟设备,它通过转换虚拟内存地址来提供对物理内存区域(在我的情况下为UART寄存器)的访问,因此可以从用户空间访问某些物理内存。
这不是一个常见的文件,我猜测寄存器的修改不会被缓冲/缓存。出于性能原因,我实际上想避免这个系统调用。
由于
答案 0 :(得分:4)
我的理解是,需要msync()
来更新普通文件中的数据,该文件通过使用mmap()
创建的映射进行修改。
但是当您在mmap
上使用/dev/mem
时,您没有在磁盘上映射普通文件,而只是将所需的硬件内存范围直接映射到您的进程虚拟地址空间,因此{{1} off topic ,它什么都不做。
在写入mmapped虚拟空间和硬件设备之间唯一的问题是CPU缓存。为了强制你可以强制缓存刷新(msync()
可能?),但这通常是不必要的,因为内核识别内存映射设备寄存器并禁用该范围的缓存。在通常使用MTRR完成的X86 CPU中,但是使用ARM我不知道细节......