当前位置: 首页 > 面试题库 >

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

韦欣德
2023-03-14
问题内容

我只对地址空间的某个区域刷新缓存(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的基于ARM的系统上,我有一个将内存映射到物理地址的设备。从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容? 问题答案: 您可以使用系统调用将设备文件映射到用户进程内存。通常,设备文件是物理内存到文件系统的映射。否则,您必须编写一个内核模块来创建此类文件或提供一种将所需内存映射到用户进程的方法。 另一种方法是将/ dev / mem的部分重新映射到用户内存。 编

  • 问题内容: 我对此感到困惑。我已经读到,当父进程创建子进程时,子进程会获得其父进程的地址空间的副本。复制在这里意味着什么?如果我在下面使用代码,那么它将在所有情况下都在堆上打印变量“ a”的相同地址。即在孩子和父母的情况下。那么这里发生了什么? } 问题答案: 子级将获得父级地址空间的精确副本,在许多情况下,该副本可能以与父级地址空间相同的格式进行布局。我必须指出,每个内存都有自己的虚拟地址空间,

  • 问题内容: 我在linux上有一个Java应用程序,它可以打开UDP套接字并等待消息。 在高负载下运行了几个小时之后,有一个数据包丢失,即数据包被内核接收,但不是由我的应用程序接收(我们在嗅探器中看到丢失的数据包,在netstat中看到UDP数据包丢失,我们没有看到这些数据包)在我们的应用日志中)。 我们尝试扩大套接字缓冲区,但这并没有帮助-我们早些时候就开始丢失数据包,仅此而已。 对于调试,我想

  • 地址空间 分段机制涉及5个关键内容:逻辑地址(Logical Address,应用程序员看到的地址,在操作系统原理上称为虚拟地址,以后提到虚拟地址就是指逻辑地址)、物理地址(Physical Address, 实际的物理内存地址)、段描述符表(包含多个段描述符的“数组”)、段描述符(描述段的属性,及段描述符表这个“数组”中的“数组元素”)、段选择子(即段寄存器中的值,用于定位段描述符表中段描述符表

  • 问题内容: 我想找到用户空间进程中定义的变量的物理地址吗?有什么办法可以使用root特权吗? 问题答案: 首先,您为什么要这样做?现代VM系统的目的是使应用程序程序员摆脱物理内存布局的复杂性。给他们每个人一个统一的地址空间,使他们的生活更轻松。 如果确实要执行此操作,则几乎确实需要使用内核模块。以常规方式获取变量的虚拟地址,使用它来索引进程页面表并读取找到的值(框架的物理地址)。然后添加页面偏移量

  • Im有一个war项目,在wildfly上部署了JAX-RS接口,并配置了一个安全域,从db加载用户密码和角色。安全域使用缓存类型=默认值。安全域无法识别经过身份验证的用户的更新,因为旧数据会被缓存。我用jboss cli验证了这一点。sh.那么如何从缓存中删除特定用户呢?我希望在部署的应用程序中执行此操作,而不是通过jboss cli。嘘。