嗨,根據我對匯編暫存器的理解(rax、rdx 等。對于 64 位架構)
被呼叫時映射到 cpu 暫存器,因為現代 cpu 中的暫存器比匯編暫存器中的多。
我一直想知道的是,當我為了除錯目的在某些組裝操作上設定斷點時..例如
mov rax, rdx
這實際上是否“阻塞”了 cpu 中的相關暫存器,因此可能會減慢甚至阻塞其他行程/執行緒?
我對匯編相對較新,只是想了解匯編中的邏輯暫存器如何轉換為 cpu 中的物理暫存器
uj5u.com熱心網友回復:
不會發生這樣的事情。
當到達斷點時,每次背景關系切換都會發生同樣的事情:行程被中斷。作業系統取得控制權并將所有暫存器的內容保存到記憶體中。然后它將控制轉移到另一個行程(在這種情況下可能是除錯器),將暫存器恢復為它為該行程保存的值。
雖然程式員只能看到一組暫存器,但作業系統會將它們交換出去,這樣每個行程都可以假裝可以訪問所有暫存器。這同樣適用于記憶體;這稱為虛擬記憶體。
uj5u.com熱心網友回復:
斷點是通過 x64 架構中的兩種機制實作的。傳統方法是替換指令的第一個位元組,例如mov rax, rdx用斷點指令0xcc或int 3h.
這將導致執行轉到除錯處理程式,它通常需要0xcc用原始位元組替換指令才能實際執行該指令。
另一種機制是使用除錯暫存器(DB0 到 DB3)來放置地址,這將導致 CPU 在該地址上發生記憶體讀取、記憶體寫入、執行或 I/O 時陷入陷阱。
除錯暫存器可針對每個執行緒進行配置,而修改代碼以獲取軟斷點會影響所有執行緒。(因此,如果他們嘗試實際執行相同的指令,他們也會遇到斷點。但否則仍然沒有效果。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/369868.html
上一篇:使網格渲染器閃爍4次
