如何在Linux中刷新地址空间区域的CPU缓存?

我只对地址空间的某个区域刷新缓存(L1,L2和L3)感兴趣,例如从地址A到地址B的所有缓存条目。在Linux中,有没有一种从用户空间或内核空间进行缓存的机制?

回答:

检查此页面以获取Linux内核中可用的刷新方法列表:https

:

//www.kernel.org/doc/Documentation/cachetlb.txt

Linux下的缓存和TLB刷新。戴维·米勒

有一套范围冲洗功能

2) flush_cache_range(vma, start, end);

change_range_of_page_tables(mm, start, end);

flush_tlb_range(vma, start, end);

3)void flush_cache_range(struct vm_area_struct * vma,unsigned long

start,unsigned long end)

Here we are flushing a specific range of (user) virtual

addresses from the cache. After running, there will be no

entries in the cache for 'vma->vm_mm' for virtual addresses in

the range 'start' to 'end-1'.

您还可以检查该功能的实现-http://lxr.free-

electrons.com/ident?a=sh;i=flush_cache_range

例如,在手臂上-http://lxr.free-

electrons.com/source/arch/arm/mm/flush.c?a=sh&v=3.13#L67

 67 void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)

68 {

69 if (cache_is_vivt()) {

70 vivt_flush_cache_range(vma, start, end);

71 return;

72 }

73

74 if (cache_is_vipt_aliasing()) {

75 asm( "mcr p15, 0, %0, c7, c14, 0\n"

76 " mcr p15, 0, %0, c7, c10, 4"

77 :

78 : "r" (0)

79 : "cc");

80 }

81

82 if (vma->vm_flags & VM_EXEC)

83 __flush_icache_all();

84 }

以上是 如何在Linux中刷新地址空间区域的CPU缓存? 的全部内容, 来源链接: utcz.com/qa/425101.html

回到顶部