Я хочу отслеживать goid программ go с помощью ebpf
.
После прочтения некоторых сообщений и блогов я знаю, что %fs:0xfffffffffffffff8
указывает на структуру g
функции go, а инструкция 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 хранится в структуре g
go. Значение регистра fs можно получить через аргумент ctx
функции ebpf
.
Но я не знаю настоящий адрес %fs:0xfffffffffffffff8
, потому что я новичок в ассемблере. Может ли кто-нибудь дать мне несколько советов?
Если бы значение регистра fs было 0x88, каково значение %fs:0xfffffffffffffff8
?