https://www.cnblogs.com/revercc/p/17803876.html Saikne starp eBPF uprobe programmu un kernel/events/uprobe.c būtībā ir tāda, ka eBPF mehānisms atkārtoti izmanto kodola vietējo uprobe infrastruktūru, lai ieviestu lietotāja stāvokļa funkciju āķa funkciju. Konkrēti, eBPF uprobe ir kodola uprobe ietvara "pielietojums", kas ir saistīts ar iekšējo kodola izsaukumu ķēdi un datu struktūru. Pamata savienojums: eBPF paļaujas uz kodola uprobe ietvaru, lai ieviestu āķus Kodols uprobe.c ir Linux kodola vietējā lietotāja stāvokļa zondes (uprobe) galvenā ieviešana un ir atbildīgs par: Pārvaldīt lietotāja stāvokļa zondes reģistrāciju un anulēšanu (piemēram, register_uprobe(), unregister_uprobe()). Apstrādā pārtraukuma punkta ievietošanu (rakstot pārtraukuma punkta instrukcijas mērķa funkcijas adresei, piemēram, x86 int3). Tveriet pārtraukuma punkta trigera notikumus (iestrēdzis kodola stāvokļa apstrādē, kad programma tiek izpildīta līdz pārtraukuma punktam). Izsauciet iepriekš reģistrētu atzvanīšanas funkciju (t.i., āķa loģiku). eBPF uprobe programma (piemēram, jūsu rakstītais āķa libc.so piemērs) būtībā reģistrē uz uprobe balstītu eBPF atsaukuma funkciju ar kodolu, izmantojot eBPF ielādētāju (piemēram, bcc, libbpf), kas pilnībā paļaujas uz uprobe.c nodrošināto infrastruktūru. Īpaša zvanu ķēde: plūsma no eBPF programmas uz uprobe.c Reģistrējot uprobe, izmantojot eBPF ielādētāju (piemēram, bcc attach_uprobe), pamatā esošais process ir šāds: eBPF ielādētājs uzsāk reģistrācijas pieprasījumu Ielādētājs (piemēram, bcc Python kods) ar sistēmas izsaukumu (piemēram, bpf() vai perf_event_open()) paziņo kodolam, ka "Es vēlos pakārt eBPF āķi uz libc.so openat funkcijas" un nodod eBPF programmas baitu kodu. Kodola pārbaude un eBPF programmu sagatavošana Kodola eBPF verificētājs pārbauda programmas likumību, lai pārliecinātos, ka tā neapdraud kodola drošību. Kad tas ir nokārtots, ielādējiet eBPF programmu kodolā un izmantojiet "eBPF atzvanīšanas funkciju" (t.i., jūsu uzrakstīto uprobe_openat loģiku). Atkārtota uprobe.c reģistrācijas interfeisa kodola izmantošana izsauks register_uprobe() funkciju uprobe.c, reģistrēs "vietējo uprobe" un izmantos eBPF atzvanīšanas funkciju kā šī uprobe "trigera apstrādātāju". Galvenais šeit ir šāds: eBPF uprobe būtība ir saistīt eBPF tipa atsaukumu ar kodola vietējo uprobu. uprobe.c ievieto pārtraukuma punktu un gaida, kamēr tas tiek aktivizēts Uprobe.c raksta pārtraukuma punkta instrukciju (piemēram, x86 int3) lietotāja stāvokļa atmiņā, pamatojoties uz reģistrēto mērķa adresi (openat adrese libc.so), un ieraksta pārtraukuma punkta sākotnējo instrukciju (izpildes atsākšanai pēc aktivizēšanas). Funkciju izsaukumi triger breakpoints, uprobe.c izsauc eBPF atzvanus Kad lietojumprogramma izsauc libc.so:openat, izpildot breakpoint instrukciju, tiek aktivizēts slazds un nonāk kodola stāvoklī. Šajā laikā: Kodols izsauc funkciju uprobe_handler() (kodola apstrādes loģika) uprobe.c. uprobe_handler() pārbaudīs reģistrācijas informāciju, kas atbilst pārtraukuma punktam, un konstatēs, ka tā ir saistīta ar eBPF atzvanīšanu, tāpēc tā izsauks eBPF programmu (t.i., jūsu uzrakstīto uprobe_openat). Pēc eBPF programmas izpildes (piemēram, parametru apkopošana, rakstīšana ringbuf), uprobe_handler() atjauno sākotnējo instrukciju un ļauj programmai turpināt izpildi. Kopsavilkums: Attiecības starp abiem kernel/events/uprobe.c ir pamatā esošā infrastruktūra, kas nodrošina galvenās iespējas, piemēram, lietotāja stāvokļa pārtraukuma punktu ievietošanu, uztveršanu un atgūšanu, un ir pamats visām lietotāja stāvokļa zondēm (ieskaitot eBPF uprobe, gdb atkļūdošanu utt.). eBPF uprobe programma ir augšējā slāņa lietojumprogramma, kas balstīta uz šo infrastruktūru, kas reģistrē eBPF atzvanīšanas funkcijas un ļauj kodolam izpildīt eBPF loģiku, kad uprobe tiek aktivizēts, tādējādi panākot efektīvu lietotāja stāvokļa funkciju izsekošanu. Īsāk sakot: uprobe for eBPF ir "lietotājs" un uprobe.c ir "pakalpojumu sniedzējs", un pirmais paļaujas uz pēdējo, lai pabeigtu āķu reģistrāciju, aktivizēšanu un izpildi. |