Thaum pib muaj ib lub tshuab thiab nws hu ua BPF. Peb ntsia nws yav dhau los, Phau Qub kab lus ntawm no series. Nyob rau hauv 2013, los ntawm kev siv zog ntawm Alexei Starovoitov thiab Daniel Borkman, ib qho kev txhim kho ntawm nws, optimized rau niaj hnub 64-ntsis tshuab, tau tsim thiab suav nrog hauv Linux ntsiav. Cov thev naus laus zis tshiab no tau luv luv hu ua Internal BPF, tom qab ntawd hloov npe hu ua Extended BPF, thiab tam sim no, tom qab ob peb xyoos, txhua tus tsuas yog hu nws BPF.
Hais lus kwv yees, BPF tso cai rau koj los khiav cov neeg siv khoom siv tsis raug cai hauv Linux kernel qhov chaw, thiab cov qauv tshiab tau ua tiav zoo heev uas peb yuav xav tau kaum ob kab lus ntxiv los piav qhia tag nrho nws cov ntawv thov. (Qhov tsuas yog qhov uas cov neeg tsim khoom ua tsis tau zoo, raws li koj tuaj yeem pom hauv cov lej ua haujlwm hauv qab no, tau tsim lub logo zoo.)
Tswj cov khoom siv bpf system hu. Nrog rau qee qhov kev nkag siab ntawm qhov system twb nyob rau hauv qhov chaw, peb yuav thaum kawg saib yuav ua li cas los tsim thiab tswj cov khoom los ntawm cov neeg siv qhov chaw siv lub kaw lus tshwj xeeb hu - bpf(2).
ΠΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ BPF Ρ ΠΏΠΎΠΌΠΎΡΡΡ libbpf. Tau kawg, koj tuaj yeem sau cov kev pab cuam uas siv lub kaw lus hu. Tab sis nws nyuaj. Rau qhov xwm txheej muaj tseeb dua, cov kws tshaj lij nuclear tsim lub tsev qiv ntawv libbpf. Peb mam li tsim ib qho BPF daim ntawv thov pob txha pob txha uas peb yuav siv hauv cov piv txwv tom ntej.
Kernel Helpers. Ntawm no peb yuav kawm paub yuav ua li cas BPF cov kev pab cuam tuaj yeem nkag mus rau cov neeg pab cuam lub luag haujlwm - lub cuab yeej uas, nrog rau cov duab qhia chaw, nthuav dav lub peev xwm ntawm BPF tshiab piv rau cov classic.
Nkag mus rau daim duab qhia chaw los ntawm BPF cov kev pab cuam. Los ntawm qhov no, peb yuav paub txaus kom nkag siab raws nraim li cas peb tuaj yeem tsim cov kev pab cuam uas siv daim duab qhia chaw. Thiab cia peb mus saib sai sai rau hauv qhov zoo tshaj plaws thiab muaj zog pov thawj.
Cov cuab yeej tsim kho. Pab ntu ntawm yuav ua li cas los ua ke cov khoom siv hluav taws xob uas xav tau thiab cov ntsiav rau kev sim.
Qhov xaus. Thaum kawg ntawm tsab xov xwm, cov neeg uas nyeem qhov deb no yuav pom cov lus txhawb nqa thiab cov lus piav qhia luv luv ntawm qhov yuav tshwm sim hauv cov ntawv hauv qab no. Peb tseem yuav sau ntau qhov txuas rau kev kawm tus kheej rau cov neeg uas tsis muaj lub siab xav lossis muaj peev xwm tos kom txuas ntxiv mus.
Taw qhia rau BPF Architecture
Ua ntej peb pib xav txog BPF architecture, peb yuav xa ib lub sijhawm kawg (oh) rau classic BPF, uas tau tsim los ua cov lus teb rau qhov kev tshwm sim ntawm RISC cov cav tov thiab daws qhov teeb meem ntawm kev lim dej kom zoo. Lub tsev tsim ua tau zoo heev uas, tau yug los nyob rau hauv nineties dashing nyob rau hauv Berkeley UNIX, nws tau ported mus rau feem ntau uas twb muaj lawm operating systems, ciaj sia nyob rau hauv lub vwm nees nkaum thiab tseem tab tom nrhiav tshiab daim ntaub ntawv.
BPF tshiab tau tsim los ua cov lus teb rau qhov chaw ntawm 64-ntsis tshuab, kev pabcuam huab thiab xav tau ntau ntxiv rau cov cuab yeej tsim SDN (Software-defined nkev ua haujlwm). Tsim los ntawm kernel network engineers raws li kev txhim kho hloov tshiab rau BPF classic, BPF tshiab tau hais rau lub hlis tom qab pom cov ntawv thov hauv txoj haujlwm nyuaj ntawm kev taug qab Linux systems, thiab tam sim no, rau xyoo tom qab nws tshwm sim, peb yuav xav tau tag nrho cov ntawv txuas ntxiv mus rau sau ntau hom kev pab cuam.
Cia wb mus saib cov txheej txheem no. Yuav pib nrog, cia peb tham txog thawj qhov sib txawv ntawm classic BPF, cov kev pab cuam uas tau sau rau hauv assembler. Nyob rau hauv lub tshiab version, lub architecture tau nthuav dav kom cov kev pab cuam tuaj yeem sau ua hom lus siab, feem ntau, ntawm chav kawm, hauv C. Rau qhov no, ib qho backend rau llvm tau tsim, uas tso cai rau koj los tsim bytecode rau BPF architecture.
BPF architecture tau tsim, ib feem, kom khiav tau zoo ntawm cov tshuab niaj hnub. Txhawm rau ua qhov haujlwm no hauv kev xyaum, BPF bytecode, ib zaug thauj mus rau hauv cov ntsiav, tau muab txhais ua cov cai ib txwm siv cov khoom hu ua JIT compiler (Just In Tyim). Tom ntej no, yog tias koj nco qab, nyob rau hauv classic BPF qhov kev pab cuam tau loaded rau hauv lub ntsiav thiab txuas mus rau qhov kev tshwm sim qhov chaw atomically - nyob rau hauv cov ntsiab lus ntawm ib tug system hu. Nyob rau hauv lub tshiab architecture, qhov no tshwm sim nyob rau hauv ob theem - ua ntej, cov code yog loaded rau hauv lub ntsiav siv ib tug system hu. bpf(2)thiab tom qab ntawd, tom qab ntawd, los ntawm lwm cov txheej txheem uas txawv nyob ntawm seb hom kev pab cuam, qhov kev pab cuam txuas mus rau qhov xwm txheej.
Ntawm no tus nyeem ntawv yuav muaj lus nug: nws puas ua tau? Yuav ua li cas yog kev ruaj ntseg ntawm xws li code guaranteed? Kev ua tiav kev nyab xeeb yog lav rau peb los ntawm theem ntawm kev thauj khoom BPF cov kev pabcuam hu ua verifier (hauv lus Askiv theem no yog hu ua verifier thiab kuv yuav txuas ntxiv siv lo lus Askiv):
Verifier yog ib qho kev ntsuas zoo li qub uas ua kom ntseeg tau tias qhov kev zov me nyuam tsis cuam tshuam qhov kev ua haujlwm ib txwm muaj ntawm cov ntsiav. Qhov no, los ntawm txoj kev, tsis txhais hais tias qhov kev zov me nyuam tsis tuaj yeem cuam tshuam nrog kev ua haujlwm ntawm lub kaw lus - BPF cov kev pab cuam, nyob ntawm hom, tuaj yeem nyeem thiab sau dua ntu ntawm cov cim nco, rov qab qhov txiaj ntsig ntawm kev ua haujlwm, luas, ntxiv, rov sau dua. thiab txawm xa mus rau cov pob ntawv network. Verifier tau lees paub tias kev ua haujlwm BPF yuav tsis cuam tshuam lub kernel thiab tias ib qho kev pab cuam uas, raws li txoj cai, tau sau nkag, piv txwv li, cov ntaub ntawv ntawm cov pob ntawv tawm, yuav tsis tuaj yeem sau cov kernel nco sab nraum pob ntawv. Peb yuav saib cov neeg txheeb xyuas hauv qhov nthuav dav me ntsis hauv ntu sib txuas, tom qab peb tau paub txog tag nrho lwm cov khoom ntawm BPF.
Yog li peb tau kawm dab tsi txog tam sim no? Tus neeg siv sau ib qho kev pab cuam hauv C, thauj nws mus rau hauv cov ntsiav uas siv lub kaw lus hu bpf(2), qhov twg nws raug kuaj xyuas los ntawm tus neeg txheeb xyuas thiab muab txhais ua ib txwm bytecode. Tom qab ntawd tus tib lossis lwm tus neeg siv txuas qhov program mus rau qhov chaw tshwm sim thiab nws pib ua. Kev sib cais khau raj thiab kev sib txuas yog tsim nyog rau ntau yam. Ua ntej, khiav lub tshuab kuaj xyuas yog qhov kim thiab los ntawm kev rub tawm tib qhov kev pab cuam ob peb zaug peb nkim lub sijhawm siv computer. Qhov thib ob, raws nraim li cas qhov kev pab cuam txuas nrog nyob ntawm nws hom, thiab ib qho "universal" interface tsim ib xyoo dhau los yuav tsis haum rau hom tshiab ntawm cov kev pab cuam. (Txawm hais tias tam sim no hais tias lub architecture tau dhau los ua neeg paub tab, muaj lub tswv yim los koom ua ke qhov kev sib txuas no ntawm qib libbpf.)
Tus neeg nyeem ntawv yuav pom tias peb tseem tsis tau tiav nrog cov duab. Tseeb, tag nrho cov saum toj no tsis piav qhia vim li cas BPF hloov pauv daim duab piv rau classic BPF. Ob qhov kev tsim kho tshiab uas nthuav dav dav ntawm kev siv tau yog lub peev xwm los siv cov cim xeeb sib koom thiab cov neeg pab cuam lub luag haujlwm. Hauv BPF, kev sib koom nco tau siv los siv cov duab qhia chaw - cov ntaub ntawv sib koom nrog cov API tshwj xeeb. Tej zaum lawv tau txais lub npe no vim tias thawj hom ntawv qhia pom yog lub rooj hash. Tom qab ntawd cov arrays tshwm sim, hauv zos (ib-CPU) cov lus hash thiab cov arrays hauv zos, nrhiav ntoo, cov duab qhia chaw uas muaj cov taw qhia rau BPF cov kev pab cuam thiab ntau ntxiv. Dab tsi nthuav rau peb tam sim no yog tias BPF cov kev pab cuam tam sim no muaj peev xwm ua rau lub xeev ntawm kev hu xov tooj thiab qhia nws nrog lwm cov kev pab cuam thiab nrog rau qhov chaw siv.
Hauv cov ntsiab lus, BPF muab lub peev xwm thauj khoom arbitrary, piv txwv li, kuaj xyuas, tus neeg siv code rau hauv qhov chaw kernel. Cov cai no tuaj yeem txuag lub xeev ntawm kev hu xov tooj thiab pauv cov ntaub ntawv nrog cov neeg siv qhov chaw, thiab tseem muaj kev nkag mus rau kernel subsystems tso cai los ntawm hom kev pab cuam no.
Qhov no twb zoo ib yam li lub peev xwm muab los ntawm cov ntsiav modules, piv rau qhov uas BPF muaj qee qhov zoo (qhov tseeb, koj tuaj yeem sib piv cov ntawv siv zoo sib xws, piv txwv li, kev taug qab cov kab ke - koj tsis tuaj yeem sau tus tsav tsheb tsis txaus ntseeg nrog BPF). Koj tuaj yeem nco qab qhov pib nkag qis dua (qee qhov kev siv hluav taws xob uas siv BPF tsis tas yuav kom tus neeg siv kom muaj cov kev txawj ntse hauv lub khoos phis tawj, lossis kev txawj ua haujlwm feem ntau), kev nyab xeeb ntawm lub sijhawm (tso koj txhais tes hauv cov lus rau cov uas tsis ua txhaum lub kaw lus thaum sau ntawv los yog kuaj modules), atomicity - muaj downtime thaum reloading modules, thiab lub BPF subsystem xyuas kom meej tias tsis muaj cov txheej xwm yuav plam (kom ncaj ncees, qhov no tsis muaj tseeb rau txhua hom BPF cov kev pab cuam).
Lub xub ntiag ntawm cov peev txheej no ua rau BPF yog ib qho cuab yeej thoob ntiaj teb rau kev nthuav dav cov ntsiav, uas tau lees paub hauv kev xyaum: ntau thiab ntau hom kev pabcuam tshiab tau ntxiv rau BPF, ntau thiab ntau lub tuam txhab loj siv BPF ntawm kev sib ntaus sib tua servers 24 Γ 7, ntau thiab ntau dua. startups tsim lawv cov lag luam ntawm cov kev daws teeb meem raws li uas yog raws li BPF. BPF yog siv nyob txhua qhov chaw: hauv kev tiv thaiv DDoS tawm tsam, tsim SDN (piv txwv li, kev siv cov tes hauj lwm rau kubernetes), raws li lub hauv paus system tracing cuab tam thiab cov txheeb cais sau, nyob rau hauv intrusion detection systems thiab sandbox systems, thiab lwm yam.
Cia peb ua kom tiav cov ntsiab lus ntawm tsab xov xwm no thiab saib lub tshuab virtual thiab BPF ecosystem kom ntxaws ntxiv.
Digression: kev siv
Txhawm rau kom muaj peev xwm khiav cov piv txwv hauv cov ntu hauv qab no, koj yuav xav tau ntau cov khoom siv hluav taws xob, tsawg kawg llvm/clang nrog bpf kev txhawb nqa thiab bpftoolCov. Hauv seem Cov cuab yeej tsim kho Koj tuaj yeem nyeem cov lus qhia rau kev sib sau cov khoom siv hluav taws xob, nrog rau koj lub kernel. Tshooj lus no tau muab tso rau hauv qab no kom tsis txhob cuam tshuam kev sib haum xeeb ntawm peb qhov kev nthuav qhia.
BPF Virtual Machine Sau npe thiab Kev Qhia Txheej Txheem
Lub architecture thiab kev hais kom ua ntawm BPF tau tsim los rau hauv tus account qhov tseeb tias cov kev pab cuam yuav raug sau ua lus C thiab, tom qab thauj khoom mus rau hauv cov ntsiav, txhais ua cov cai ib txwm muaj. Yog li ntawd, tus naj npawb ntawm cov ntawv sau npe thiab cov lus txib tau xaiv nrog lub qhov muag rau kev sib tshuam, hauv kev nkag siab ntawm lej, ntawm lub peev xwm ntawm cov tshuab niaj hnub. Tsis tas li ntawd, ntau yam kev txwv raug txwv rau cov kev pab cuam, piv txwv li, txog thaum tsis ntev los no nws tsis tuaj yeem sau cov voj voog thiab cov txheej txheem subroutines, thiab cov lus qhia tau txwv rau 4096 (tam sim no cov kev pabcuam muaj cai tuaj yeem thauj mus txog ib lab cov lus qhia).
BPF muaj kaum ib tus neeg siv nkag tau 64-ntsis sau npe r0-r10 thiab ib qho program counter. Sau npe r10 muaj tus taw qhia ncej thiab nyeem nkaus xwb. Cov kev zov me nyuam muaj kev nkag mus rau 512-byte pawg ntawm lub sijhawm ua haujlwm thiab qhov txwv tsis pub muaj kev sib koom ua ke hauv daim duab qhia chaw.
BPF cov kev pabcuam raug tso cai los khiav ib qho tshwj xeeb ntawm cov kev pabcuam-hom kernel pab thiab, tsis ntev los no, ua haujlwm tsis tu ncua. Txhua qhov haujlwm hu ua tuaj yeem siv txog tsib qhov kev sib cav, dhau mus rau hauv cov ntawv sau npe r1-r5, thiab tus nqi xa rov qab mus rau r0. Nws tau lees tias tom qab rov qab los ntawm kev ua haujlwm, cov ntsiab lus ntawm cov ntawv sau npe r6-r9 Yuav tsis hloov.
Rau kev txhais lus zoo, sau npe r0-r11 rau tag nrho cov kev txhawb nqa architectures yog tshwj xeeb mapped rau tiag tiag registers, coj mus rau hauv tus account lub ABI nta ntawm tam sim no architecture. Piv txwv li, rau x86_64 sau npe r1-r5, siv los hla kev ua haujlwm tsis muaj nuj nqi, yog tso tawm rau rdi, rsi, rdx, rcx, r8, uas yog siv los hla cov parameter rau kev ua haujlwm ntawm x86_64. Piv txwv li, tus lej ntawm sab laug txhais mus rau tus lej ntawm sab xis zoo li no:
Cov lej hais kom sib npaug b7, 15, b7 ΠΈ 95. Nco qab tias qhov tsawg kawg peb cov khoom yog cov chav qhia kev qhia. Nyob rau hauv peb rooj plaub, qhov thib plaub me ntsis ntawm tag nrho cov lus qhia yog khoob, yog li cov chav kawm qhia yog 7, 5, 7, 5, raws li. BPF_ALU64,a 5 yog BPF_JMP. Rau ob chav kawm, hom kev qhia ntawv yog tib yam (saib saum toj no) thiab peb tuaj yeem rov sau peb qhov kev pab cuam zoo li no ( tib lub sijhawm peb yuav rov sau cov kab ntawv ntxiv rau tib neeg):
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
Ua haujlwm b chav kawm ALU64 Yog BPF_MOV. Nws muab tus nqi rau qhov chaw sau npe. Yog hais tias lub ntsis yog teem s (qhov chaw), ces tus nqi yog muab los ntawm qhov chaw sau npe, thiab yog hais tias, raws li nyob rau hauv peb cov ntaub ntawv, nws tsis yog teem, ces tus nqi yog muab los ntawm lub teb. Imm. Yog li hauv thawj thiab thib peb cov lus qhia peb ua haujlwm r0 = Imm. Ntxiv mus, JMP chav kawm 1 kev ua haujlwm yog PEB_JEQ (dhia yog sib npaug). Hauv peb qhov xwm txheej, txij li me ntsis S yog xoom, nws piv tus nqi ntawm qhov chaw sau npe nrog daim teb Imm. Yog hais tias tus nqi coincide, ces qhov kev hloov tshwm sim rau PC + Offqhov twg PC, raws li ib txwm muaj, muaj qhov chaw nyob ntawm cov lus qhia tom ntej. Thaum kawg, JMP Chav Kawm 9 Kev Ua Haujlwm yog BPF_EXIT. Cov lus qhia no xaus qhov kev pab cuam, rov qab mus rau lub kernel r0. Cia peb ntxiv ib kab tshiab rau peb lub rooj:
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
Peb tuaj yeem sau qhov no hauv ib daim ntawv yooj yim dua:
r0 = 1
if (r1 == 0) goto END
r0 = 2
END:
exit
Yog tias peb nco ntsoov dab tsi hauv daim ntawv teev npe r1 qhov kev pab cuam tau dhau ib tus taw tes rau cov ntsiab lus los ntawm cov ntsiav, thiab hauv cov npe r0 tus nqi xa rov qab mus rau lub ntsiav, ces peb tuaj yeem pom tias yog tus taw tes rau cov ntsiab lus yog xoom, ces peb rov qab 1, thiab lwm yam - 2. Cia peb xyuas seb peb puas yog los ntawm kev saib lub hauv paus:
BPF cov khoom - cov kev pab cuam thiab daim ntawv qhia - yog tsim los ntawm cov neeg siv chaw siv cov lus txib BPF_PROG_LOAD ΠΈ BPF_MAP_CREATE system hu bpf(2), peb mam li tham txog yuav ua li cas qhov no tshwm sim nyob rau hauv nqe lus tom ntej. Qhov no tsim cov ntaub ntawv kernel thiab rau txhua tus ntawm lawv refcount (siv suav) yog teem rau ib qho, thiab cov ntaub ntawv piav qhia taw qhia rau cov khoom raug xa rov qab rau tus neeg siv. Tom qab tus kov raug kaw refcount cov khoom raug txo los ntawm ib qho, thiab thaum nws ncav cuag xoom, cov khoom raug rhuav tshem.
Yog hais tias qhov kev zov me nyuam siv daim ntawv qhia, ces refcount cov duab qhia chaw no tau nce los ntawm ib qho tom qab thauj cov kev pab cuam, i.e. lawv cov ntaub ntawv piav qhia tuaj yeem raug kaw los ntawm tus neeg siv cov txheej txheem thiab tseem refcount yuav tsis dhau xoom:
Tom qab ua tiav kev thauj khoom ib qho kev pab cuam, peb feem ntau xa nws mus rau qee yam kev tshwm sim generator. Piv txwv li, peb tuaj yeem muab tso rau hauv lub network interface los ua cov ntawv xa tuaj lossis txuas rau qee qhov tracepoint hauv lub hauv paus. Nyob rau ntawm lub sijhawm no, cov ntaub ntawv pov thawj tseem yuav nce ntxiv los ntawm ib qho thiab peb yuav tuaj yeem kaw cov ntaub ntawv piav qhia hauv qhov program loader.
Yuav ua li cas yog tias peb tam sim no kaw lub bootloader? Nws nyob ntawm hom kev tshwm sim generator (nqus). Txhua lub network hooks yuav muaj nyob tom qab lub loader ua tiav, cov no yog lub npe hu ua thoob ntiaj teb hooks. Thiab, piv txwv li, cov phiaj xwm kab yuav raug tso tawm tom qab cov txheej txheem uas tsim lawv raug txiav tawm (thiab yog li hu ua hauv zos, los ntawm "hauv zos mus rau txheej txheem"). Technically, cov hooks hauv zos ib txwm muaj cov ntaub ntawv sib tham hauv cov neeg siv qhov chaw thiab yog li kaw thaum cov txheej txheem raug kaw, tab sis thoob ntiaj teb hooks tsis ua. Hauv daim duab hauv qab no, siv cov ntoo khaub lig liab, kuv sim ua kom pom tias qhov kev txiav tawm ntawm qhov kev pab cuam loader cuam tshuam li cas rau lub neej ntawm cov khoom nyob rau hauv rooj plaub hauv zos thiab thoob ntiaj teb hooks.
Vim li cas thiaj muaj qhov sib txawv ntawm cov hooks hauv zos thiab thoob ntiaj teb? Kev khiav qee hom kev pabcuam hauv network ua rau kev nkag siab yam tsis muaj chaw siv, piv txwv li, xav txog kev tiv thaiv DDoS - bootloader sau cov cai thiab txuas BPF program rau lub network interface, tom qab ntawd tus bootloader tuaj yeem mus thiab tua nws tus kheej. Ntawm qhov tod tes, xav txog qhov kev pab cuam debugging kab uas koj tau sau rau ntawm koj lub hauv caug hauv kaum feeb - thaum nws tiav lawm, koj xav kom tsis muaj cov khib nyiab pov tseg hauv lub cev, thiab cov hooks hauv zos yuav xyuas kom meej tias.
Ntawm qhov tod tes, xav txog tias koj xav txuas mus rau ib qho tracepoint hauv kernel thiab sau cov txheeb cais ntau xyoo. Hauv qhov no, koj yuav xav ua kom tiav cov neeg siv feem thiab rov qab mus rau cov txheeb cais los ntawm ib ntus. Cov ntaub ntawv bpf muab lub sijhawm no. Nws yog ib qho hauv-nco-tsuas yog pseudo-file system uas tso cai rau kev tsim cov ntaub ntawv uas siv BPF cov khoom thiab yog li nce. refcount khoom. Tom qab no, lub loader tuaj yeem tawm, thiab cov khoom nws tsim yuav nyob twj ywm.
Tsim cov ntaub ntawv hauv bpffs uas siv cov khoom siv BPF hu ua "pinning" (raws li hauv kab lus hauv qab no: "txheej txheem tuaj yeem pin ib qho kev pabcuam BPF lossis daim ntawv qhia"). Tsim cov ntaub ntawv rau cov khoom BPF ua rau kev nkag siab tsis yog tsuas yog txuas rau lub neej ntawm cov khoom hauv zos, tab sis kuj tseem siv tau rau cov khoom siv thoob ntiaj teb - rov qab mus rau qhov piv txwv nrog lub ntiaj teb DDoS kev tiv thaiv kev pab cuam, peb xav tuaj yeem tuaj saib thiab txheeb xyuas. ntawm lub sijhawm dhau mus.
$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory
Rho tawm cov khoom
Hais txog kev rho tawm cov khoom, nws yog ib qho tsim nyog yuav tsum tau qhia meej tias tom qab peb tau txiav qhov kev pab cuam los ntawm kev sib txuas (kev tshwm sim lub tshuab hluav taws xob), tsis yog ib qho kev tshwm sim tshiab yuav ua rau nws pib, txawm li cas los xij, tag nrho cov xwm txheej tam sim no ntawm qhov kev zov me nyuam yuav ua tiav hauv qhov kev txiav txim ib txwm. .
Qee hom kev pab cuam BPF tso cai rau koj los hloov qhov kev pab cuam ntawm ya, i.e. muab cov kab ke atomicity replace = detach old program, attach new program. Nyob rau hauv cov ntaub ntawv no, tag nrho cov active piv txwv ntawm lub qub version ntawm qhov kev pab cuam yuav ua tiav lawv cov hauj lwm, thiab tshiab tshwm sim handlers yuav raug tsim los ntawm qhov kev pab cuam tshiab, thiab "atomicity" ntawm no txhais tau hais tias tsis yog ib qho kev tshwm sim yuav ploj.
Txuas cov kev pab cuam rau qhov chaw tshwm sim
Nyob rau hauv tsab xov xwm no, peb yuav tsis cais piav qhia txog kev sib txuas cov kev pab cuam rau qhov chaw tshwm sim, vim nws ua rau kev nkag siab los kawm qhov no hauv cov ntsiab lus ntawm ib hom kev pab cuam. Cm. Piv txwv hauv qab no, uas peb qhia seb cov kev pab cuam zoo li XDP txuas nrog li cas.
Manipulating Objects siv bpf System Hu
BPF cov kev pab cuam
Tag nrho cov khoom BPF yog tsim thiab tswj los ntawm cov neeg siv qhov chaw siv lub kaw lus hu bpf, muaj cov qauv hauv qab no:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
Ntawm no yog pab neeg cmd yog ib qho ntawm qhov tseem ceeb ntawm hom enum bpf_cmd, attr - tus taw tes rau qhov ntsuas rau ib qho kev pab cuam tshwj xeeb thiab size - yam khoom loj raws li tus pointer, i.e. feem ntau qhov no sizeof(*attr). Hauv kernel 5.8 lub kaw lus hu bpf txhawb 34 cov lus txib sib txawv, thiab txhais tauunion bpf_attr occupies 200 kab. Tab sis peb yuav tsum tsis txhob ntshai los ntawm qhov no, txij li thaum peb yuav paub peb tus kheej nrog cov lus txib thiab cov kev txwv tsis pub dhau ob peb nqe lus.
Cia peb pib nrog pab neeg BPF_PROG_LOAD, uas tsim cov kev pab cuam BPF - siv ib txheej ntawm BPF cov lus qhia thiab thauj nws mus rau hauv cov ntsiav. Thaum lub sijhawm thauj khoom, tus neeg pov thawj tau pib, thiab tom qab ntawd JIT compiler thiab, tom qab ua tiav tiav, cov ntaub ntawv piav qhia tau muab xa rov qab rau tus neeg siv. Peb pom dab tsi tshwm sim rau nws tom ntej no hauv ntu dhau los hais txog lub neej voj voog ntawm BPF cov khoom.
Tam sim no peb yuav sau cov kev cai tshwj xeeb uas yuav thauj khoom yooj yim BPF program, tab sis ua ntej peb yuav tsum txiav txim siab seb hom kev pab cuam twg peb xav thauj khoom - peb yuav tsum xaiv hom thiab nyob rau hauv lub moj khaum ntawm hom no, sau ib qho kev pab cuam uas yuav dhau qhov kev kuaj xyuas. Txawm li cas los xij, txhawm rau kom tsis txhob cuam tshuam cov txheej txheem, ntawm no yog ib qho kev npaj ua tiav: peb yuav siv qhov kev pab cuam zoo li BPF_PROG_TYPE_XDP, uas yuav rov qab tus nqi XDP_PASS (hla tag nrho cov pob). Hauv BPF assembler nws zoo li yooj yim heev:
r0 = 2
exit
Tom qab peb tau txiav txim siab uas Peb yuav upload, peb tuaj yeem qhia koj seb peb yuav ua li cas:
Cov xwm txheej txaus siab hauv ib qho kev pab cuam pib nrog lub ntsiab lus ntawm ib qho array insns - peb qhov kev pab cuam BPF hauv tshuab code. Hauv qhov no, txhua qhov kev qhia ntawm BPF qhov kev pab cuam tau ntim rau hauv cov qauv bpf_insn. Thawj lub ntsiab insns ua raws li cov lus qhia r0 = 2, thib ob - exit.
Rov qab. Lub kernel txhais tau yooj yim dua macros rau kev sau cov lej tshuab, thiab siv cov ntaub ntawv kernel header tools/include/linux/filter.h peb sau tau
Tab sis txij li thaum sau BPF cov kev pab cuam hauv cov cai ib txwm muaj tsuas yog tsim nyog rau kev sau cov ntawv xeem hauv cov ntsiav thiab cov ntawv hais txog BPF, qhov tsis muaj cov macros no tsis cuam tshuam rau tus tsim tawm lub neej.
Tom qab txhais qhov kev pab cuam BPF, peb txav mus rau kev thauj khoom mus rau hauv cov ntsiav. Peb cov txheej txheem minimalist attr suav nrog hom kev pab cuam, teeb tsa thiab tus naj npawb ntawm cov lus qhia, daim ntawv tso cai xav tau, thiab lub npe "woo", uas peb siv los nrhiav peb cov kev pab cuam ntawm lub kaw lus tom qab rub tawm. Qhov kev pab cuam, raws li tau cog lus tseg, yog loaded rau hauv lub system siv ib tug system hu bpf.
Thaum kawg ntawm qhov kev pab cuam peb xaus rau hauv lub voj infinite uas simulates lub payload. Yog tsis muaj nws, qhov kev zov me nyuam yuav raug tua los ntawm cov ntsiav thaum cov ntaub ntawv piav qhia uas lub kaw lus hu rov qab rau peb raug kaw bpf, thiab peb yuav tsis pom nws hauv qhov system.
Zoo, peb npaj txhij rau kev sim. Cia peb sib sau ua ke thiab khiav qhov program hauv qab stracetxhawm rau xyuas tias txhua yam ua haujlwm raws li nws yuav tsum:
Ntawm no yog qhov system hu bpf(2) xa rov qab rau peb tus lej piav qhia 3 thiab tom qab ntawd qhov kev pab cuam, raws li xav tau, tos rau cov lus qhia ntxiv hauv kev hu xov tooj pause(2).
Tam sim no cia peb xa peb qhov kev pab cuam mus rau keeb kwm yav dhau lossis qhib lwm lub davhlau ya nyob twg thiab saib peb cov khoom siv hluav taws xob bpftool (peb tuaj yeem paub qhov txawv ntawm peb daim ntawv qhia los ntawm lwm tus los ntawm nws lub npe):
$ sudo bpftool map
...
114: hash name woo flags 0x0
key 4B value 4B max_entries 4 memlock 4096B
...
Tus lej 114 yog tus ID thoob ntiaj teb ntawm peb cov khoom. Txhua qhov kev pab cuam ntawm lub kaw lus tuaj yeem siv tus ID no los qhib daim ntawv qhia uas twb muaj lawm siv cov lus txib BPF_MAP_GET_FD_BY_ID system hu bpf.
Tam sim no peb tuaj yeem ua si nrog peb lub rooj hash. Cia peb saib nws cov ntsiab lus:
$ sudo bpftool map dump id 114
Found 0 elements
Npua. Cia peb muab tus nqi rau nws hash[1] = 1:
$ sudo bpftool map update id 114 key 1 0 0 0 value 1 0 0 0
Cia wb mus saib lub rooj dua:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
Found 1 element
Hooray! Peb tswj kom ntxiv ib lub ntsiab. Nco ntsoov tias peb yuav tsum ua haujlwm ntawm qib byte los ua qhov no, txij li bptftool tsis paub dab tsi hom qhov tseem ceeb hauv lub rooj hash yog. (Qhov kev paub no tuaj yeem xa mus rau nws siv BTF, tab sis ntau ntxiv rau tam sim no.)
Yuav ua li cas raws nraim li bpftool nyeem thiab ntxiv cov ntsiab lus? Cia peb saib hauv qab hood:
Ua ntej peb qhib daim ntawv qhia los ntawm nws lub ntiaj teb ID siv cov lus txib BPF_MAP_GET_FD_BY_ID ΠΈ bpf(2) xa rov qab descriptor 3 rau peb. Ntxiv mus siv cov lus txib BPF_MAP_GET_NEXT_KEY peb pom thawj tus yuam sij hauv lub rooj dhau los NULL raws li tus taw tes rau tus yuam sij "yav dhau los". Yog peb muaj tus yuam sij peb ua tau BPF_MAP_LOOKUP_ELEMuas rov qab tus nqi rau tus pointer value. Cov kauj ruam tom ntej yog peb sim nrhiav cov khoom tom ntej los ntawm kev hla tus taw tes rau qhov tseem ceeb tam sim no, tab sis peb lub rooj tsuas muaj ib lub ntsiab lus thiab cov lus txib. BPF_MAP_GET_NEXT_KEY rov qab ENOENT.
Okay, cia peb hloov tus nqi los ntawm qhov tseem ceeb 1, cia peb hais tias peb lub lag luam logic yuav tsum tau sau npe hash[1] = 2:
Raws li xav tau, nws yooj yim heev: cov lus txib BPF_MAP_GET_FD_BY_ID qhib peb daim ntawv qhia los ntawm ID, thiab cov lus txib BPF_MAP_UPDATE_ELEM overwrites lub ntsiab.
Yog li, tom qab tsim lub rooj hash los ntawm ib qho kev pab cuam, peb tuaj yeem nyeem thiab sau nws cov ntsiab lus los ntawm lwm qhov. Nco ntsoov tias yog tias peb tuaj yeem ua qhov no los ntawm kab hais kom ua, ces lwm yam kev pab cuam ntawm lub kaw lus tuaj yeem ua tau. Ntxiv nrog rau cov lus txib tau piav qhia saum toj no, rau kev ua haujlwm nrog daim duab qhia chaw los ntawm cov neeg siv qhov chaw, cov hauv qab no:
BPF_MAP_LOOKUP_ELEM: nrhiav tus nqi los ntawm qhov tseem ceeb
BPF_MAP_UPDATE_ELEM: hloov tshiab/tsim tus nqi
BPF_MAP_DELETE_ELEM: tshem key
BPF_MAP_GET_NEXT_KEY: nrhiav tus tom ntej (lossis thawj) tus yuam sij
BPF_MAP_GET_NEXT_ID: tso cai rau koj mus dhau txhua daim ntawv qhia uas twb muaj lawm, uas yog nws ua haujlwm li cas bpftool map
BPF_MAP_GET_FD_BY_ID: qhib daim ntawv qhia uas twb muaj lawm los ntawm nws tus ID thoob ntiaj teb
BPF_MAP_LOOKUP_AND_DELETE_ELEM: atomically hloov kho tus nqi ntawm ib yam khoom thiab xa rov qab qhov qub
BPF_MAP_FREEZE: ua kom daim ntawv qhia hloov tsis tau los ntawm userspace (qhov haujlwm no tsis tuaj yeem thim rov qab)
BPF_MAP_LOOKUP_BATCH, BPF_MAP_LOOKUP_AND_DELETE_BATCH, BPF_MAP_UPDATE_BATCH, BPF_MAP_DELETE_BATCH: kev ua haujlwm loj. Piv txwv li, BPF_MAP_LOOKUP_AND_DELETE_BATCH - qhov no yog tib txoj kev txhim khu kev qha los nyeem thiab rov pib dua tag nrho cov txiaj ntsig ntawm daim ntawv qhia
Tsis yog tag nrho cov lus txib no ua haujlwm rau txhua hom daim ntawv qhia, tab sis feem ntau ua haujlwm nrog lwm hom duab qhia chaw los ntawm cov neeg siv qhov chaw zoo ib yam li kev ua haujlwm nrog cov rooj hash.
Rau qhov kev txiav txim, cia peb ua tiav peb qhov kev sim hash rooj. Nco ntsoov tias peb tsim ib lub rooj uas tuaj yeem muaj txog plaub tus yuam sij? Cia peb ntxiv ob peb yam ntxiv:
$ 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
Cov ntaub ntawv no khaws cov ntaub ntawv hais txog txhua hom ntaub ntawv siv hauv kernel thiab siv nyob rau hauv tag nrho peb cov qauv siv libbpf. Peb yuav tham kom ntxaws txog CO-RE hauv tsab xov xwm tom ntej, tab sis hauv qhov no - tsuas yog tsim koj tus kheej lub ntsiav nrog CONFIG_DEBUG_INFO_BTF.
tsev qiv ntawv libbpf nyob txoj cai nyob rau hauv cov directory tools/lib/bpf kernel thiab nws txoj kev loj hlob yog ua los ntawm kev xa ntawv [email protected]. Txawm li cas los xij, ib qho chaw khaws cia cais yog khaws cia rau cov kev xav tau ntawm cov ntawv thov nyob sab nraum lub kernel https://github.com/libbpf/libbpf nyob rau hauv uas lub tsev qiv ntawv kernel yog mirrored rau kev nyeem ntawv ntau los yog tsawg dua li yog.
Hauv seem no peb yuav saib seb koj tuaj yeem tsim ib qhov project uas siv libbpf, cia peb sau ob peb (ntau dua lossis tsawg dua qhov tsis muaj ntsiab lus) kev sim thiab tshuaj xyuas kom meej tias nws ua haujlwm li cas. Qhov no yuav ua rau peb piav qhia yooj yim dua hauv cov tshooj hauv qab no raws nraim li cas BPF cov kev pab cuam cuam tshuam nrog cov duab qhia chaw, cov pab pawg, BTF, thiab lwm yam.
Feem ntau siv tej yaam num libbpf ntxiv GitHub repository raws li git submodule, peb yuav ua tib yam:
Yuav kom BPF cov kev pab cuam ntawm ib hom kev siv no muaj nuj nqi, lawv yuav tsum sau npe rau nws, piv txwv li rau hom BPF_PROG_TYPE_XDP muaj nuj nqi yog txhais nyob rau hauv lub kernel xdp_func_proto, uas txiav txim siab los ntawm tus pab ua haujlwm ID seb XDP txhawb txoj haujlwm no lossis tsis. Peb lub luag haujlwm yog txhawb nqa:
Ntawm no peb pom peb txoj haujlwm paub xdp_func_proto, uas yuav khiav tus txheeb xyuas txhua zaus nws ntsib kev sib tw tej yam ua haujlwm hauv BPF program, saib verifier.c.
Cia peb saib seb qhov kev ua haujlwm siab BPF siv lub luag haujlwm li cas bpf_get_smp_processor_id. Txhawm rau ua qhov no, peb rov sau qhov program los ntawm peb ntu dhau los raws li hauv qab no:
Hauv thawj kab peb pom cov lus qhia call, parameter IMM uas yog sib npaug rau 8, thiab SRC_REG - xoom. Raws li ABI daim ntawv cog lus siv los ntawm tus neeg txheeb xyuas, qhov no yog hu rau tus neeg pab ua haujlwm thib yim. Thaum nws yog launched, lub logic yog yooj yim. Rov qab tus nqi los ntawm kev sau npe r0 luam rau r1 thiab ntawm kab 2,3 nws hloov dua siab tshiab rau hom u32 - lub sab sauv 32 khoom raug tshem tawm. Ntawm kab 4,5,6,7 peb rov 2 (XDP_PASS) los yog 1 (XDP_DROP) nyob ntawm seb tus pab cuam ua haujlwm los ntawm kab 0 xa rov qab tus nqi xoom lossis tsis yog xoom.
Cia peb sim peb tus kheej: thauj cov program thiab saib cov zis bpftool prog dump xlated:
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simple &
[2] 10914
$ sudo bpftool p | grep simple
523: xdp name simple tag 44c38a10c657e1b0 gpl
pids xdp-simple(10915)
$ sudo bpftool p d x id 523
int simple(void *ctx):
; if (bpf_get_smp_processor_id() != 0)
0: (85) call bpf_get_smp_processor_id#114128
1: (bf) r1 = r0
2: (67) r1 <<= 32
3: (77) r1 >>= 32
4: (b7) r0 = 2
; }
5: (15) if r1 == 0x0 goto pc+1
6: (b7) r0 = 1
7: (95) exit
Ok, tus neeg txheeb xyuas pom qhov tseeb kernel-helper.
Txhua qhov kev pab cuam khiav haujlwm muaj tus qauv
u64 fn(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)
Parameters rau tus pab ua haujlwm tau dhau los hauv cov npe r1-r5, thiab tus nqi raug xa rov qab rau hauv daim ntawv teev npe r0. Tsis muaj cov haujlwm uas siv ntau tshaj tsib qhov kev sib cav, thiab kev txhawb nqa rau lawv tsis xav tias yuav ntxiv rau yav tom ntej.
Cia peb saib ntawm tus pab cuam tshiab thiab BPF hla qhov tsis zoo li cas. Wb rov sau dua xdp-simple.bpf.c raws li hauv qab no (tag nrho cov kab tsis tau hloov):
SEC("xdp/simple")
int simple(void *ctx)
{
bpf_printk("running on CPU%un", bpf_get_smp_processor_id());
return XDP_PASS;
}
Peb qhov kev pabcuam luam tawm tus lej ntawm CPU uas nws tab tom khiav. Cia peb sau nws thiab saib cov cai:
Ntawm no peb siv cov haujlwm bpf_set_link_xdp_fd, uas txuas XDP-hom BPF cov kev pab cuam rau network interfaces. Peb hardcoded tus lej interface lo, uas yog ib txwm 1. Peb khiav qhov kev ua haujlwm ob zaug ua ntej tshem tawm cov kev pab cuam qub yog tias nws txuas nrog. Daim ntawv ceeb toom tias tam sim no peb tsis xav tau kev sib tw pause los yog ib lub voj infinite: peb qhov kev pab cuam loader yuav tawm, tab sis qhov kev pab cuam BPF yuav tsis raug tua vim nws txuas nrog rau qhov tshwm sim. Tom qab ua tiav kev rub tawm thiab kev sib txuas, qhov kev zov me nyuam yuav raug tso tawm rau txhua pob ntawv network tuaj txog ntawm lo.
Wb download tau qhov kev pab cuam thiab saib lub interface 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
Qhov kev pab cuam peb downloaded muaj ID 669 thiab peb pom tib ID ntawm lub interface lo. Peb mam li xa ob peb pob rau 127.0.0.1 (thov + teb):
$ ping -c1 localhost
thiab tam sim no cia saib cov ntsiab lus ntawm cov ntaub ntawv debug virtual /sys/kernel/debug/tracing/trace_pipe, hauv bpf_printk sau nws cov lus:
# 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
Ob lub pob tau pom ntawm lo thiab ua tiav ntawm CPU0 - peb thawj qhov kev pabcuam BPF tsis muaj txiaj ntsig tau ua haujlwm!
Nws tsim nyog sau cia tias bpf_printk Nws tsis yog rau tsis muaj dab tsi uas nws sau rau cov ntaub ntawv debug: qhov no tsis yog tus pab cuam zoo tshaj plaws rau kev siv hauv kev tsim khoom, tab sis peb lub hom phiaj yog los qhia qee yam yooj yim.
Nkag mus rau daim ntawv qhia los ntawm BPF cov kev pab cuam
Piv txwv: siv daim ntawv qhia los ntawm BPF program
Hauv seem yav dhau los peb tau kawm yuav ua li cas los tsim thiab siv daim duab qhia chaw los ntawm cov neeg siv qhov chaw, thiab tam sim no cia peb saib ntawm cov kernel. Cia peb pib, raws li niaj zaus, nrog piv txwv. Cia peb rov sau peb qhov program xdp-simple.bpf.c raws li nram no:
Thaum pib ntawm qhov kev pab cuam peb ntxiv ib daim ntawv qhia txhais woo: Qhov no yog 8-element array uas khaws cov txiaj ntsig zoo li u64 (hauv C peb yuav txhais xws li array li u64 woo[8]). Hauv qhov program "xdp/simple" peb tau txais tus lej processor tam sim no rau hauv qhov sib txawv key thiab tom qab ntawd siv tus pab ua haujlwm bpf_map_lookup_element peb tau txais ib tus pointer rau qhov nkag mus rau hauv cov array, uas peb nce los ntawm ib qho. Txhais ua lus Lavxias: peb suav cov txheeb cais uas CPU ua cov pob khoom tuaj. Cia peb sim khiav qhov program:
Cia peb tshawb xyuas tias nws tau txuas nrog lo thiab xa ib co pob ntawv:
$ 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
Tam sim no cia peb saib cov ntsiab lus ntawm array:
$ 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
Tab sis yog tias peb saib ntawm qhov kev pab cuam uas twb muaj lawm, peb pom tus taw tes rau daim ntawv qhia tseeb (kab 4):
18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 ll
Qhov no yog li cas daim ntawv qhia cov ntaub ntawv raug xa mus rau ib qho kev pabcuam BPF tshwj xeeb. Hauv qhov no, daim ntawv qhia tuaj yeem tsim siv BPF_MAP_CREATE, thiab qhib los ntawm ID siv BPF_MAP_GET_FD_BY_ID.
Tag nrho, thaum siv libbpf lub algorithm yog raws li nram no:
Thaum muab tso ua ke, cov ntaub ntawv raug tsim nyob rau hauv lub rooj hloov chaw rau kev txuas mus rau daim duab qhia chaw
Raws li tau cog lus tseg, ntawm no yog ib qho piv txwv rau cov neeg nyeem uas xav paub yuav ua li cas los tsim thiab thauj cov kev pab cuam uas siv daim duab qhia chaw, tsis muaj kev pab. libbpf. Qhov no tuaj yeem pab tau thaum koj ua haujlwm hauv ib puag ncig uas koj tsis tuaj yeem tsim kev vam khom, lossis txuag txhua qhov me me, lossis sau ib qho program zoo li ply, uas generates BPF binary code ntawm ya.
Txhawm rau ua kom yooj yim ua raws li cov laj thawj, peb yuav rov sau peb tus qauv rau cov laj thawj no xdp-simple. Cov lej ua tiav thiab nthuav me ntsis ntawm qhov kev pab cuam tau tham hauv qhov piv txwv no tuaj yeem pom hauv qhov no qhov tseem ceeb.
Lub logic ntawm peb daim ntawv thov yog raws li nram no:
tsim ib qho kev pab cuam uas siv daim ntawv qhia no,
txuas qhov program rau lub interface lo,
uas txhais ua neeg li
int main(void)
{
int map_fd, prog_fd;
map_fd = map_create();
if (map_fd < 0)
err(1, "bpf: BPF_MAP_CREATE");
prog_fd = prog_load(map_fd);
if (prog_fd < 0)
err(1, "bpf: BPF_PROG_LOAD");
xdp_attach(1, prog_fd);
}
nws yog map_create tsim ib daim ntawv qhia ib yam li peb tau ua hauv thawj qhov piv txwv txog kev hu xov tooj bpf - βKernel, thov ua kuv daim ntawv qhia tshiab hauv daim ntawv ntawm 8 lub ntsiab lus zoo li __u64 thiab muab kuv rov qab cov ntaub ntawv piav qhia":
Cia saib seb peb qhov kev pab cuam tau txuas nrog 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
Hurray, txhua yam ua haujlwm. Nco ntsoov, los ntawm txoj kev, hais tias peb daim ntawv qhia yog dua tso tawm nyob rau hauv daim ntawv ntawm bytes. Qhov no yog vim lub fact tias, tsis zoo li libbpf Peb tsis tau thauj cov ntaub ntawv hom (BTF). Tab sis peb mam li tham ntxiv txog qhov no lwm zaus.
Feem ntau hais lus, koj tsis tas yuav muaj dab tsi tshwj xeeb los tsim BPF cov kev pab cuam - BPF khiav ntawm txhua qhov chaw faib khoom zoo, thiab cov kev pab cuam tsim los siv clang, uas tuaj yeem muab los ntawm pob. Txawm li cas los xij, vim qhov tseeb tias BPF tab tom txhim kho, cov ntsiav thiab cov cuab yeej hloov pauv tas li, yog tias koj tsis xav sau BPF cov kev pab cuam siv cov txheej txheem qub los ntawm 2019, ces koj yuav tsum tau sau.
llvm/clang
pahole
nws core
bpftool
(Rau kev siv, ntu no thiab tag nrho cov piv txwv hauv kab lus tau khiav ntawm Debian 10.)
lwm/clang
BPF yog phooj ywg nrog LLVM thiab, txawm hais tias tsis ntev los no cov kev pab cuam rau BPF tuaj yeem muab tso ua ke siv gcc, txhua qhov kev txhim kho tam sim no yog ua rau LLVM. Yog li ntawd, ua ntej ntawm tag nrho cov, peb yuav tsim lub tam sim no version clang los ntawm git:
(Qhov no tuaj yeem ntxiv rau .bashrc los yog mus rau ib daim ntawv cais. Tus kheej, kuv ntxiv tej yam zoo li no rau ~/bin/activate-llvm.sh thiab thaum tsim nyog kuv ua . activate-llvm.sh.)
$ 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 rau kev sim nrog BPF
Thaum tshawb nrhiav qhov muaj peev xwm ntawm BPF, kuv xav sib sau ua ke kuv tus kheej lub hauv paus. Qhov no, feem ntau hais lus, tsis yog qhov tsim nyog, vim tias koj yuav tuaj yeem sau thiab thauj cov BPF cov kev pab cuam ntawm cov kernel faib, txawm li cas los xij, muaj koj tus kheej kernel tso cai rau koj siv qhov tseeb BPF nta, uas yuav tshwm sim hauv koj qhov kev faib tawm hauv lub hlis ntawm qhov zoo tshaj plaws. , los yog, raws li nyob rau hauv cov ntaub ntawv ntawm ib co debugging cuab yeej yuav tsis tau ntim nyob rau hauv lub foreseeable yav tom ntej. Tsis tas li ntawd, nws tus kheej tseem ceeb ua rau nws xav tias tseem ceeb rau kev sim nrog cov cai.
Txhawm rau tsim cov ntsiav koj xav tau, thawj zaug, cov ntsiav nws tus kheej, thiab thib ob, cov ntaub ntawv teeb tsa cov ntsiav. Txhawm rau sim nrog BPF peb tuaj yeem siv qhov qub vanilla kernel los yog ib qho kev loj hlob kernels. Keeb kwm, BPF txoj kev loj hlob tshwm sim nyob rau hauv Linux networking zej zog thiab yog li ntawd tag nrho cov kev hloov sai los yog tom qab mus los ntawm David Miller, lub Linux networking tswj. Nyob ntawm lawv qhov xwm txheej - hloov kho lossis cov yam ntxwv tshiab - kev hloov pauv network poob rau hauv ib qho ntawm ob lub cores - net los yog net-next. Cov kev hloov pauv rau BPF tau muab faib ua tib yam ntawm bpf ΠΈ bpf-next, uas yog ces pooled rau hauv net thiab net-tom ntej, feem. Yog xav paub ntxiv, saib bpf_devel_QA ΠΈ netdev-FAQ. Yog li xaiv lub kernel raws li koj saj thiab kev ruaj ntseg xav tau ntawm lub kaw lus koj tab tom sim (*-next kernels yog qhov tsis ruaj khov tshaj plaws ntawm cov npe).
Nws yog dhau ntawm cov kab lus ntawm tsab xov xwm no los tham txog yuav ua li cas tswj cov ntawv teeb tsa cov ntaub ntawv - nws xav tias koj twb paub yuav ua li cas, lossis npaj kawm ntawm tus kheej. Txawm li cas los xij, cov lus qhia hauv qab no yuav tsum muaj ntau lossis tsawg txaus los muab rau koj ua haujlwm BPF-enabled system.
Download tau ib qho ntawm cov kernels saum toj no:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next
Tsim ib qho me me ua haujlwm kernel config:
$ cp /boot/config-`uname -r` .config
$ make localmodconfig
Qhib cov kev xaiv BPF hauv cov ntaub ntawv .config ntawm koj tus kheej xaiv (feem ntau yuav CONFIG_BPF yuav tau enabled txij li systemd siv nws). Nov yog cov npe ntawm cov kev xaiv los ntawm cov ntsiav siv rau kab lus no:
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
Tom qab ntawd peb tuaj yeem yooj yim sib sau ua ke thiab nruab cov modules thiab cov kernel (los ntawm txoj kev, koj tuaj yeem sib sau cov kernel siv cov khoom tshiab. clanglos ntawm kev ntxiv CC=clang):
$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install
thiab rov pib dua nrog lub kernel tshiab (Kuv siv rau qhov no kexec los ntawm pob kexec-tools):
Cov khoom siv feem ntau siv hauv kab lus yuav yog cov khoom siv hluav taws xob bpftool, muab los ua ib feem ntawm Linux ntsiav. Nws yog sau thiab khaws cia los ntawm BPF cov neeg tsim khoom rau BPF cov neeg tsim khoom thiab tuaj yeem siv los tswj txhua yam ntawm BPF cov khoom - thauj cov kev pab cuam, tsim thiab kho cov duab qhia chaw, tshawb txog lub neej ntawm BPF ecosystem, thiab lwm yam. Cov ntaub ntawv nyob rau hauv daim ntawv ntawm qhov chaws code rau txiv neej nplooj ntawv tuaj yeem pom hauv lub hauv paus los yog, twb compiled, nyob rau hauv net.
Thaum lub sijhawm sau ntawv no bpftool los npaj-ua tsuas yog rau RHEL, Fedora thiab Ubuntu (saib, piv txwv li, txoj xov no, uas qhia txog qhov tsis tiav ntawm kev ntim khoom bpftool hauv Debian). Tab sis yog tias koj twb tau tsim koj lub kernel, ces tsim bpftool yooj yim li 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 ]
$
(Ntawm no ${linux} - qhov no yog koj daim ntawv teev npe kernel.) Tom qab ua tiav cov lus txib no bpftool yuav muab sau rau hauv ib phau ntawv ${linux}/tools/bpf/bpftool thiab nws tuaj yeem muab ntxiv rau txoj hauv kev (ua ntej ntawm txhua tus neeg siv root) los yog luam rau xwb /usr/local/sbin.
Sau bpftool nws yog qhov zoo tshaj los siv tom kawg clang, sib sau ua ke raws li tau piav qhia saum toj no, thiab xyuas seb nws puas yog sib sau ua ke - siv, piv txwv li, cov lus txib
$ 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
...
uas yuav qhia tau tias BPF nta twg tau qhib rau hauv koj lub kernel.
Los ntawm txoj kev, cov lus txib yav dhau los tuaj yeem khiav raws li
# bpftool f p k
Qhov no yog ua los ntawm kev sib piv nrog cov khoom siv hluav taws xob los ntawm pob iproute2, qhov twg peb tuaj yeem, piv txwv li, hais ip a s eth0 es tsis txhob ip addr show dev eth0.
xaus
BPF tso cai rau koj los ua khau ib tug dev mub kom zoo ntsuas thiab ntawm-tus-fly hloov lub functionality ntawm cov tub ntxhais. Lub kaw lus tau ua tiav zoo heev, nyob rau hauv cov kev cai zoo tshaj plaws ntawm UNIX: ib qho yooj yim mechanism uas tso cai rau koj mus (rov) cov kev pab cuam lub kernel tso cai rau ib tug lossis loj tus naj npawb ntawm cov neeg thiab cov koom haum sim. Thiab, txawm hais tias qhov kev sim, nrog rau kev txhim kho ntawm BPF infrastructure nws tus kheej, nyob deb ntawm kev ua tiav, lub kaw lus twb muaj ABI ruaj khov uas tso cai rau koj los tsim kev ntseeg siab, thiab qhov tseem ceeb tshaj plaws, kev ua lag luam zoo.
Kuv xav kom nco ntsoov tias, hauv kuv lub tswv yim, thev naus laus zis tau nrov heev vim tias, ntawm ib sab, nws tuaj yeem ua tau mus ua si (lub architecture ntawm lub tshuab tuaj yeem nkag siab ntau dua lossis tsawg dua hauv ib hmo), thiab ntawm qhov tod tes, los daws cov teeb meem uas tsis tuaj yeem daws tau (zoo nkauj) ua ntej nws cov tsos. Ob lub ntsiab lus no ua ke ua rau tib neeg sim thiab ua npau suav, uas ua rau muaj kev tshwm sim ntau dua thiab ntau dua tshiab.
Kab lus no, txawm hais tias tsis yog luv luv, tsuas yog qhia txog lub ntiaj teb ntawm BPF thiab tsis tau piav qhia txog "siab" cov yam ntxwv thiab qhov tseem ceeb ntawm kev tsim vaj tsev. Txoj kev npaj mus tom ntej yog qee yam zoo li no: tsab xov xwm tom ntej yuav yog ib qho kev piav qhia ntawm BPF hom kev pab cuam (muaj 5.8 hom kev pab cuam txhawb nqa hauv 30 kernel), tom qab ntawd peb mam li saib thaum kawg yuav ua li cas sau cov ntawv thov BPF tiag tiag siv kernel tracing programs ua piv txwv, ces nws yog lub sijhawm rau kev kawm tob ntxiv ntawm BPF architecture, ua raws li cov piv txwv ntawm BPF networking thiab kev siv kev ruaj ntseg.
BPF thiab XDP Reference Guide - Cov ntaub ntawv ntawm BPF los ntawm cilium, lossis ntau dua los ntawm Daniel Borkman, yog ib tus tsim thiab saib xyuas ntawm BPF. Qhov no yog ib qho ntawm thawj qhov kev piav qhia loj, uas txawv ntawm lwm tus hauv qhov uas Daniyee paub meej tias nws tau sau dab tsi thiab tsis muaj qhov yuam kev. Tshwj xeeb, daim ntawv no piav qhia yuav ua li cas ua haujlwm nrog BPF cov kev pabcuam ntawm XDP thiab TC hom siv cov khoom siv paub zoo ip los ntawm pob iproute2.