【发布时间】:2020-06-30 04:57:04
【问题描述】:
我想使用ebpf跟踪go程序的goid。
阅读了一些帖子和博客后,我知道%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