在除錯 Linux 內核作為 QEMU 來賓運行時,GDB我遇到了以下指令:
mov rcx,QWORD PTR gs:0x1fbc0
問題是rcx暫存器確實包含gs與 value 相加的基數0x1fbc0。這是我在 gdb 中發現的:
#Before execution of the instruction
(gdb) p/x $rcx
$10 = 0x0
(gdb) p/x $gs_base
$11 = 0xffff888237c80000
#Execution of the instruction
(gdb) si
vm_unmapped_area (info=info@entry=0xffffc90000eb7d70) at mm/mmap.c:2002
#Completely unclear value
(gdb) p/x $rcx
$12 = 0xffff888105e79980
我的第一個想法是GDB錯誤地報告了 GS 基地,但后來我從rdmsr工具中得到了同樣的結果
$ sudo rdmsr -p 2 0xc0000101
ffff888237c80000
讓事情變得更加不明朗。
為什么不gs:0x1fbc0導致$gs_base 0x1fbc0?
uj5u.com熱心網友回復:
mov使用記憶體源從 指示的線性地址加載資料,它不會將線性地址本身加載到目標中。$gs_base0x1fbc0
為了解決您的一些進一步評論,qword ptrMASM 風格的方言的關鍵字表示記憶體訪問而不是加載立即數。所有記憶體訪問都包含在括號中[...]并且其他所有內容(立即或暫存器訪問)不包含在括號中的規則是 NASM 主義。在 MASM 中,目標可以有關鍵字{size} ptr或方括號[...],或者只指定一個變數名來指示匯編器使用記憶體加載。如果沒有這些,或者通過指定帶有offset關鍵字的變數名,它將進行編碼,以便加載一個立即數。
即使您的示例是立即加載,它也只是mov rcx, 0x1fbc0沒有gs,因為沒有立即注冊表單指令,其中包含任何影響的段覆寫前綴。從技術上講,您可以gs在此類指令前添加前綴,并且在實踐中通常仍可以正常解碼。但是,gs前綴將毫無用處。反匯編器(如 gdb 的)希望不會顯示帶有gs:前綴的此類指令的源立即運算元。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424428.html
