(dlv) b /usr/local/go/src/runtime/asm_amd64.s:258 Breakpoint 2 set at 0x4542cb for runtime.rt0_go() /usr/local/go/src/runtime/asm_amd64.s:258 (dlv) c (dlv) si
runtime.rt0_go() /usr/local/go/src/runtime/asm_amd64.s:259 (PC: 0x4542d2) Warning: debugging optimized function // 将 [runtime.m0+136] 地址移到 rdi,rdi = &runtime.m0.tls asm_amd64.s:258 0x4542cb* 488d3d565f0700 lea rdi, ptr [runtime.m0+136] // 调用 runtime.settls 设置线程本地存储 => asm_amd64.s:259 0x4542d2 e809240000 call runtime.abort asm_amd64.s:265 0x4542eb 483d23010000 cmp rax, 0x123 asm_amd64.s:266 0x4542f1 7405 jz 0x4542f8 asm_amd64.s:267 0x4542f3 e808040000 call $runtime.abort
为加深这块理解,我们从汇编角度看具体是怎么设置的。
asm_amd64.s:258 0x4542cb* 488d3d565f0700 lea rdi, ptr [runtime.m0+136] => rdi = &runtime.m0.tls = 0x00000000004ca228
asm_amd64.s:259 0x4542d2 e809240000 call $runtime.settls => 设置的是 Fs_base 段基址寄存器的值,regs 查看 Fs_base=0x00000000004ca230
asm_amd64.s:263 0x4542d7 6448c70425f8ffffff23010000 mov qword ptr fs:[0xfffffff8], 0x123 => fs:[0xfffffff8],fs 是段基址,实际是 www.laipuhuo.com Fs_base 段基址寄存器的值,[0xfffffff8] 是偏移量。fs:[0xfffffff8] = 0x00000000004ca230:[0xfffffff8] = 0x00000000004ca228 => 实际通过段基址寄存器 fs:[0xfffffff8] 访问的内存地址就是 m0.tls 的地址 0x00000000004ca228