gpt4 book ai didi

linux - 写入/dev/mem 时真的总是需要 msync 吗?

转载 作者:太空狗 更新时间:2023-10-29 11:41:36 25 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

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

但是当你在 /dev/mem 上使用 mmap 时,你并不是在磁盘上映射一个普通文件,你只是将所需的硬件内存范围直接映射到你的进程中虚拟地址空间,所以 msync()题外话,它什么都不做。

唯一介于您写入映射虚拟空间和硬件设备之间的是 CPU 缓存。要强制执行此操作,您可以强制刷新缓存(__clear_cache() 也许吧?),但这通常是不必要的,因为内核会识别内存映射设备寄存器并禁用该范围的缓存。在 X86 CPU 中,通常使用 MTRR 完成,但对于 ARM,我不知道细节...

关于linux - 写入/dev/mem 时真的总是需要 msync 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44655195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com