1 回答

TA貢獻1712條經驗 獲得超3個贊
這是一個負數,所以它是 FS 基數之前的一個 qword。您需要 FS 基地址,它不是您可以通過調試器看到的 FS 段寄存器中的選擇器值。
您的進程可能進行了系統調用以要求操作系統對其進行設置,或者可能wrfsbase
在支持它的系統上的某個時候使用了該指令。
請注意,至少在 Go 之外,Linux 通常使用 FS 進行線程本地存儲。
(我不確定實際找到 FS 基礎的標準方法是什么;在rdmsr
不可用的用戶空間中執行此操作顯然取決于操作系統;FS 和 GS 基礎作為 MSR 公開,因此操作系統使用它而不是實際修改 GDT 或 LDT 條目。 rdfsbase
需要通過內核在支持 FSGSBASE ISA 擴展的 CPU 上的 CR4 中設置一個位來啟用,所以你不能指望它工作。)
@MargaretBloom 建議用戶空間可能觸發無效頁面錯誤;大多數操作系統將錯誤的虛擬地址報告回用戶空間。例如,在 Linux 中,SIGSEGV 具有地址。(如果它是非規范的,則為 SIGBUS,IIRC。即不在虛擬地址空間的低 47 位或高 47 位中,而是在地址不是低 48 的符號擴展的“洞”中。)
因此,您需要為這些信號安裝信號處理程序,并嘗試從位于內核空間中間的偏移量(基數為 0)或類似的地方加載。如果由于某種原因沒有故障,請將虛擬地址增加 1TiB 或循環中的某些內容。通常沒有 MMIO 映射到用戶空間的虛擬地址空間,因此僅讀取沒有副作用。
- 1 回答
- 0 關注
- 154 瀏覽
添加回答
舉報