2013-07-02 34 views
1

有什麼辦法(在ASM/C/C++中)能夠查詢緩存中內存地址的內容,甚至可以獲取寄存器中的當前值?獲取寄存器/緩存中的當前值?

這是否會像海森堡原理一樣有效?試圖從寄存器檢索值的代碼可能導致寄存器被卸載?

+0

您對此感興趣的任何特定CPU? –

+1

海森堡原理絕對適用於緩存以及「printf()」和家族使用的任何寄存器。但除此之外,你可以嘗試打一個調試器並打破程序。 – Mysticial

+0

@CaptainObvlious我沒有考慮到特定的CPU。相對現代。 Nehalem處理器+? – user997112

回答

2

大多數處理器沒有「從高速緩存中讀取值」的標準指令。人們可以推測現代處理器能夠爲測試目的而讀取/寫入緩存內容,但是如果存在這樣的指令,它們就不會被公開描述,並且在使用它們時可能需要小心以避免干擾實際的代碼執行。讀取任何內存都可能會影響您想要檢查的緩存行中的內容。

寄存器值需要相當小心地注意如何編寫代碼,並且通常幾乎不可能在不影響SOMETHING的情況下存儲所有寄存器值,儘管通過使用「push」類型指令可以在大多數處理器中獲得非常接近的值將值存儲在堆棧上。一旦這些值被「保存」,就可以使用正則存儲器讀取指令來獲取這些值,並且由於這些值已經被存儲,所以可以使用(幾乎)任何寄存器來存儲其餘的代碼。

編輯:由於現在指定了處理器類型: 在32位模式下的x86處理器上,可以使用PUSHA將所有寄存器壓入堆棧(包括列表中間的ESP的原始值)。但是,對於x86-64,您必須爲每個寄存器使用單獨的PUSH指令。但這樣做仍然是可行的。

我不熟悉英特爾的任何指令來檢查緩存內容。