Linux 的清 CPU cache 的函数是哪个?

查看 251|回复 20
geelaw   
读了一下文档,看起来 drop_caches 只能清除文件系统里没有写过的缓存,sync 的作用是刷新所有文件,此外楼主的命令的影响范围是整个系统,而不是自己的进程,这样做几乎永远是错误的。
@codehz #5 可能楼主需要写很多内容后一起刷新?
codehz   
不过 linux 用内核用是有正当理由的,你这是 x86 带有硬件 dma 或者别的硬件内存映射技术一类的吗,那样用户态也访问不到吧
codehz   
@geelaw 我感觉根本不是一个目的啊,drop_caches drop 的是 page cache 这些,和 cpu 缓存一点关系都没,下文提及的也看出不太像是访问文件的问题)
amiwrong123
OP
  
@codehz
是的,用到了硬件的 DMA 。
用户态是可以访问的呀,只要最终映射出一个虚拟地址出来给 CPU 用就好了。我的程序逻辑很简单,以 RAM 作为交互,简单来说,CPU 先往 RAM (也就是内存条)里写,然后 DMA 从 RAM 里读。
sujin190   
没听说过还有手动清 cpu cache line 的,并发不一致也仅限于多核并发写,cpu 都自己管理好了和内存一致,时钟周期级别的一致,否则那么多程序都只是 lock 一下就能从内存读到正确值岂不是都要挂了,如果你硬要说有那应该就是 lock 之类的操作触发总线同步来标记 cache line 无效就是了吧
shimanooo   
volatile?
polaa   
缓存一致性问题 关键词 Cache coherence
函数 : __clear_cache
指令 clflash wbinvd
codehz   
@amiwrong123 参考这个 https://github.com/ikwzm/udmabuf mmap 的时候加一个 O_SYNC
codehz   
虽然理论上这种情况还有编译器优化的问题,也就是如果 a b a 这样写,可能会跳过中间的 b
再用前面说的 volatile 转换方式也不迟(
codehz   
哦,不对,编译器优化用 asm volatile("" ::: "memory");隔开就够了,O_SYNC 配合合适的用户态 dma 映射实现,应该就足够了
(不过用户态 dma 你还是得考虑调度的问题,没准你循环写入的时候进程被调度走了呢)
您需要登录后才可以回帖 登录 | 立即注册

返回顶部