读取CPU缓存内容

12

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

我正在使一段地址范围无效,然后想确认是否已经无效。 虽然我可以在使地址范围无效时进行读写,并且可以在不使其无效和检查无效性的情况下进行读写, 但我想知道是否可能读取缓存内容。

谢谢!

4个回答

8
ARM9提供了缓存操纵和测试寄存器,允许您检查缓存的状态。以下是一个合理的起点:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0151c/Chdcfejb.html ICache和DCache使用MCR和MRC指令维护,这些指令针对ARM v4T程序员模型定义了CP15寄存器7和9。使用MCR和MRC到CP15寄存器15可以提供其他操作。这些操作与使用寄存器7和9的操作相结合,可以完全通过软件测试缓存。
这些是特权指令,因此可能无法在目标平台上访问。
我建议从一个简单的程序开始,该程序将转储所有缓存行的状态。这应该足以通过读取缓存标记提供的内存位置来读取缓存中的数据。

2
我不愿意写“这是不可能的”,因此我写的是“极其困难”。可能没有通用答案。由于CPU缓存透明地工作,因此不可能在不改变缓存内容的情况下从附加的CPU中读取其内容。如果CPU尝试访问数据,则会查找缓存,如果数据不存在,则从内存中获取,但恐怕这个过程对CPU来说是透明的。
选项是使用一种硬件观察模块并侦听系统总线,该总线将缓存连接到RAM。如果总线上出现数据请求,则请求的数据不在缓存中。
希望有更深入的硬件知识的人可以解释一下。
维基百科上有一个条目讨论CPU缓存:http://en.wikipedia.org/wiki/CPU_cache

1

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

然而,如果您尝试读取I-cache的内容,则这取决于架构。此外,您还需要考虑竞争条件。读取缓存内容的指令可能会意外地覆盖缓存内容本身。


0

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接