簡體   English   中英

閱讀function,runtime·rt0_go時如何理解宏、get_tls和標識符、TLS?

[英]How to understand the macro, get_tls, and identifier,TLS, when I read function, runtime·rt0_go?

最近想了解Go程序啟動的詳細過程。但是,當我閱讀一些關於線程本地存儲的代碼時,我感到困惑。 以下代碼段來自名為 runtime/asm_amd64.s 的源文件的第 183 到 198 行:

    LEAQ    runtime·m0+m_tls(SB), DI
    CALL    runtime·settls(SB)

    // store through it, to make sure it works
    get_tls(BX)
    MOVQ    $0x123, g(BX)
    MOVQ    runtime·m0+m_tls(SB), AX
    CMPQ    AX, $0x123
    JEQ 2(PC)
    CALL    runtime·abort(SB)
    ok:
    // set the per-goroutine and per-mach "registers"
    get_tls(BX)
    LEAQ    runtime·g0(SB), CX
    MOVQ    CX, g(BX)
    LEAQ    runtime·m0(SB), AX

要將 g0 放入 TLS,需要執行 label "ok" 之后的三行代碼:

get_tls(BX)
LEAQ runtime·g0(SB),CX
MOVQ CX,g(BX)

但是當我找到來自 runtime/go_tls.h 的第 9 到 12 行的“get_tls”的定義時,我無法理解宏 get_tls:

#ifdef GOARCH_amd64
#define get_tls(r)  MOVQ TLS, r
#define g(r)    0(r)(TLS*1)
#endif

什么是“TLS”? 是不是amd64架構的寄存器,我不知道?程序如何通過它獲取線程本地存儲?

謝謝您的回答。

我相信在具有足夠數量寄存器(例如 amd64 但不是 i386)的體系結構上,一個 CPU 寄存器會永久保存一個指向線程本地存儲區域的指針。

對於其他體系結構,有一種不同的(較慢的)路徑可以避免永久使用寄存器。

TLS 是一個偽寄存器。 請參閱go 源文件中的注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM