有没有办法读取CPU缓存内容?架构适用于 ARM。

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

谢谢!!

有帮助吗?

解决方案

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

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

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

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

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

其他提示

我犹豫要写它是不可能的,所以我写它非常难。可能没有通用答案。由于CPU缓存透明地工作,因此无法在不更改缓存内容的情况下从连接的CPU读取其内容。 CPU缓存通常实现为CAM(内容可寻址存储器,关联存储器),如果CPU试图访问数据,缓存被查找,如果数据不在那里它们是从内存中取出的,但我担心这个过程对CPU是透明的

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

希望有更深入的硬件知识的人能够发光。

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

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

但是,如果您正在尝试读取I-cache的内容,那么这在架构上是依赖的。此外,您还需要考虑竞争条件。用于读取缓存内容的指令可能无意中覆盖了缓存内容本身。

此主题所述,只需使用CPU可以导致缓存内容发生变化。由于(大多数)缓存实现对CPU有意完全透明,因此您无法直接从传统CPU上运行的软件中查看缓存内容。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top