2013-12-21 276 views
1

我對使用x86程序集中的冒號有點困惑。我知道在實模式%gs:0x14%gs的地址左移4位,並加上0x14。但在保護模式下它是一樣的嗎?例如在保護模式下,如何解釋%gs:0x14?

movl %gs:0x14 %eax 

以什麼方式訪問%gs:0x14?它就像0x14(%gs)或與實模式相同?

更新: 使我的問題更清晰,假設%gs = 0x1234指令movl %gs:0x14 %eax後%eax的值是多少。

更多信息:

剛剛發現了GS和FS的功能在不同的系統 http://www.akkadia.org/drepper/tls.pdf

本文有用的,此鏈接提供有關分部信息:偏移地址。

http://thestarman.pcministry.com/asm/debug/Segments.html

+0

的可能的複製[什麼結腸:在平均x86彙編語法GAS如%DS:(%BX)](http://stackoverflow.com/questions/18736663/what-does-the-colon- mean-in-x86-assembly-gas-syntax-as-in-dsbx) –

回答

1

首先,讓我們處理的條款。似乎你一般使用「保護模式」,而不是實模式。但是,至少在英特爾手冊中,該術語僅適用於32位模式。對於64位模式,他們使用市場營銷術語「IA-32e模式」,這與AMD的「長時間模式」相比是可怕的,但兩者仍然隱藏着64位模式也受到保護的事實。

這種差異是重要的,因爲對付%GS是32位和64位保護模式不同。對於32位,它是另一個段寄存器。一個線程切換代碼在同一個虛擬空間中爲當前線程填充一個段基,因此,與{CS,DS,ES,SS}不同,它在平坦模式下基數不爲零。對於64位,它只是一個保存在處理器MSR中的偏移量,並且也被調度程序更改爲當前線程的TLS地址。 (詳情可之間不同的Linux/* BSD /窗/等其中%FS和%GS的是用來做什麼的角色。)但是,作爲一個共同的結果,看到類似%GS的訪問時:0x14的你應該明白,

  • GS基地址獲得(使用,如上面所解釋的那樣,一個通用的方法爲32位,並且特別基於MSR-處理爲64個比特nvironment)
  • 0×14被添加到該地址

,這就是所有你需要知道的除非你開發內核或其他深層系統的東西,例如紅酒。

+0

很棒的回答。但是,這不是稱爲IA-64的英特爾64位結構嗎? AMD64/x86-64與真實,受保護和長時間模式兼容。受保護的僅用於32位系統。 – AuA

+1

@AuA IA-64完全是另一種架構,沒有任何%gs。當英特爾意識到IA-64出現故障時,他們盜用了AMD64,並將其更名爲IA-32e,EM64T,最後是「Intel 64」。向英特爾表示感謝。 Long模式(英特爾條款中的IA-32e模式)在某種意義上受到保護,它具有虛擬內存級別的頁面級保護,特權命令等,但分段已禁用,儘管它仍需進行配置;它有32位和64位子模式,但32位子模式與舊的保護模式不同。是的,所有這些都是系統程序員真正頭痛的問題。 – Netch

1

您需要仔細閱讀application binary interface規範的體系結構(可能x86-64),即X86-64 ABI

你會發現,%gs就是線程本地存儲相關的。見this answer

所以你的機器指令可能是裝載在字偏移目前TLS的0x14

+0

文檔中沒有關於此問題的解釋。我知道gs被用作線程本地存儲的接口,但我不知道它是如何在%gs:0x14中訪問的。 – AuA