段基址寄存器的值 查看 Fs_base www.laipuhuo.com=0x000

72 阅读1分钟

(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.settls//0x123移到fs:[0xfffffff8]asmamd64.s:2630x4542d76448c70425f8ffffff23010000movqwordptrfs:[0xfffffff8],0x123//[runtime.m0+136]的值移到rax寄存器中asmamd64.s:2640x4542e4488b053d5f0700movrax,qwordptr[runtime.m0+136]//比较rax寄存器的www.laipuhuo.com值是否等于0x123,如果不等于则执行callruntime.settls // 将 0x123 移到 fs:[0xfffffff8] asm_amd64.s:263 0x4542d7 6448c70425f8ffffff23010000 mov qword ptr fs:[0xfffffff8], 0x123 // 将 [runtime.m0+136] 的值移到 rax 寄存器中 asm_amd64.s:264 0x4542e4 488b053d5f0700 mov rax, qword ptr [runtime.m0+136] // 比较 rax 寄存器的 www.laipuhuo.com 值是否等于 0x123,如果不等于则执行 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