有没有办法读取CPU缓存内容? 架构适用于ARM。
我使一系列地址无效,然后想确定它是否无效。 虽然我可以读取和写入地址范围,无论是否有无效和检查失效,我想知道是否可以读取缓存内容
谢谢!
答案 0 :(得分: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的操作相结合,可以完全用软件测试缓存。
这些是特权说明,因此可能无法在目标平台上访问它们。
我从一个简单的程序开始,它转储所有缓存行的状态。这应该只是通过读取缓存标记提供的内存位置,为您提供足够的信息来读取缓存中的数据。
答案 1 :(得分:2)
我犹豫要写它是不可能的,所以我写它非常难。可能没有通用答案。由于CPU缓存透明地工作,因此无法在不更改缓存内容的情况下从连接的CPU读取其内容。 CPU缓存通常实现为CAM(内容可寻址存储器,关联存储器),如果CPU试图访问数据,缓存被查找,如果数据不存在则从内存中取出,但我担心这个过程对CPU是透明的
选项是使用一种硬件观察模块并嗅探系统总线,将高速缓存连接到RAM。如果数据请求出现在总线上,则请求的数据不在缓存中。
希望有更深入的硬件知识的人能够发光。维基百科上有一个讨论CPU缓存的条目: http://en.wikipedia.org/wiki/CPU_cache
答案 2 :(得分:1)
根据定义,读取缓存内容所需要做的就是加载缓存存储的内存位置。如果缓存工作正常,它将从缓存中提取内容。
但是,如果您正在尝试读取I-cache的内容,那么这在架构上是依赖的。此外,您还需要考虑竞争条件。用于读取缓存内容的指令可能无意中覆盖了缓存内容本身。
答案 3 :(得分:0)
如this thread中所述,仅使用CPU可能会导致缓存内容发生变化。由于(大多数)缓存实现对CPU有意完全透明,因此您无法直接从传统CPU上运行的软件中查看缓存内容。
要做这样的事情,需要一个支持缓存的CPU(带有控制缓存的特殊指令;我不知道这些是否确实存在),或者您需要安装一个单独的HW模块来查看缓存。以下是我的两个想法:
将原始缓存控制器替换为具有其他控制功能的缓存控制器,并且可以连接到系统总线以读取数据。该控制器位于CPU和缓存之间。
将辅助模块与原始缓存并行放置,并具有只读缓存访问权限。然后,CPU可以使用特殊的中断线(或类似的硬件-NOT-软件信号)触发缓存转储到该模块的存储器中,然后稍后(通过总线)将其读回。该控制器不会影响缓存的操作;它只会让你在任何给定的时间拍摄快照。