是否可以在 Ubuntu 14.04 上禁用 L1 和/或 L2 缓存(最好使用 Python 等高级语言)?如果是这样,怎么办?
另外,不同架构之间禁用缓存会有很大差异吗?如果是这样,我对 ARM Cortex-A15 更感兴趣。
编辑
在研究如何禁用缓存时,我确实从 /proc/sys/vm/ 中找到了“drop_caches”文件kernel.org 文档
“写入此内容将导致内核删除干净的缓存,以及可回收的平板对象,例如目录和索引节点。一旦删除,它们的内存就会释放。”
...
“该文件不是控制各种内核缓存(索引节点、目录项、页面缓存等)增长的手段。当系统其他地方需要内存时,这些对象会由内核自动回收。”
这似乎不是我想要的,因为这不仅似乎不会禁用缓存,而且我认为虚拟内存驻留在操作系统中而不是硬件上。我的目标是禁用缓存,因此必须在其他地方寻找所需的内存,例如在 RAM 中。
编辑
为了澄清一下,我了解禁用缓存会对系统产生什么影响。然而,它是空间应用中用于提高安全关键应用的可靠性的常用技术。以下是记录这种现象的一些资源:
甚至还有关于该主题的书籍:
答案1
您可以使用一点 ASM 代码来完成此操作,请参阅 Intel 的第 11 章系统编程指南
11.5.3 防止缓存
要在启用并接收缓存填充后禁用 L1、L2 和 L3 缓存,请执行以下步骤: 1. 进入无填充缓存模式。 (将控制寄存器 CR0 中的 CD 标志设置为 1,将 NW 标志设置为 0。 2. 使用 WBINVD 指令刷新所有缓存。 3. 禁用 MTRR 并将默认内存类型设置为非缓存,或将所有 MTRR 设置为非缓存内存类型(请参阅第 11.11.2.1 节“IA32_MTRR_DEF_TYPE MSR”中对 TYPE 字段和 E 标志的讨论)。
我不知道有哪个 Python 模块可以实现这个功能。
答案2
您不能直接在 Python 中执行此操作,因为您需要一个内核模块才能执行此操作(以及加载该模块的 root 权限)。
看http://lxr.free-electrons.com/source/arch/arm/mm/cache-v7.S#L21了解如何使 L1 缓存无效(无效,而不是禁用)。
不同的CPU架构(例如x86与ARM)需要不同的汇编代码(CPU指令)来禁用缓存。我不确定 Linux 内核是否有可能禁用 L1/L2/L3/L4 缓存,如果有的话,我相信它只会在内部使用一小段时间,因为 CPU 很慢没有这些缓存。
看有没有办法在 Linux 系统上禁用 CPU 缓存(L1/L2)?有关如何在 x86/x64 系统上禁用缓存的链接(您需要更改寄存器cr0
)。用于ARM检查缓存禁用行为。
我不确定你是否完全理解 CPU 缓存的作用。您能否详细说明为什么要削弱系统的性能?