[英]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.