%fs:0xfffffffffffffffff8`的真实地址是什么?

问题描述 投票:1回答:1

我想使用ebpf跟踪go程序的对象。阅读了一些帖子和博客后,我知道%fs:0xfffffffffffffff8指向go的g结构,mov %fs:0xfffffffffffffff8,%rcx指令始终出现在go函数的开头。以main.main为例:

func main() {
 177341   458330:   64 48 8b 0c 25 f8 ff    mov    %fs:0xfffffffffffffff8,%rcx
 177342   458337:   ff ff
 177343   458339:   48 3b 61 10             cmp    0x10(%rcx),%rsp
 177344   45833d:   76 1a                   jbe    458359 <main.main+0x29>
 177345   45833f:   48 83 ec 08             sub    $0x8,%rsp
 177346   458343:   48 89 2c 24             mov    %rbp,(%rsp)
 177347   458347:   48 8d 2c 24             lea    (%rsp),%rbp
 177348     myFunc()
 177349   45834b:   e8 10 00 00 00          callq  458360 <main.myFunc>
 177350 }

我也知道goid信息存储在go的g结构中。 fs寄存器的值可以通过ebpf函数的ctx参数获得。但是我不知道%fs:0xfffffffffffffff8的真实地址是什么,因为我是汇编语言的新手。有人可以给我一些提示吗?如果fs寄存器的值为0x88,则%fs:0xfffffffffffffff8的值是多少?谢谢!

go assembly x86-64 bpf ebpf
1个回答
1
投票

这是一个负数,所以它是FS基础前面的一个qword。您需要FS基地址,它是FS段寄存器中选择器值的[[not,您可以通过调试器看到它​​。

您的进程可能进行了系统调用,要求操作系统进行设置,或者可能在支持它的系统上的某些时候使用了wrfsbase指令。

请注意,在Go之外,Linux通常使用FS进行线程本地存储。

(我不确定实际找到FS基础的标准方法是什么;显然,要在wrfsbase不可用的用户空间中执行此操作取决于OS。在支持FSGSBASE ISA扩展的CPU上在CR4中设置一点,因此您不能指望这种工作。)

© www.soinside.com 2019 - 2024. All rights reserved.