BPF ya ana aang'ono, gawo limodzi: BPF yowonjezera
Pachiyambi panali teknoloji ndipo inkatchedwa BPF. Tinayang'ana pa iye m'mbuyomu, Nkhani ya Chipangano Chakale ya mpambo uno. Mu 2013, chifukwa cha zoyesayesa za Alexei Starovoitov ndi Daniel Borkman, mtundu wake wowongoka, wokometsedwa pamakina amakono a 64-bit, adapangidwa ndikuphatikizidwa mu kernel ya Linux. Tekinoloje yatsopanoyi idatchedwa mwachidule BPF Yamkati, kenako idasinthidwanso BPF Yowonjezera, ndipo tsopano, patatha zaka zingapo, aliyense amangoyitcha BPF.
Mwachidule, BPF imakulolani kuti mugwiritse ntchito kachidindo kamene kamaperekedwa ndi ogwiritsa ntchito mosasamala mu Linux kernel space, ndipo zomangamanga zatsopano zinakhala zopambana kotero kuti tidzafunika zolemba khumi ndi ziwiri kuti tifotokoze ntchito zake zonse. (Chinthu chokha chomwe opanga sanachite bwino, monga mukuwonera m'chithunzichi pansipa, chinali kupanga logo yabwino.)
Nkhaniyi ikufotokoza kapangidwe ka makina a BPF pafupifupi, mawonekedwe a kernel ogwirira ntchito ndi BPF, zida zachitukuko, komanso mwachidule, mwachidule za kuthekera komwe kulipo, i.e. chilichonse chomwe tingafunike mtsogolomo kuti tiphunzire mozama momwe BPF imathandizira.
Chidule cha nkhaniyi
Chiyambi cha zomangamanga za BPF. Choyamba, tiwona momwe mbalame zimakhalira ndi zomangamanga za BPF ndikufotokozera zigawo zikuluzikulu.
Zida zachitukuko. Gawo lothandizira la momwe mungasonkhanitsire zofunikira ndi kernel pazoyeserera.
Mapeto. Kumapeto kwa nkhaniyo, amene akuΕ΅erenga mpaka pano adzapeza mawu olimbikitsa ndi malongosoledwe achidule a zimene zidzachitike mβnkhani zotsatirazi. Tidzalembanso maulalo angapo odziwerengera okha omwe alibe chikhumbo kapena kuthekera kodikirira kupitiriza.
Chiyambi cha BPF Architecture
Tisanayambe kulingalira za zomangamanga za BPF, tidzatchula nthawi yomaliza (o) ku BPF yapamwamba, yomwe idapangidwa ngati yankho pakubwera kwa makina a RISC ndikuthetsa vuto la kusefa kwapaketi koyenera. Zomangamangazo zidakhala zopambana kotero kuti, atabadwa m'zaka za makumi asanu ndi anayi ku Berkeley UNIX, adawonetsedwa ku machitidwe ambiri omwe analipo kale, adapulumuka mpaka zaka makumi awiri ndipo akupezabe ntchito zatsopano.
BPF yatsopano idapangidwa kuti iyankhe pakufalikira kwa makina a 64-bit, ntchito zamtambo komanso kufunikira kowonjezereka kwa zida zopangira SDN (Szambiri-defined nntchito). Wopangidwa ndi mainjiniya a kernel network monga choloweza m'malo mwa BPF yachikale, BPF yatsopanoyo patapita miyezi isanu ndi umodzi idapeza ntchito muntchito yovuta kutsatira machitidwe a Linux, ndipo tsopano, patatha zaka zisanu ndi chimodzi ikuwonekera, tidzafunika nkhani yotsatira kuti tchulani mitundu yosiyanasiyana ya mapulogalamu.
Zithunzi zoseketsa
Pachimake, BPF ndi makina a sandbox omwe amakulolani kuti mugwiritse ntchito code "mopanda pake" mu kernel space popanda kusokoneza chitetezo. Mapulogalamu a BPF amapangidwa m'malo ogwiritsira ntchito, amalowetsedwa mu kernel, ndikulumikizidwa ndi zochitika zina. Chochitika chikhoza kukhala, mwachitsanzo, kubweretsa paketi kumalo ochezera a pa Intaneti, kukhazikitsidwa kwa ntchito ina ya kernel, ndi zina zotero. Pankhani ya phukusi, pulogalamu ya BPF idzakhala ndi mwayi wopeza deta ndi metadata ya phukusi (powerenga komanso, mwinamwake, kulemba, kutengera mtundu wa pulogalamu); pakuchita ntchito ya kernel, mikangano ya ntchito, kuphatikiza zolozera ku kernel memory, etc.
Tiyeni tione mwatsatanetsatane ndondomekoyi. Poyamba, tiyeni tikambirane kusiyana koyamba kwa tingachipeze powerenga BPF, mapulogalamu amene analembedwa assembler. M'mawonekedwe atsopano, zomangamanga zinakulitsidwa kotero kuti mapulogalamu akhoza kulembedwa m'zinenero zapamwamba, makamaka, ndithudi, mu C. Pachifukwa ichi, kumbuyo kwa llvm kunapangidwa, zomwe zimakulolani kupanga bytecode kwa zomangamanga za BPF.
Zomangamanga za BPF zidapangidwa, mwa zina, kuti ziziyenda bwino pamakina amakono. Kuti izi zitheke, BPF bytecode, ikangoyikidwa mu kernel, imamasuliridwa m'mawu achikhalidwe pogwiritsa ntchito chigawo chotchedwa JIT compiler (Ju In Tine). Chotsatira, ngati mukukumbukira, mu BPF yachikale pulogalamuyo idakwezedwa mu kernel ndikumangidwira ku gwero la chochitikacho atomiki - potengera kuyimba kamodzi. Muzomangamanga zatsopano, izi zimachitika mu magawo awiri - choyamba, code imayikidwa mu kernel pogwiritsa ntchito foni yamakono. bpf(2)ndiyeno, pambuyo pake, kudzera munjira zina zomwe zimasiyana malinga ndi mtundu wa pulogalamuyo, pulogalamuyo imamangiriza ku gwero la zochitika.
Apa wowerenga akhoza kukhala ndi funso: zidatheka? Kodi chitetezo chotsatira malamulo otere chimatsimikiziridwa bwanji? Chitetezo chakupha chimatsimikiziridwa kwa ife potsegula mapulogalamu a BPF otchedwa verifier (mu Chingerezi siteji iyi imatchedwa verifier ndipo ndipitiriza kugwiritsa ntchito liwu lachingerezi):
Verifier ndi static analyzer yomwe imawonetsetsa kuti pulogalamu sisokoneza magwiridwe antchito a kernel. Izi, mwa njira, sizikutanthauza kuti pulogalamuyo silingasokoneze kayendetsedwe kake - mapulogalamu a BPF, malingana ndi mtundu wake, amatha kuwerenga ndikulembanso zigawo za kernel memory, kubwereranso kwa ntchito, kuchepetsa, kuwonjezera, kulembanso. komanso ngakhale mapaketi a netiweki. Wotsimikizira amatsimikizira kuti kuyendetsa pulogalamu ya BPF sikungawononge kernel komanso kuti pulogalamu yomwe, malinga ndi malamulo, ili ndi mwayi wolembera, mwachitsanzo, deta ya paketi yotuluka, sichitha kulembera kernel kukumbukira kunja kwa paketi. Tidzayang'ana verifier mwatsatanetsatane mu gawo lolingana, titadziwana ndi zigawo zina zonse za BPF.
Wowerenga mwachidwi angazindikire kuti sitinathebe ndi zithunzizo. Zowonadi, zonse zomwe tafotokozazi sizikufotokoza chifukwa chake BPF imasintha chithunzicho poyerekeza ndi BPF yapamwamba. Zatsopano ziwiri zomwe zimakulitsa kwambiri kuchuluka kwa kugwiritsidwa ntchito ndikutha kugwiritsa ntchito kukumbukira komwe kugawana ndi ntchito zothandizira kernel. Mu BPF, kukumbukira kogawana kumayendetsedwa pogwiritsa ntchito zomwe zimatchedwa mamapu - zida zogawana zomwe zili ndi API inayake. Mwinamwake ali ndi dzinali chifukwa mtundu woyamba wa mapu kuwonekera unali tebulo la hashi. Kenako zidawonekera, matebulo am'deralo (per-CPU) ndi magulu am'deralo, mitengo yosaka, mamapu okhala ndi zolozera ku mapulogalamu a BPF ndi zina zambiri. Chosangalatsa kwa ife tsopano ndikuti mapulogalamu a BPF tsopano ali ndi kuthekera kolimbikira pakati pa mafoni ndikugawana ndi mapulogalamu ena komanso malo ogwiritsa ntchito.
Mapu amafikiridwa kuchokera kumayendedwe a ogwiritsa ntchito pogwiritsa ntchito kuyimba foni bpf(2), ndi kuchokera ku mapulogalamu a BPF omwe akuyenda mu kernel pogwiritsa ntchito ntchito zothandizira. Kuphatikiza apo, othandizira alipo osati kuti azigwira ntchito ndi mamapu, komanso kuti athe kupeza maluso ena a kernel. Mwachitsanzo, mapulogalamu a BPF angagwiritse ntchito ntchito zothandizira kuti atumize mapaketi kumalo ena, kupanga zochitika za perf, kupeza mapangidwe a kernel, ndi zina zotero.
Mwachidule, BPF imapereka kuthekera kokweza mosasamala, mwachitsanzo, kuyesedwa kotsimikizika, kachidindo wa ogwiritsa ntchito mu kernel space. Khodi iyi ikhoza kupulumutsa dziko pakati pa mafoni ndi kusinthanitsa deta ndi malo ogwiritsira ntchito, komanso amatha kupeza ma subsystems a kernel omwe amaloledwa ndi pulogalamu yamtunduwu.
Izi zikufanana kale ndi mphamvu zomwe zimaperekedwa ndi ma module a kernel, poyerekeza ndi zomwe BPF ili ndi ubwino wina (zowona, mungathe kufananitsa ntchito zofanana, mwachitsanzo, kufufuza dongosolo - simungathe kulemba dalaivala wosasamala ndi BPF). Mutha kuzindikira malo otsika olowera (zinthu zina zomwe zimagwiritsa ntchito BPF sizifuna kuti wogwiritsa ntchitoyo akhale ndi luso la pulogalamu ya kernel, kapena luso la pulogalamu yonse), chitetezo chanthawi yothamanga (kwezerani dzanja lanu mu ndemanga kwa omwe sanaswe dongosolo polemba. kapena kuyesa ma modules), atomiki - pali nthawi yochepetsera pamene mukutsegulanso ma modules, ndipo gawo laling'ono la BPF limatsimikizira kuti palibe zochitika zomwe zaphonya (kukhala chilungamo, izi sizowona kwa mitundu yonse ya mapulogalamu a BPF).
Kukhalapo kwa kuthekera kotereku kumapangitsa BPF kukhala chida chapadziko lonse lapansi chokulitsa kernel, chomwe chimatsimikiziridwa muzochita: mitundu yatsopano yowonjezereka ya mapulogalamu ikuwonjezeredwa ku BPF, makampani ochulukirachulukira amagwiritsa ntchito BPF pamaseva olimbana 24 Γ 7, mochulukirachulukira. oyambitsa amapanga bizinesi yawo pamayankho ozikidwa pa BPF. BPF imagwiritsidwa ntchito paliponse: poteteza motsutsana ndi DDoS, kupanga SDN (mwachitsanzo, kukhazikitsa maukonde a kubernetes), monga chida chachikulu chotsata ndi kusonkhanitsa ziwerengero, pamakina ozindikira zolowera ndi makina a sandbox, ndi zina zambiri.
Tiyeni titsirize mwachidule gawo la nkhaniyi ndikuwona makina enieni komanso chilengedwe cha BPF mwatsatanetsatane.
Kupatuka: zothandiza
Kuti mutha kuyendetsa zitsanzo m'magawo otsatirawa, mungafunike zingapo zothandizira, osachepera llvm/clang ndi chithandizo cha bpf ndi bpftool. Mu gawo Zida Zachitukuko Mutha kuwerenga malangizo osonkhanitsira zofunikira, komanso kernel yanu. Gawoli laikidwa pansipa kuti lisasokoneze kugwirizana kwa ulaliki wathu.
BPF Virtual Machine Registers and Instruction System
Zomangamanga ndi malamulo a BPF zidapangidwa poganizira kuti mapulogalamu adzalembedwa m'chilankhulo cha C ndipo, atatsitsa mu kernel, amamasuliridwa m'makhodi achilengedwe. Choncho, chiwerengero cha zolembera ndi ndondomeko ya malamulo anasankhidwa ndi diso ku mphambano, m'lingaliro la masamu, luso la makina amakono. Kuphatikiza apo, zoletsa zosiyanasiyana zidayikidwa pamapulogalamu, mwachitsanzo, mpaka posachedwapa sikunali kotheka kulemba malupu ndi ma subroutines, ndipo malangizowo anali ochepa mpaka 4096 (tsopano mapulogalamu mwayi amatha kutsitsa mpaka malangizo miliyoni).
BPF ili ndi zolembera khumi ndi chimodzi zopezeka ndi 64-bit r0-r10 ndi kauntala pulogalamu. Register r10 ili ndi cholozera chimango ndipo imawerengedwa kokha. Mapulogalamu ali ndi mwayi wopeza ma 512-byte stack panthawi yothamanga komanso kukumbukira kosawerengeka komwe kumagawana munjira yamapu.
Tiyeni tipitilize kufotokoza ndikulankhula za dongosolo lamalamulo logwirira ntchito ndi zinthu izi. Zonse (Pafupifupi onse) Malangizo a BPF ali ndi kukula kwa 64-bit. Mukayang'ana malangizo amodzi pamakina a 64-bit Big Endian mudzawona
ndi Code - uku ndiko kusindikiza kwa malangizo, Dst/Src ndi ma encoding a wolandila ndi gwero, motsatana, Off - 16-bit osaina indentation, ndi Imm ndi nambala yosainidwa ya 32-bit yomwe imagwiritsidwa ntchito m'malangizo ena (ofanana ndi cBPF yokhazikika K). Encoding Code ili ndi imodzi mwa mitundu iwiri:
Makalasi ophunzitsira 0, 1, 2, 3 amatanthauzira malamulo ogwirira ntchito ndi kukumbukira. Iwo Amayitanidwa, BPF_LD, BPF_LDX, BPF_ST, BPF_STX, motero. Maphunziro 4, 7BPF_ALU, BPF_ALU64) amapanga malangizo a ALU. Magulu 5, 6 (BPF_JMP, BPF_JMP32) ali ndi malangizo a kudumpha.
Ndondomeko yowonjezera yophunzirira dongosolo la malangizo a BPF ili motere: m'malo molemba mosamala malangizo onse ndi magawo awo, tiwona zitsanzo zingapo m'gawoli ndipo kuchokera kwa iwo zidzamveka bwino momwe malangizowo amagwirira ntchito komanso momwe angachitire. phatikizani pamanja fayilo iliyonse ya binary ya BPF. Kuti tiphatikize zomwe zili pambuyo pake m'nkhaniyi, tidzakumananso ndi malangizo pawokha m'magawo onena za Verifier, JIT compiler, kumasulira kwa BPF yapamwamba, komanso powerenga mamapu, kuyimbira foni, ndi zina zambiri.
Ma code code ndi ofanana b7, 15, b7 ΠΈ 95. Kumbukirani kuti magawo atatu ofunikira kwambiri ndi gulu la malangizo. Kwa ife, gawo lachinayi la malangizo onse liribe kanthu, kotero makalasi ophunzitsira ndi 7, 5, 7, 5 motsatira. BPF_ALU64,ndi 5 ndi BPF_JMP. M'makalasi onse awiri, ndondomeko ya malangizo ndi yofanana (onani pamwambapa) ndipo tikhoza kulembanso pulogalamu yathu monga chonchi (nthawi yomweyo tidzalembanso mizati yotsalayo mu mawonekedwe aumunthu):
Op S Class Dst Src Off Imm
b 0 ALU64 0 0 0 1
1 0 JMP 0 1 1 0
b 0 ALU64 0 0 0 2
9 0 JMP 0 0 0 0
Ntchito b kalasi ALU64 Ndi BPF_MOV. Imapereka mtengo ku kaundula wa kopita. Ngati pang'ono yakhazikitsidwa s (gwero), ndiye mtengo umatengedwa kuchokera ku kaundula wa gwero, ndipo ngati, monga momwe ziliri ifeyo, sizinakhazikitsidwe, ndiye kuti mtengowo umachotsedwa kumunda. Imm. Kotero mu malangizo oyambirira ndi achitatu timachita opareshoni r0 = Imm. Komanso, ntchito ya JMP kalasi 1 ndi BPF_JEQ (lumpha ngati ofanana). Kwa ife, kuyambira pang'ono S ndi ziro, imafananiza mtengo wa kaundula wa gwero ndi munda Imm. Ngati zikhalidwe zikugwirizana, ndiye kuti kusintha kumachitika PC + Offkumene PC, monga mwachizolowezi, ili ndi adiresi ya malangizo otsatirawa. Pomaliza, JMP Class 9 Operation ndi BPF_EXIT. Malangizowa amathetsa pulogalamuyo, kubwerera ku kernel r0. Tiyeni tiwonjezere gawo latsopano patebulo lathu:
Op S Class Dst Src Off Imm Disassm
MOV 0 ALU64 0 0 0 1 r0 = 1
JEQ 0 JMP 0 1 1 0 if (r1 == 0) goto pc+1
MOV 0 ALU64 0 0 0 2 r0 = 2
EXIT 0 JMP 0 0 0 0 exit
Titha kulembanso izi mwanjira yabwino:
r0 = 1
if (r1 == 0) goto END
r0 = 2
END:
exit
Ngati tikumbukira zomwe zili mu kaundula r1 pulogalamu imaperekedwa cholozera ku nkhani kuchokera ku kernel, ndi mu kaundula r0 mtengo umabwezeredwa ku kernel, ndiye titha kuwona kuti ngati cholozera pamutuwu ndi zero, ndiye kuti tibwerera 1, ndipo mwanjira ina - 2. Tiyeni tiwone kuti tikulondola poyang'ana gwero:
Zinthu za BPF - mapulogalamu ndi mamapu - amapangidwa kuchokera kumalo ogwiritsa ntchito pogwiritsa ntchito malamulo BPF_PROG_LOAD ΠΈ BPF_MAP_CREATE kuyitana kwadongosolo bpf(2), tikambirana ndendende momwe izi zimachitikira mu gawo lotsatira. Izi zimapanga kernel data structures ndi aliyense wa iwo refcount (reference count) imayikidwa ku imodzi, ndipo fayilo yofotokozera yomwe ikulozera ku chinthucho imabwezeretsedwa kwa wogwiritsa ntchito. Pambuyo chogwirira chatsekedwa refcount chinthucho chimachepetsedwa ndi chimodzi, ndipo chikafika pa ziro, chinthucho chimawonongedwa.
Ngati pulogalamuyo imagwiritsa ntchito mamapu, ndiye refcount mamapu awa amachulukitsidwa ndi imodzi pambuyo potsitsa pulogalamuyi, i.e. mafayilo awo ofotokozera akhoza kutsekedwa kuchokera ku ndondomeko ya wosuta ndipo komabe refcount sizikhala zero:
Pambuyo potsegula bwino pulogalamu, nthawi zambiri timayiyika ku mtundu wina wa jenereta. Mwachitsanzo, titha kuyiyika pa intaneti kuti tigwiritse ntchito mapaketi omwe akubwera kapena kuwalumikiza ndi ena tracepoint mu mtima. Panthawiyi, kauntala yowonetsera idzawonjezekanso ndi imodzi ndipo tidzatha kutseka ndondomeko ya fayilo mu pulogalamu ya loader.
Kodi chimachitika ndi chiyani ngati titseka bootloader? Zimatengera mtundu wa jenereta ya zochitika (mbeza). Nkhokwe zonse za netiweki zidzakhalapo pambuyo poti chojambulira chatha, izi ndizomwe zimatchedwa mbedza zapadziko lonse lapansi. Ndipo, mwachitsanzo, mapulogalamu otsatirira adzatulutsidwa pambuyo pa kutha kwa njira yomwe adawapanga (ndipo chifukwa chake amatchedwa am'deralo, kuchokera ku "local to process"). Mwaukadaulo, mbedza zakomweko nthawi zonse zimakhala ndi fayilo yofananira pamalo ogwiritsira ntchito ndipo zimatseka njira ikatsekedwa, koma mbedza zapadziko lonse lapansi sizitero. Pachithunzi chotsatirachi, pogwiritsa ntchito mitanda yofiira, ndikuyesera kusonyeza momwe kutha kwa pulogalamu yapamtunda kumakhudzira moyo wa zinthu pazochitika za mbedza zam'deralo ndi zapadziko lonse.
Chifukwa chiyani pali kusiyana pakati pa mbedza zam'deralo ndi zapadziko lonse lapansi? Kuthamanga mitundu ina ya mapulogalamu a pa intaneti kumakhala komveka popanda malo ogwiritsira ntchito, mwachitsanzo, ganizirani chitetezo cha DDoS - bootloader imalemba malamulo ndikugwirizanitsa pulogalamu ya BPF ku mawonekedwe a intaneti, pambuyo pake bootloader ikhoza kupita ndi kudzipha yokha. Kumbali inayi, taganizirani pulogalamu yowonongeka yomwe mudalemba pa mawondo anu mumphindi khumi - ikatha, mukufuna kuti pasakhale zinyalala zomwe zatsala m'dongosolo, ndipo mbedza zakomweko zidzatsimikizira zimenezo.
Kumbali inayi, yerekezani kuti mukufuna kulumikizana ndi tracepoint mu kernel ndikusonkhanitsa ziwerengero pazaka zambiri. Pankhaniyi, mungafune kumaliza gawo la ogwiritsa ntchito ndikubwerera ku ziwerengerozo nthawi ndi nthawi. Makina a fayilo a bpf amapereka mwayi uwu. Ndi fayilo ya pseudo-memory yokha yomwe imalola kupanga mafayilo omwe amalozera zinthu za BPF ndikuwonjezera. refcount zinthu. Pambuyo pake, chojambuliracho chikhoza kutuluka, ndipo zinthu zomwe adapanga zidzakhalabe zamoyo.
Kupanga mafayilo mu bpffs omwe amalozera zinthu za BPF amatchedwa "pinning" (monga m'mawu otsatirawa: "ndondomeko imatha kuyika pulogalamu ya BPF kapena mapu"). Kupanga zinthu zamafayilo pazinthu za BPF ndizomveka osati kungowonjezera moyo wa zinthu zam'deralo, komanso kugwiritsidwa ntchito kwa zinthu zapadziko lonse lapansi - kubwereranso ku chitsanzo ndi pulogalamu yachitetezo cha DDoS yapadziko lonse lapansi, tikufuna kuti titha kubwera ndikuwona ziwerengero. nthawi ndi nthawi.
Mafayilo a BPF nthawi zambiri amayikidwa mkati /sys/fs/bpf, koma imathanso kukwera kwanuko, mwachitsanzo, motere:
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint
Mayina amtundu wa fayilo amapangidwa pogwiritsa ntchito lamulo BPF_OBJ_PIN Kuyitana kwa dongosolo la BPF. Kuti tichitire fanizo, tiyeni titenge pulogalamu, tiyipange, ikweze, ndikuyikanikiza bpffs. Pulogalamu yathu sichita chilichonse chothandiza, tikungopereka ma code kuti mutha kupanganso chitsanzo:
$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory
Kuchotsa zinthu
Ponena za kuchotsa zinthu, ndikofunikira kumveketsa bwino kuti titatha kuletsa pulogalamuyi ku mbedza (jenereta ya zochitika), palibe chochitika chimodzi chatsopano chomwe chidzayambitse kukhazikitsidwa kwake, komabe, zochitika zonse zamakono za pulogalamuyi zidzakwaniritsidwa mwadongosolo. .
Mitundu ina ya mapulogalamu a BPF amakulolani kuti musinthe pulogalamuyo pa ntchentche, i.e. kupereka ndondomeko ya atomiki replace = detach old program, attach new program. Pachifukwa ichi, zochitika zonse zamtundu wakale wa pulogalamuyi zidzamaliza ntchito yawo, ndipo otsogolera atsopano adzapangidwa kuchokera ku pulogalamu yatsopano, ndipo "atomicity" apa ikutanthauza kuti palibe chochitika chimodzi chomwe chidzaphonyedwe.
Kuwongolera Zinthu Pogwiritsa Ntchito Bpf System Call
Pulogalamu ya BPF
Zinthu zonse za BPF zimapangidwa ndikuyendetsedwa kuchokera kumalo ogwiritsa ntchito pogwiritsa ntchito kuyimba kwadongosolo bpf, okhala ndi prototype iyi:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
Nayi timu cmd ndi chimodzi mwazinthu zamtundu enum bpf_cmd, attr - cholozera ku magawo a pulogalamu inayake ndi size - kukula kwa chinthu molingana ndi cholozera, i.e. kawirikawiri izi sizeof(*attr). Mu kernel 5.8 kuyimba kwadongosolo bpf amathandiza 34 malamulo osiyanasiyana, ndi tanthauzounion bpf_attr ali ndi mizere 200. Koma sitiyenera kuchita mantha ndi izi, chifukwa tikhala tikudziwa bwino za malamulo ndi magawo m'nkhani zingapo.
Tiyeni tiyambe ndi timu BPF_PROG_LOAD, yomwe imapanga mapulogalamu a BPF - imatenga malangizo a BPF ndikuyiyika mu kernel. Panthawi yotsitsa, chotsimikizira chimayambitsidwa, ndiyeno wopanga JIT ndipo, atachita bwino, chofotokozera cha fayilo chimabwezeretsedwa kwa wogwiritsa ntchito. Tinaona zimene zidzamuchitikire mβgawo lapitalo za kayendedwe ka moyo wa BPF zinthu.
Zochitika zosangalatsa mu pulogalamu zimayamba ndi tanthauzo la mndandanda insns - pulogalamu yathu ya BPF pamakina. Pachifukwa ichi, malangizo aliwonse a pulogalamu ya BPF amadzazidwa ndi dongosolo bpf_insn. Chinthu choyamba insns imagwirizana ndi malangizo r0 = 2, chachiwiri - exit.
Kubwerera. Kernel imatanthauzira ma macros osavuta polemba manambala amakina, ndikugwiritsa ntchito fayilo yamutu wa kernel tools/include/linux/filter.h tikhoza kulemba
Koma popeza kulemba mapulogalamu a BPF m'makhodi achilengedwe ndikofunikira polemba mayeso mu kernel ndi zolemba za BPF, kusowa kwa macros sikumasokoneza moyo wa wopangayo.
Pambuyo pofotokozera pulogalamu ya BPF, timapita kukayiyika mu kernel. Magawo athu a minimalist attr zikuphatikiza mtundu wa pulogalamu, seti ndi kuchuluka kwa malangizo, chilolezo chofunikira, ndi dzina "woo", zomwe timagwiritsa ntchito kuti tipeze pulogalamu yathu pamakina pambuyo potsitsa. Pulogalamuyi, monga momwe idalonjezedwera, imayikidwa mu dongosolo pogwiritsa ntchito kuyimba foni bpf.
Kumapeto kwa pulogalamuyo timakhala mu chipika chopanda malire chomwe chimafanana ndi malipiro. Popanda izo, pulogalamuyo idzaphedwa ndi kernel pamene fayilo yofotokozera kuti kuyitana kwadongosolo kwabwerera kwa ife kutsekedwa. bpf, ndipo sitidzaziwona mu dongosolo.
palibe zodabwitsa. Tsopano tiyeni tiwone khodi yopangidwa ndi JIT compiler:
# bpftool prog dump jited id 390
bpf_prog_3b185187f1855c4c_woo:
0: nopl 0x0(%rax,%rax,1)
5: push %rbp
6: mov %rsp,%rbp
9: sub $0x0,%rsp
10: push %rbx
11: push %r13
13: push %r14
15: push %r15
17: pushq $0x0
19: mov $0x2,%eax
1e: pop %rbx
1f: pop %r15
21: pop %r14
23: pop %r13
25: pop %rbx
26: leaveq
27: retq
osathandiza kwambiri kwa exit(2), koma mwachilungamo, pulogalamu yathu ndi yophweka kwambiri, ndipo pamapulogalamu osakhala ang'onoang'ono mawu oyamba ndi epilogue owonjezeredwa ndi JIT compiler ndizofunikira.
Maps
Mapulogalamu a BPF amatha kugwiritsa ntchito malo okumbukira omwe amatha kupezeka ndi mapulogalamu ena a BPF komanso mapulogalamu omwe ali pamalo ogwiritsira ntchito. Zinthuzi zimatchedwa mamapu ndipo m'gawo lino tikuwonetsa momwe tingawagwiritsire ntchito pogwiritsa ntchito kuyimbira foni bpf.
Tinene nthawi yomweyo kuti kuthekera kwa mamapu sikungokhala ndi mwayi wogawana nawo kukumbukira. Pali mamapu acholinga chapadera okhala, mwachitsanzo, zolozera ku mapulogalamu a BPF kapena zolozera pamanetiweki, mamapu ogwirira ntchito ndi zochitika za perf, ndi zina zambiri. Sitilankhula za iwo pano, kuti tisasokoneze owerenga. Kupatula izi, timanyalanyaza nkhani zamalumikizidwe, popeza izi sizofunikira pazitsanzo zathu. Mndandanda wathunthu wamitundu yomwe ilipo ikupezekamo <linux/bpf.h>, ndipo m'gawo lino titenga mwachitsanzo mtundu woyamba wa mbiri yakale, tebulo la hashi BPF_MAP_TYPE_HASH.
Ngati mupanga tebulo la hashi mkati, nenani, C ++, munganene unordered_map<int,long> woo, lomwe mβChirasha limatanthauza βNdikufuna tebulo woo kukula kopanda malire, omwe makiyi ake ndi amtundu int, ndipo zikhalidwe ndizo mtundu long" Kuti tipange tebulo la hashi la BPF, tiyenera kuchita chimodzimodzi, kupatula kuti tiyenera kufotokozera kukula kwake kwa tebulo, ndipo m'malo mofotokozera mitundu ya makiyi ndi zikhalidwe, tiyenera kufotokoza kukula kwake mu ma byte. . Kuti mupange mapu gwiritsani ntchito lamulo BPF_MAP_CREATE kuyitana kwadongosolo bpf. Tiyeni tiwone pulogalamu yocheperako yomwe imapanga mapu. Pambuyo pa pulogalamu yapitayi yomwe imadzaza mapulogalamu a BPF, iyi iyenera kuwoneka yosavuta kwa inu:
BPF_MAP_LOOKUP_BATCH, BPF_MAP_LOOKUP_AND_DELETE_BATCH, BPF_MAP_UPDATE_BATCH, BPF_MAP_DELETE_BATCH: ntchito zambiri. Mwachitsanzo, BPF_MAP_LOOKUP_AND_DELETE_BATCH - Iyi ndi njira yokhayo yodalirika yowerengera ndikukhazikitsanso zikhalidwe zonse pamapu
Sikuti malamulo onsewa amagwira ntchito pamapu amitundu yonse, koma kugwira ntchito ndi mitundu ina ya mamapu kuchokera kumalo ogwiritsira ntchito kumawoneka chimodzimodzi ndikugwira ntchito ndi matebulo a hashi.
Chifukwa cha dongosolo, tiyeni timalize kuyesa kwathu pa tebulo la hashi. Kumbukirani kuti tidapanga tebulo lomwe limatha kukhala ndi makiyi anayi? Tiyeni tiwonjezere zina zingapo:
$ sudo bpftool map update id 114 key 2 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 3 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 4 0 0 0 value 1 0 0 0
$ sudo strace -e bpf bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffe6c626da0}}, 120) = 0
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x56049ded5260, value=0x56049ded5280, flags=BPF_ANY}, 120) = -1 E2BIG (Argument list too long)
Error: update failed: Argument list too long
+++ exited with 255 +++
Chilichonse chili bwino: monga momwe amayembekezera, gulu BPF_MAP_UPDATE_ELEM amayesa kupanga makiyi atsopano, achisanu, koma akuwonongeka E2BIG.
Chifukwa chake, titha kupanga ndikuyika mapulogalamu a BPF, komanso kupanga ndikuwongolera mamapu kuchokera pamalo ogwiritsa ntchito. Tsopano ndizomveka kuyang'ana momwe tingagwiritsire ntchito mapu kuchokera ku mapulogalamu a BPF okha. Titha kulankhula za izi m'chinenero cha mapulogalamu ovuta kuwerenga mu makina akuluakulu, koma nthawi yafika yosonyeza momwe mapulogalamu a BPF amalembedwera ndi kusungidwa - pogwiritsa ntchito libbpf.
(Kwa owerenga omwe sakukhutira ndi kusowa kwa chitsanzo chotsika: tidzasanthula mwatsatanetsatane mapulogalamu omwe amagwiritsa ntchito mapu ndi ntchito zothandizira zomwe zimapangidwa pogwiritsa ntchito libbpf ndikuuzeni zomwe zimachitika pamlingo wa malangizo. Kwa owerenga omwe sakukhutira kwambiri, tawonjezera chitsanzo mβmalo oyenera mβnkhaniyo.)
Kulemba mapulogalamu a BPF pogwiritsa ntchito libbpf
Kulemba mapulogalamu a BPF pogwiritsa ntchito makina amakina kumatha kukhala kosangalatsa koyamba kokha, kenako kukhuta kumayamba. Panthawiyi muyenera kutembenukira ku chidwi chanu llvm, yomwe ili ndi backend yopangira ma code omanga a BPF, komanso laibulale libbpf, zomwe zimakulolani kuti mulembe mbali ya ogwiritsa ntchito BPF ndikuyika ma code a BPF opangidwa pogwiritsa ntchito llvm/clang.
M'malo mwake, monga momwe tidzaonera m'nkhani ino ndi yotsatira, libbpf imagwira ntchito zambiri popanda izo (kapena zida zofananira - iproute2, libbcc, libbpf-go, etc.) nzosatheka kukhala ndi moyo. Chimodzi mwazinthu zakupha za polojekitiyi libbpf ndi BPF CO-RE (Compile Once, Run Everywhere) - pulojekiti yomwe imakulolani kuti mulembe mapulogalamu a BPF omwe amatha kunyamula kuchokera ku kernel kupita ku inzake, ndikutha kuthamanga pa ma API osiyanasiyana (mwachitsanzo, pamene kernel imasintha kuchokera ku mtundu wina. ku version). Kuti muthe kugwira ntchito ndi CO-RE, kernel yanu iyenera kupangidwa ndi thandizo la BTF (tikufotokoza momwe mungachitire izi mugawoli. Zida Zachitukuko. Mutha kuwona ngati kernel yanu idamangidwa ndi BTF kapena ayi mophweka - ndi kukhalapo kwa fayilo iyi:
Dongosolo lathu lotsatira mu gawoli lili motere: tilemba pulogalamu ya BPF ngati BPF_PROG_TYPE_XDP, mofanana ndi chitsanzo chapitachi, koma mu C, timapanga pogwiritsa ntchito clang, ndi kulemba pulogalamu yothandizira yomwe idzayike mu kernel. M'magawo otsatirawa tidzakulitsa luso la pulogalamu ya BPF ndi pulogalamu yothandizira.
Inde, zinathandiza! Tsopano, tili ndi fayilo ya binary ndi pulogalamuyi, ndipo tikufuna kupanga pulogalamu yomwe idzayike mu kernel. Pachifukwa ichi laibulale libbpf amatipatsa zosankha ziwiri - gwiritsani ntchito API yotsika kapena API yapamwamba. Tidzapita njira yachiwiri, popeza tikufuna kuphunzira kulemba, kukweza ndi kulumikiza mapulogalamu a BPF ndi khama lochepa pakuphunzira kwawo kotsatira.
Choyamba, tiyenera kupanga "mafupa" a pulogalamu yathu kuchokera ku binary pogwiritsa ntchito zomwezo bpftool - mpeni waku Swiss wa dziko la BPF (lomwe lingatengedwe kwenikweni, popeza a Daniel Borkman, m'modzi mwa omwe adalenga ndi osamalira BPF, ndi Swiss):
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
Mu fayilo xdp-simple.skel.h ili ndi code binary ya pulogalamu yathu ndi ntchito zowongolera - kutsitsa, kulumikiza, kuchotsa chinthu chathu. M'malo athu osavuta izi zikuwoneka ngati kuchulukirachulukira, koma zimagwiranso ntchito pomwe fayilo ya chinthu ili ndi mapulogalamu ambiri a BPF ndi mamapu ndikukweza ELF yayikuluyi timangofunika kupanga chigoba ndikuyitanitsa ntchito imodzi kapena ziwiri kuchokera ku pulogalamu yomwe timakonda. akulemba Tiyeni tipitirire tsopano.
# bpftool p | grep -A4 simple
463: xdp name simple tag 3b185187f1855c4c gpl
loaded_at 2020-08-01T01:59:49+0000 uid 0
xlated 16B jited 40B memlock 4096B
btf_id 185
pids xdp-simple(16498)
ndi kutaya (timagwiritsa ntchito njira yofupikitsa ya lamulo bpftool prog dump xlated):
# bpftool p d x id 463
int simple(void *ctx):
; return XDP_PASS;
0: (b7) r0 = 2
1: (95) exit
Chinachake chatsopano! Pulogalamuyi inasindikiza zidutswa za fayilo yathu ya C. Izi zidachitidwa ndi laibulale libbpf, yomwe idapeza gawo la debug mu binary, idayipanga kukhala chinthu cha BTF, ndikuyiyika mu kernel pogwiritsa ntchito BPF_BTF_LOAD, ndiyeno tchulani chofotokozera chotsatira cha fayilo mukamatsitsa pulogalamuyo ndi lamulo BPG_PROG_LOAD.
Othandizira Kernel
Mapulogalamu a BPF amatha kugwira ntchito "zakunja" - othandizira kernel. Ntchito zothandizira izi zimalola mapulogalamu a BPF kuti azitha kupeza mawonekedwe a kernel, kuyang'anira mamapu, komanso kuyankhulana ndi "dziko lenileni" - pangani zochitika za perf, control hardware (mwachitsanzo, kuwongolera mapaketi), ndi zina.
Chitsanzo: bpf_get_smp_processor_id
Mkati mwa dongosolo la "kuphunzira mwachitsanzo" paradigm, tiyeni tiganizire chimodzi mwa ntchito zothandizira, bpf_get_smp_processor_id(), ndithu mu file kernel/bpf/helpers.c. Imabwezeranso nambala ya purosesa yomwe pulogalamu ya BPF yomwe idayitcha ikugwira ntchito. Koma tilibe chidwi ndi semantics yake monga momwe kukhazikitsa kwake kumatenga mzere umodzi:
Ndiko kuti, pamtundu uliwonse wa pulogalamu ya BPF, cholozera ku dongosolo la deta la mtunduwo chimatanthauzidwa struct bpf_verifier_ops, yomwe imayambitsidwa ndi mtengo _name ## _verifier_ops, i.e. xdp_verifier_ops chifukwa xdp. Kapangidwe xdp_verifier_opskutsimikiza ndi mu file net/core/filter.c motere:
Apa timagwiritsa ntchito bpf_set_link_xdp_fd, yomwe imalumikiza mapulogalamu amtundu wa XDP-mtundu wa BPF kumalo olumikizirana netiweki. Tinasindikiza nambala ya mawonekedwe lo, yomwe nthawi zonse imakhala 1. Timayendetsa ntchitoyi kawiri kuti tiyambe kuchotsa pulogalamu yakale ngati idalumikizidwa. Zindikirani kuti tsopano sitikusowa chotsutsa pause kapena kuzungulira kopanda malire: pulogalamu yathu yonyamula katundu ituluka, koma pulogalamu ya BPF siiphedwa chifukwa imalumikizidwa ndi gwero la chochitika. Pambuyo kutsitsa bwino ndi kulumikizana, pulogalamuyo idzayambika pa paketi iliyonse ya netiweki ikafika lo.
Tiyeni kukopera pulogalamu ndi kuyang'ana mawonekedwe lo:
$ sudo ./xdp-simple
$ sudo bpftool p | grep simple
669: xdp name simple tag 4fca62e77ccb43d6 gpl
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 669
Pulogalamu yomwe tidatsitsa ili ndi ID 669 ndipo tikuwona ID yomweyi pamawonekedwe lo. Titumiza mapaketi angapo ku 127.0.0.1 (pempho + yankhani):
$ ping -c1 localhost
ndipo tsopano tiyeni tiyang'ane zomwe zili mu fayilo ya debug virtual /sys/kernel/debug/tracing/trace_pipe, mu bpf_printk akulemba mameseji ake:
# cat /sys/kernel/debug/tracing/trace_pipe
ping-13937 [000] d.s1 442015.377014: bpf_trace_printk: running on CPU0
ping-13937 [000] d.s1 442015.377027: bpf_trace_printk: running on CPU0
Maphukusi awiri adawonedwa lo ndikukonzedwa pa CPU0 - pulogalamu yathu yoyamba yopanda tanthauzo ya BPF idagwira ntchito!
Tiyeni tiwone ngati walumikizidwa lo ndi kutumiza mapaketi ena:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 108
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ llvm-readelf -r xdp-simple.bpf.o | head -4
Relocation section '.relxdp/simple' at offset 0xe18 contains 1 entries:
Offset Info Type Symbol's Value Symbol's Name
0000000000000020 0000002700000001 R_BPF_64_64 0000000000000000 woo
ndi kusintha kaundula gwero mmenemo ndi BPF_PSEUDO_MAP_FD, ndi IMM yoyamba yofotokozera mapu athu ndipo, ngati ili yofanana, mwachitsanzo, 0xdeadbeef, ndiye zotsatira zake tidzalandira malangizo
18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 ll
Umu ndi momwe zidziwitso zamapu zimasamutsidwira ku pulogalamu inayake ya BPF yodzaza. Pankhaniyi, mapu akhoza kupangidwa pogwiritsa ntchito BPF_MAP_CREATE, ndi kutsegulidwa ndi ID pogwiritsa ntchito BPF_MAP_GET_FD_BY_ID.
Total, pamene ntchito libbpf algorithm ili motere:
pakuphatikiza, zolemba zimapangidwa patebulo losamutsidwa kuti zigwirizane ndi mamapu
libbpf amatsegula buku la chinthu cha ELF, amapeza mamapu onse ogwiritsidwa ntchito ndikupanga zofotokozera zamafayilo
Zofotokozera zamafayilo zimayikidwa mu kernel ngati gawo la malangizo LD64
Monga momwe mungaganizire, pali zambiri zomwe zikubwera ndipo tiyenera kuyang'ana pachimake. Mwamwayi, tili ndi chidziwitso - talemba tanthauzo lake BPF_PSEUDO_MAP_FD m'kaundula wa gwero ndipo titha kuziyika, zomwe zingatifikitse ku oyera a oyera onse - kernel/bpf/verifier.c, pomwe ntchito yokhala ndi dzina losiyana imalowa m'malo mwa fayilo yofotokozera ndi adilesi yamtundu wamtundu struct bpf_map:
Tiyeni tiwone ngati pulogalamu yathu yalumikizidwa ndi lo:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 160
(Izi zikhoza kuwonjezeredwa ku .bashrc kapena ku fayilo ina. Payekha, ndimawonjezera zinthu ngati izi ~/bin/activate-llvm.sh ndipo pakufunika ndimachita . activate-llvm.sh.)
Pahole ndi BTF
Zothandiza pahole amagwiritsidwa ntchito pomanga kernel kuti apange zambiri zosokoneza mu mtundu wa BTF. Sitidzafotokozera mwatsatanetsatane mwatsatanetsatane zaukadaulo wa BTF, kupatula kuti ndiyosavuta ndipo tikufuna kuigwiritsa ntchito. Chifukwa chake ngati mupanga kernel yanu, pangani kaye pahole (wopanda pahole simungathe kupanga kernel ndi mwayi CONFIG_DEBUG_INFO_BTF:
$ git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
$ cd pahole/
$ sudo apt install cmake
$ mkdir build
$ cd build/
$ cmake -D__LIB=lib ..
$ make
$ sudo make install
$ which pahole
/usr/local/bin/pahole
Kernels zoyesera ndi BPF
Ndikafufuza zotheka za BPF, ndikufuna kusonkhanitsa maziko anga. Izi, nthawi zambiri, sizofunikira, chifukwa mutha kupanga ndikuyika mapulogalamu a BPF pa kernel yogawa, komabe, kukhala ndi kernel yanu kumakupatsani mwayi wogwiritsa ntchito zida zaposachedwa za BPF, zomwe ziziwoneka pakugawa kwanu m'miyezi yabwino kwambiri. , kapena, monga momwe zilili ndi zida zina zowongolera sizidzapakidwa konse m'tsogolomu. Komanso pachimake chake chimapangitsa kukhala kofunikira kuyesa kachidindo.
Kuti mupange kernel muyenera, choyamba, kernel yokha, ndipo kachiwiri, fayilo yokonzekera kernel. Kuyesera ndi BPF titha kugwiritsa ntchito mwachizolowezi vanila kernel kapena imodzi mwa maso otukuka. M'mbuyomu, chitukuko cha BPF chimachitika m'magulu ochezera a pa intaneti a Linux motero zonse zimasintha posachedwa kudzera mwa David Miller, woyang'anira maukonde a Linux. Kutengera mawonekedwe awo - zosintha kapena zatsopano - zosintha pamaneti zimagwera m'modzi mwazinthu ziwiri - net kapena net-next. Kusintha kwa BPF kumagawidwa mofanana pakati bpf ΠΈ bpf-next, zomwe kenako zimaphatikizidwa mu ukonde ndi ukonde wotsatira, motsatana. Kuti mudziwe zambiri, onani bpf_devel_QA ΠΈ netdev-FAQ. Chifukwa chake sankhani kernel kutengera kukoma kwanu komanso kukhazikika kwa dongosolo lomwe mukuyesa (*-next maso ndiwo osakhazikika kwambiri mwa omwe atchulidwa).
Ndizoposa kukula kwa nkhaniyi kuti tikambirane za momwe mungasamalire mafayilo osinthika a kernel - akuganiza kuti mukudziwa kale momwe mungachitire izi, kapena wokonzeka kuphunzira payekha. Komabe, malangizo otsatirawa ayenera kukhala ochulukirapo kapena ocheperako kuti akupatseni kachitidwe kogwiritsa ntchito BPF.
Tsitsani nsonga imodzi yomwe ili pamwambapa:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next
Pangani kernel yocheperako yogwirira ntchito:
$ cp /boot/config-`uname -r` .config
$ make localmodconfig
Yambitsani zosankha za BPF mufayilo .config mwa kusankha kwanu (mwina CONFIG_BPF idzayatsidwa kale popeza systemd imagwiritsa ntchito). Nawu mndandanda wazosankha kuchokera ku kernel zomwe zagwiritsidwa ntchito pankhaniyi:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_LSM=y
CONFIG_BPF_SYSCALL=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_NETFILTER_XT_MATCH_BPF is not set
# CONFIG_BPFILTER is not set
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_DEBUG_INFO_BTF=y
Kenako titha kusonkhanitsa ndikuyika ma module ndi kernel (mwa njira, mutha kusonkhanitsa kernel pogwiritsa ntchito zomwe zasonkhanitsidwa kumene. clangpowonjezera CC=clang):
$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install
Zomwe zimagwiritsidwa ntchito kwambiri m'nkhaniyi zidzakhala zothandiza bpftool, yoperekedwa ngati gawo la Linux kernel. Imalembedwa ndikusungidwa ndi opanga BPF kwa opanga BPF ndipo itha kugwiritsidwa ntchito kuyang'anira mitundu yonse ya zinthu za BPF - kutsitsa mapulogalamu, kupanga ndikusintha mamapu, kufufuza moyo wa chilengedwe cha BPF, ndi zina zambiri. Zolemba zamtundu wa magwero amasamba amunthu zitha kupezeka mu mtima kapena, zalembedwa kale, pa ukonde.
Pa nthawi yolemba izi bpftool zimangopangidwira RHEL, Fedora ndi Ubuntu (onani, mwachitsanzo, ulusi uwu, yomwe imafotokoza nkhani yosamalizidwa ya kulongedza bpftool mu Debian). Koma ngati mwamanga kale kernel yanu, pangani bpftool zosavuta ngati pie:
$ cd ${linux}/tools/bpf/bpftool
# ... ΠΏΡΠΎΠΏΠΈΡΠΈΡΠ΅ ΠΏΡΡΠΈ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌΡ clang, ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅
$ make -s
Auto-detecting system features:
... libbfd: [ on ]
... disassembler-four-args: [ on ]
... zlib: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
Auto-detecting system features:
... libelf: [ on ]
... zlib: [ on ]
... bpf: [ on ]
$
(Pano ${linux} - iyi ndiye bukhu lanu la kernel.) Pambuyo pochita malamulowa bpftool zidzasonkhanitsidwa mu chikwatu ${linux}/tools/bpf/bpftool ndipo ikhoza kuwonjezeredwa panjira (choyamba kwa wogwiritsa ntchito root) kapena ingotengerani ku /usr/local/sbin.
$ sudo bpftool feature probe kernel
Scanning system configuration...
bpf() syscall for unprivileged users is enabled
JIT compiler is enabled
JIT compiler hardening is disabled
JIT compiler kallsyms exports are enabled for root
...
zomwe zikuwonetsa zomwe BPF imayatsidwa mu kernel yanu.
Mwa njira, lamulo lapitalo likhoza kuyendetsedwa ngati
# bpftool f p k
Izi zimachitidwa ndi fanizo ndi zofunikira kuchokera phukusi iproute2, kumene tingathe, mwachitsanzo, kunena ip a s eth0 mmalo mwa ip addr show dev eth0.
Pomaliza
BPF imakulolani kuti muvale utitiri kuti muyese bwino ndikusintha momwe zimagwirira ntchito pachimake. Dongosololi linakhala lopambana kwambiri, mu miyambo yabwino ya UNIX: njira yosavuta yomwe imakulolani (kukonzanso) ndondomeko ya kernel inalola anthu ambiri ndi mabungwe kuyesa. Ndipo, ngakhale zoyesera, komanso chitukuko cha zomangamanga za BPF palokha, sizikutha, dongosololi lili ndi ABI yokhazikika yomwe imakulolani kuti mumange malingaliro odalirika, komanso ofunika kwambiri, ogwira ntchito zamalonda.
Ndikufuna kuzindikira kuti, mwa lingaliro langa, teknoloji yakhala yotchuka kwambiri chifukwa, kumbali imodzi, imatha play (mamangidwe a makina amatha kumveka mochuluka kapena pang'ono madzulo amodzi), ndipo kumbali ina, kuthetsa mavuto omwe sakanatha (mokongola) asanawonekere. Zigawo ziwirizi palimodzi zimakakamiza anthu kuyesa ndikulota, zomwe zimapangitsa kuti pakhale njira zowonjezera zowonjezera.
Nkhaniyi, ngakhale kuti siifupikitsa, ndi chiyambi chabe cha dziko la BPF ndipo sichimalongosola "zotsogola" ndi mbali zofunika za zomangamanga. Dongosolo lomwe likupita patsogolo ndiloti: Nkhani yotsatira ikhala mwachidule mitundu ya pulogalamu ya BPF (pali mitundu 5.8 yamapulogalamu yomwe imathandizidwa mu 30 kernel), ndiye pomaliza tiwona momwe tingalembere mapulogalamu enieni a BPF pogwiritsa ntchito mapulogalamu otsata kernel. mwachitsanzo, ndiye nthawi ya maphunziro mozama pa BPF zomangamanga, kutsatiridwa ndi zitsanzo za BPF maukonde ndi ntchito chitetezo.
BPF ndi XDP Reference Guide - zolembedwa pa BPF kuchokera ku cilium, kapena ndendende kuchokera kwa a Daniel Borkman, m'modzi mwa omwe adalenga ndi osamalira BPF. Ili ndi limodzi mwa mafotokozedwe oyambirira aakulu, amene amasiyana ndi ena onse chifukwa Danieli ankadziwa bwino lomwe zimene akulemba ndipo palibe zolakwa. Makamaka, chikalatachi chikufotokoza momwe mungagwiritsire ntchito ndi mapulogalamu a BPF a XDP ndi TC mitundu pogwiritsa ntchito zida zodziwika bwino. ip kuchokera phukusi iproute2.
Documentation/networking/filter.txt - Fayilo yoyambirira yokhala ndi zolemba zakale kenako ndi BPF yowonjezera. Kuwerenga kwabwino ngati mukufuna kuphunzira chilankhulo cha msonkhano komanso tsatanetsatane wa zomangamanga.
Blog za BPF kuchokera ku facebook. Imasinthidwa kawirikawiri, koma moyenera, monga Alexei Starovoitov (mlembi wa eBPF) ndi Andrii Nakryiko - (wosamalira) amalembera pamenepo. libbpf).
Zinsinsi za bpftool. Ulusi wosangalatsa wa twitter wochokera kwa Quentin Monnet wokhala ndi zitsanzo ndi zinsinsi zogwiritsa ntchito bpftool.