2011-10-21 79 views
8

有了這個功能:如何解釋x86-64上的段寄存器訪問?

mov 1069833(%rip),%rax  # 0x2b5c1bf9ef90 <_fini+3250648> 
add %fs:0x0,%rax 
retq 

如何解釋的第二個指令,並找出加入RAX?

+3

Assming你在linux下運行,[這](http://stackoverflow.com/questions/6611346/amd64-fs-gs-registers-in-linux)的問題可能是相關的。 – user786653

+1

的可能的複製[ 「DS:\ [40207A \]」?是什麼在組裝的意思(http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly) –

回答

8

此代碼:

mov 1069833(%rip),%rax  # 0x2b5c1bf9ef90 <_fini+3250648> 
add %fs:0x0,%rax 
retq 

返回一個線程局部變量的地址。 %fs:0x0是TCB(線程控制塊)的地址,並且1069833(%rip)是從那裏到變量的偏移量,這是已知的,因爲該變量駐留在程序或加載時的某個動態庫中(運行時加載的庫通過dlopen()需要一些不同的代碼)。

這是非常詳細烏利齊·德雷珀的TLS document解釋,特別是第4.3節和§4.3.6。

3

我不知道,因爲分段架構的壞日子,他們一直叫寄存器。我相信適當的術語是一個選擇器(但我可能是錯的)。

不過,我認爲你只需要在fs區第一四字(64位)。

%fs:0x0位表示存儲器的內容在fs:0。既然您已經使用了通用的add(而不是addl),我認爲它會從目標%rax獲取數據寬度。

在獲取實際價值方面,取決於您是處於傳統模式還是長時間模式。

在傳統模式下,您必須獲取fs的值並在GDT(或可能是LDT)中查找它以獲取基地址。

在長模式下,您需要查看相關型號的特定寄存器。如果您現在處於這種狀態,那麼您不幸的是已經超出了我的專業水平。

+0

我想通作爲很多,但我如何從選擇器獲取實際地址?我沒有一個正在運行的進程,只有一個核心轉儲。 –

+0

恐怕我處於長時間模式。 –

+0

是的,選擇器是索引(包括其他內容,如指定LDT/GDT的標誌)。你必須知道GDT/LDT在哪裏,而且我並不完全確定你可以從註冊信息中獲得這些信息。 – paxdiablo