https://www.cnblogs.com/revercc/p/17803876.html Ryšys tarp eBPF uprobe programos ir kernel/events/uprobe.c iš esmės yra tas, kad eBPF mechanizmas pakartotinai naudoja branduolio vietinę uprobe infrastruktūrą, kad įgyvendintų vartotojo būsenos funkcijų kablio funkciją. Tiksliau, eBPF uprobe yra branduolio uprobe sistemos "taikymas", kuris yra susietas per vidinę branduolio iškvietimo grandinę ir duomenų struktūrą. Pagrindinis ryšys: eBPF remiasi branduolio uprobe sistema, kad įdiegtų kabliukus Branduolys uprobe.c yra pagrindinis Linux branduolio vietinio vartotojo būsenos zondo (uprobe) įgyvendinimas ir yra atsakingas už: Valdyti vartotojo būsenos zondų registraciją ir atšaukimą (pvz., register_uprobe(), unregister_uprobe()). Tvarko stabdos taško įterpimą (stabdos taško instrukcijų rašymas į tikslinės funkcijos adresą, pvz., x86 int3). Užfiksuokite lūžio taško paleidimo įvykius (įstrigo branduolio būsenos apdorojime, kai programa vykdoma iki lūžio taško). Iškvieskite iš anksto užregistruotą atgalinio skambinimo funkciją (t. y. kablio logiką). eBPF uprobe programa (pvz., jūsų parašytas kabliuko libc.so pavyzdys) iš esmės registruoja uprobe pagrįstą eBPF atgalinio iškvietimo funkciją su branduoliu per eBPF krautuvą (pvz., bcc, libbpf), kuri visiškai remiasi uprobe.c teikiama infrastruktūra. Specifinė skambučių grandinė: srautas iš eBPF programos į uprobe.c Kai užregistruojate uprobe per eBPF krautuvą (pvz., BCC attach_uprobe), pagrindinis procesas yra toks: eBPF krautuvas inicijuoja registracijos užklausą Krautuvas (pvz., bcc Python kodas) per sistemos iškvietimą (pvz., bpf() arba perf_event_open()) praneša branduoliui, kad "Noriu pakabinti eBPF kabliuką ant libc.so openat funkcijos" ir perduoda eBPF programos baitų kodą. Branduolio tikrinimas ir eBPF programų paruošimas Branduolio eBPF tikrintojas patikrina programos teisėtumą, kad įsitikintų, jog ji nekelia pavojaus branduolio saugumui. Kai praėjo, įkelkite eBPF programą į branduolį ir turėkite "eBPF atgalinio iškvietimo funkciją" (t.y. uprobe_openat logiką, kurią parašėte). Pakartotinis uprobe.c registracijos sąsajos branduolio naudojimas iškvies register_uprobe() funkciją uprobe.c, užregistruos "vietinį uprobe" ir naudos eBPF atgalinio skambinimo funkciją kaip šio uprobe "trigerio apdorojimo priemonę". Svarbiausia čia yra tokia: eBPF uprobe esmė yra susieti eBPF tipo atgalinį iškvietimą su branduolio vietiniu uprobe. uprobe.c įterpia lūžio tašką ir laukia, kol jis bus suaktyvintas Uprobe.c rašo lūžio taško instrukciją (pvz., x86 int3) į vartotojo būsenos atmintį pagal užregistruotą tikslinį adresą (openat adresą libc.so) ir įrašo pradinę lūžio taško instrukciją (tęsti vykdymą po paleidimo). Funkcijos iškvietimai suaktyvina lūžio taškus, uprobe.c iškviečia eBPF atgalinius skambučius Kai programa iškviečia libc.so:openat, vykdant lūžio taško instrukciją suveikia spąstai ir patenka į branduolio būseną. Šiuo metu: Branduolys iškviečia uprobe_handler() funkciją (branduolio apdorojimo logiką) uprobe.c. uprobe_handler() patikrins registracijos informaciją, atitinkančią lūžio tašką, ir nustatys, kad ji yra susieta su eBPF atgaliniu skambučiu, todėl ji iškvies eBPF programą (ty uprobe_openat parašėte). Paleidus eBPF programą (pvz., renkant parametrus, rašant į ringbuf), uprobe_handler() atkuria pradinę instrukciją ir leidžia programai tęsti vykdymą. Santrauka: Santykis tarp šių dviejų kernel/events/uprobe.c yra pagrindinė infrastruktūra, kuri suteikia pagrindines galimybes, tokias kaip vartotojo būsenos stabdymo taškų įterpimas, fiksavimas ir atkūrimas, ir yra visų vartotojo būsenos zondų (įskaitant eBPF uprobe, gdb derinimą ir kt.) pagrindas. eBPF uprobe programa yra viršutinio lygmens programa, pagrįsta šia infrastruktūra, kuri registruoja eBPF atgalinio iškvietimo funkcijas ir leidžia branduoliui vykdyti eBPF logiką, kai suveikia uprobe, taip užtikrinant efektyvų vartotojo būsenos funkcijų sekimą. Trumpai tariant: uprobe for eBPF yra "vartotojas", o uprobe.c yra "paslaugų teikėjas", o pirmasis pasikliauja antruoju, kad užbaigtų kabliukų registraciją, suaktyvinimą ir vykdymą. |