有什么方法(在 ASM/C/C++ 中)能够查询缓存中内存地址的内容,甚至获取寄存器中的当前值?
这会像海森堡原理一样有效吗?试图从寄存器中检索值的代码可能会导致寄存器被卸载?
有什么方法(在 ASM/C/C++ 中)能够查询缓存中内存地址的内容,甚至获取寄存器中的当前值?
这会像海森堡原理一样有效吗?试图从寄存器中检索值的代码可能会导致寄存器被卸载?
大多数处理器中没有“从缓存中读取值”的标准指令。可以推测现代处理器能够读取/写入缓存内容以用于测试目的,但如果有这样的指令,它们不会被公开描述,并且在使用它们时可能需要小心以避免干扰实际代码执行。读取任何内存都可能会影响您要检查的缓存行中的内容。
寄存器值需要相当小心地注意如何编写代码,并且通常几乎不可能在不影响某处的情况下存储所有寄存器值,尽管您可以在大多数处理器中通过使用“推送”类型指令将值存储在堆。一旦“保存”了这些值,就可以使用常规内存读取指令来获取它们,并且由于这些值已经被存储起来,因此您可以(几乎)为其余代码使用任何寄存器。
编辑:由于现在指定了处理器类型:在 32 位模式下的 x86 处理器上,可以使用PUSHA
将所有寄存器推入堆栈(包括列表中间的 ESP 的原始值)。但是,对于 x86-64,您必须对每个寄存器使用单独的 PUSH 指令。但这样做仍然是可行的。
我不熟悉英特尔检查缓存内容的任何指令。