11

有什么方法可以读取 CPU 缓存内容吗?架构适用于 ARM。

我正在使一系列地址无效,然后想确定它是否无效。虽然我可以在有和没有无效和检查无效的情况下读写地址范围,但我想知道是否可以读取缓存内容

谢谢!!

4

4 回答 4

8

ARM9 提供高速缓存操作和测试寄存器,允许您检查高速缓存的状态。这是一个合理的起点:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0151c/Chdcfejb.html

ICache 和 DCache 使用 MCR 和 MRC 指令维护 CP15 寄存器 7 和 9,由 ARM v4T 程序员模型定义。可以使用 MCR 和 MRC 对 CP15 寄存器 15 执行其他操作。这些操作与使用寄存器 7 和 9 的操作相结合,可以完全在软件中测试高速缓存。

这些是特权指令,因此可能无法在您的目标平台上访问。

我将从一个转储所有缓存行状态的简单程序开始。这应该为您提供足够的信息来读取缓存中的数据,只需读取缓存标签提供的内存位置即可。

于 2009-06-29T05:07:11.883 回答
2

我犹豫要不要写它是不可能的,所以我写它非常困难。可能没有通用的答案。鉴于 CPU 缓存透明地工作,因此不可能在不更改缓存内容的情况下从连接的 CPU 读取其内容。CPU缓存通常实现为CAM(内容可寻址内存,关联内存),如果CPU尝试访问数据,则查找缓存,如果数据不存在,则从内存中获取,但恐怕这个过程对CPU是透明的.

选项是使用一种硬件观察模块和系统总线上的嗅探,它将缓存连接到 RAM。如果数据请求出现在总线上,则请求的数据不在缓存中。

希望有更深入的硬件知识的人会有所启发。

维基百科上有一个条目讨论 CPU 缓存: http ://en.wikipedia.org/wiki/CPU_cache

于 2009-06-17T13:47:51.557 回答
1

根据定义,读取缓存内容所需要做的就是加载缓存存储的内存位置。如果缓存正常工作,它将从缓存中提取内容。

但是,如果您尝试读取 I-cache 的内容,则取决于架构。另外,您将需要考虑比赛条件。用于读取缓存内容的指令可能会无意中覆盖缓存内容本身。

于 2009-06-18T08:48:42.567 回答
0

该线程所述,简单地使用 CPU 会导致缓存的内容发生变化。由于(大多数)缓存实现有意对 CPU 完全透明,因此您将无法直接从运行在传统 CPU 上的软件中查看缓存的内容。

做这样的事情需要一个缓存感知CPU(带有控制缓存的特殊指令;我不知道这些是否真的存在),或者你需要安装一个单独的硬件模块来查看缓存。以下是我对此的两个想法:

  1. 用具有附加控制功能并且可以连接到系统总线以读取数据的缓存控制器替换您的原始缓存控制器。该控制器位于 CPU 和缓存“之间”。

  2. 将辅助模块与原始缓存并行放置,并具有只读缓存访问权限。使用特殊的中断线(或类似的硬件-而非软件信号),CPU 可以触发将缓存转储到该模块的内存中,然后稍后(通过总线)将其读回。该控制器不会影响您的缓存操作;它只会让您在任何给定时间拍摄快照。

于 2009-06-17T14:49:06.723 回答