https://www.cnblogs.com/revercc/p/17803876.html Povezava med uprobe programom eBPF in kernel/events/uprobe.c je v bistvu v tem, da mehanizem eBPF ponovno uporablja izvorno uprobe infrastrukturo jedra za implementacijo hook funkcije funkcij uporabniškega stanja. Natančneje, eBPF-jev uprobe je "aplikacija" ogrodja kernel uprobe, ki je povezan preko notranje verige klicev jedra in podatkovne strukture. Core connection: eBPF se zanaša na kernel uprobe framework za implementacijo hookov Jedro uprobe.c je osrednja implementacija izvorne uporabniške sonde (uprobe) jedra Linux jedra in je odgovorna za: Upravljanje registracije in preklica sond uporabniških držav (npr. register_uprobe(), unregister_uprobe()). Obravnava vstavljanje prelomnih točk (zapisovanje ukazov prelomne točke na naslov ciljne funkcije, kot je int3 v x86). Zajem sprožilnih dogodkov prelomnih točk (ki so zataknjeni v obdelavi stanja jedra, ko se program izvede do točke preloma). Pokličite vnaprej registrirano funkcijo za povratni klic (tj. hook logiko). Uprobe program eBPF (kot je primer hook libc.so, ki ste ga napisali) v bistvu registrira uprobe funkcijo eBPF callback z jedrom preko eBPF nalagalnika (npr. bcc, libbpf), ki v celoti temelji na infrastrukturi, ki jo zagotavlja uprobe.c. Specifična veriga klicev: tok iz programa eBPF v uprobe.c Ko registrirate uprobe preko eBPF nalagalnika (kot je bcc-jev attach_uprobe), je osnovni postopek naslednji: Nalagalnik eBPF sproži zahtevo za registracijo Nalagalec (kot je Python koda bcc) jedru preko sistemskega klica (kot sta bpf() ali perf_event_open()) sporoči, da "želim obesiti eBPF kljuko na funkcijo openat libc.so" in posreduje bajtno kodo programa eBPF. Preverjanje jedra in priprava eBPF programov Jedrni eBPF preverjevalec preverja legitimnost programa, da zagotovi, da ne ogroža varnosti jedra. Ko je sprejeto, naložite eBPF program v jedro in uporabite "eBPF callback funkcijo" (tj. uprobe_openat logiko, ki ste jo napisali). Ponovna uporaba jedra registracijskega vmesnika uprobe.c bo poklicala funkcijo register_uprobe() v uprobe.c, registrirala "nativni uprobe" in uporabila funkcijo eBPF kot "trigger handler" te uprobe. Ključ je tukaj: bistvo eBPF-jevega uprobe je vezati callback tipa eBPF na nativni uprobe jedra. uprobe.c vstavi prelomno točko in počaka, da se sproži. Uprobe.c zapiše ukaz prelomne točke (kot je x86-jev int3) v uporabnikov pomnilnik stanja na podlagi registriranega ciljnega naslova (naslov openat v libc.so) in zabeleži prvotni ukaz prelomne točke (za nadaljevanje izvajanja po sprožitvi). Klici funkcij sprožijo prelomne točke, uprobe.c kliče eBPF povratne klice Ko aplikacija pokliče libc.so:openat, izvedba ukaza prekinitve sproži past in pade v stanje jedra. Trenutno: Jedro pokliče funkcijo uprobe_handler() (logiko obdelave jedra) v uprobe.c. uprobe_handler() bo preveril registracijske podatke, ki ustrezajo prekinitveni točki, in ugotovil, da je vezan na eBPF povratni klic, zato bo poklical eBPF program (tj. uprobe_openat, ki ste ga napisali). Po zagonu programa eBPF (npr. zbiranju parametrov, pisanju v ringbuf) uprobe_handler() obnovi izvirni ukaz in omogoči programu nadaljevanje izvajanja. Povzetek: Odnos med obema kernel/events/uprobe.c je osnovna infrastruktura, ki zagotavlja osnovne zmogljivosti, kot so vstavljanje, zajemanje in obnova točk prekinitve uporabniških stanj, ter je osnova za vse sonde uporabniških stanj (vključno z eBPF uprobe, gdb odpravljanjem napak itd.). Uprobe program eBPF je aplikacija na višji plasti, ki temelji na tej infrastrukturi, ki registrira funkcije povratnih klicev eBPF in omogoča jedru izvajanje logike eBPF, ko se sproži upprobe, s čimer doseže učinkovito sledenje funkcijam uporabniškega stanja. Na kratko: uprobe za eBPF je "uporabnik", uprobe.c pa "ponudnik storitev", prvi pa se zanaša na drugega za dokončanje registracije, sprožitve in izvajanja kljuk. |