แแแแแแแ แแงแ แขแแฅแแแแแแแ แแ แแแก แแ แฅแแ BPF. แฉแแแ แแแก แแฃแงแฃแ แแแแแ
แฃแฎแแจแแ แ แแ แแแฅแแแ, BPF แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแจแแแ แแแแฎแแแ แแแแแก แแแแ แแแฌแแแแแฃแแ แแแแแแแแฃแ แ แแแแ Linux-แแก แแแ แแแแก แกแแแ แชแแจแ แแ แแฎแแแ แแ แฅแแขแแฅแขแฃแ แ แแแแแแแ แฌแแ แแแขแแแฃแแ แแฆแแแฉแแแ, แ แแ แแแแแญแแ แแแแ แแแแแ แแแแฃแแ แกแขแแขแแ แแแกแ แงแแแแ แแแแแแแชแแแก แแฆแกแแฌแแ แแ. (แแ แแแแแ แแ, แ แแช แแแแแแแแแ แแแแ แแ แแแแแแแแก แแแ แแแ, แ แแแแ แช แฎแแแแแ แจแแกแ แฃแแแแแก แแแแก แฅแแแแแ, แแงแ แฆแแ แกแแฃแแ แแแแแก แจแแฅแแแ.)
แแก แกแขแแขแแ แแฆแฌแแ แก BPF แแแ แขแฃแแแฃแ แ แแแแฅแแแแก แกแขแ แฃแฅแขแฃแ แแก, แแแ แแแแก แแแขแแ แคแแแกแแแก BPF-แแแ แแฃแจแแแแแกแแแแก, แแแแแแแแ แแแแก แแแกแขแ แฃแแแแขแแแก, แแกแแแ แแ แกแแแฃแแ แจแแกแแซแแแแแแแแแแก แแแแแ, แซแแแแแ แแแแแ แแแแแฎแแแแแก, แ.แ. แงแแแแแคแแ แ, แ แแช แแแแแญแแ แแแแ แแแแแแแแจแ BPF-แแก แแ แแฅแขแแแฃแแ แแแแแงแแแแแแก แฃแคแ แ แฆแ แแ แจแแกแฌแแแแแกแแแแก.
แกแขแแขแแแก แ แแแแฃแแ
bpf(2)
.
ะะธัะตะผ ะฟัะพะณัะฐะผะผั BPF ั ะฟะพะผะพััั libbpf
.libbpf
. แฉแแแ แจแแแฅแแแแ BPF แแแแแแแชแแแก แซแแ แแแแ แฉแแแฉแฎแก, แ แแแแแกแแช แแแแแแแงแแแแแ แจแแแแแแ แแแแแแแแแแจแ.
แจแแกแแแแแ BPF แแ แฅแแขแแฅแขแฃแ แแจแ
แกแแแแ แแแแแฌแงแแแ BPF แแ แฅแแขแแฅแขแฃแ แแก แแแแฎแแแแแก, แฉแแแ แแแแแฏแแ แแแแแแ แแแแ (oh).
แแฎแแแ BPF แจแแแฅแแแ, แ แแแแ แช แแแกแฃแฎแ 64-แแแขแแแแ แแแแฅแแแแแแก, แฆแ แฃแแแแแแแ แกแแ แแแกแแแแก แแ SDN-แแก แจแแกแแฅแแแแแแ แฎแแแกแแฌแงแแแแแก แแแแ แแแแ แกแแญแแ แแแแแก แแแกแฃแฎแแ.Sแแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแ-dแแคแแแ nแแแแฃแจแแแแแ). แแแ แแแแก แฅแกแแแแก แแแแแแ แแแแก แแแแ แจแแแฃแจแแแแแฃแแ, แ แแแแ แช แแแแกแแแฃแ แ BPF-แแก แแแฃแแฏแแแแกแแแฃแแ แจแแแชแแแแแ, แแฎแแแ BPF แคแแฅแขแแฃแ แแ แแฅแแกแ แแแแก แจแแแแแ แแแแแ แแแแแแแชแแแแ Linux แกแแกแขแแแแแแก แแแแแงแฃแ แแก แแแแแแแแก แ แแฃแ แแแแชแแแแจแ แแ แแฎแแ, แแแกแ แแแแแฉแแแแแแ แแฅแแกแ แฌแแแก แจแแแแแ, แฉแแแ แแแแแญแแ แแแแ แแแแแ แจแแแแแแ แกแขแแขแแ. แฉแแแแแแแแแ แกแฎแแแแแกแฎแแ แขแแแแก แแ แแแ แแแแแ.
แฒกแแกแแชแแแ แกแฃแ แแแแแ
แแแแแก แแ แกแจแ, BPF แแ แแก sandbox แแแ แขแฃแแแฃแ แ แแแแฅแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแจแแแ โแแแแแแแแฃแ แโ แแแแ แแแ แแแแก แกแแแ แชแแจแ แฃแกแแคแ แแฎแแแแแก แแแ แฆแแแแแก แแแ แแจแ. BPF แแ แแแ แแแแแ แแฅแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแจแ, แแขแแแ แแแแ แแแ แแแจแ แแ แแแแแแจแแ แแแฃแแแ แ แแแแ แแแแแแแแก แฌแงแแ แแกแแแ. แแแแแแแ แจแแแซแแแแ แแงแแก, แแแแแแแแแ, แแแแแขแแก แแแฌแแแแแ แฅแกแแแแก แแแขแแ แคแแแกแจแ, แแแแแแ แแ แแแ แแแแก แคแฃแแฅแชแแแก แแแจแแแแ แแ แ.แจ. แแแแแขแแก แจแแแแฎแแแแแจแ, BPF แแ แแแ แแแแก แแฅแแแแ แฌแแแแแ แแแแแขแแก แแแแแชแแแแแกแ แแ แแแขแแแแแแชแแแแแแ (แฌแแแแแฎแแแกแแแแก แแ, แจแแกแแซแแแ, แฉแแฌแแ แแกแแแแก, แแ แแแ แแแแก แขแแแแก แแแฎแแแแแ); แแแ แแแแก แคแฃแแฅแชแแแก แแแจแแแแแก แจแแแแฎแแแแแจแ, แแ แแฃแแแแขแแแ แคแฃแแฅแชแแ, แแแ แแแแก แแแฎแกแแแ แแแแก แแแแแแแแแแแก แฉแแแแแแ แแ แ.แจ.
แแแแแ แฃแคแ แ แแฎแแแก แแแแฎแแแแ แแ แแ แแชแแกแก. แแแกแแฌแงแแกแแกแแแแก, แแแแแ แแแกแแฃแแ แแ แแแ แแแ แแแแกแฎแแแแแแแแ แแแแกแแแฃแ แ BPF-แแกแแแ, แ แแแแแก แแ แแแ แแแแแแช แแแแฌแแ แ แแกแแแแแแ แจแ. แแฎแแ แแแ แกแแแจแ แแ แฅแแขแแฅแขแฃแ แ แแแคแแ แแแแแ แแกแ, แ แแ แแ แแแ แแแแแแก แแแฌแแ แ แจแแกแแซแแแแแแ แแงแ แแแฆแแแ แแแแแก แแแแแแ, แฃแแแ แแแแแก แงแแแแแกแ, แ แ แแฅแแ แฃแแแ, C. แแแแกแแแแก แจแแแฅแแแ llvm-แแก backend, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แแแแขแแแแแ BPF แแ แฅแแขแแฅแขแฃแ แแกแแแแก.
BPF แแ แฅแแขแแฅแขแฃแ แ แแแฌแแแแแ แแ แจแแฅแแแแแแ แแแแแแแแ แแแ แแแแฅแแแแแแ แแคแแฅแขแฃแ แแ แแฃแจแแแแแกแแแแก. แแแแกแแแแแก, แ แแ แแก แแ แแฅแขแแแแจแ แแแฃแจแแแก, BPF แแแแขแแแแแ, แ แแแแแแช แฉแแแขแแแ แแแแ แแแ แแแจแ, แแแแ แแแแแแ แแแแแแแแ แแ แแแแจแ, แแแแแแแแแขแแก แแแแแงแแแแแแ, แ แแแแแกแแช แแฌแแแแแ JIT แจแแแแแแแแแ (Just In Tแแ แ). แจแแแแแแ, แแฃ แแแฎแกแแแ, แแแแกแแแฃแ BPF-แจแ แแ แแแ แแแ แฉแแแขแแแ แแ แแแ แแแจแ แแ แแแแแแ แแแฃแแ แแงแ แแแแแแแแก แฌแงแแ แแแ แแขแแแฃแ แแ - แแ แแ แกแแกแขแแแฃแ แ แแแ แแก แแแแขแแฅแกแขแจแ. แแฎแแ แแ แฅแแขแแฅแขแฃแ แแจแ แแก แฎแแแแ แแ แแขแแแแ - แแแ แแแแ, แแแแ แแขแแแ แแแแ แแแ แแแจแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ. bpf(2)
แแ แจแแแแแ, แแแแแแแแแแแ, แกแฎแแ แแแฅแแแแแแแแแก แแแจแแแแแแ, แ แแแแแแแช แแแแกแฎแแแแแแแ แแ แแแ แแแแก แขแแแแก แแแฎแแแแแ, แแ แแแ แแแ แแแแแแ แแแฃแแแ แแแแแแแแก แฌแงแแ แแแ.
แแฅ แแแแแฎแแแแก แจแแแซแแแแ แแแฃแฉแแแแก แแแแฎแแ: แจแแกแแซแแแแแแ แแงแ? แ แแแแ แแ แแก แแแ แแแขแแ แแแฃแแ แแกแแแ แแแแแก แจแแกแ แฃแแแแแก แฃแกแแคแ แแฎแแแแ? แจแแกแ แฃแแแแแก แฃแกแแคแ แแฎแแแแ แฉแแแแแแแก แแแ แแแขแแ แแแฃแแแ BPF แแ แแแ แแแแแแก แฉแแขแแแ แแแแก แแขแแแแ, แ แแแแแกแแช แแฌแแแแแ แแแ แแคแแแแขแแ แ (แแแแแแกแฃแ แแ แแ แแขแแแก แฃแฌแแแแแแ Verfier แแ แแ แแแแแแ แซแแแแ แแแแแแกแฃแ แ แกแแขแงแแแก แแแแแงแแแแแแก):
Verifier แแ แแก แกแขแแขแแแฃแ แ แแแแแแแแขแแ แ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแก, แ แแ แแ แแแ แแแ แแ แแ แฆแแแแก แแแ แแแแก แแแ แแแแฃแ แแฃแจแแแแแก. แแก, แกแฎแแแแ แจแแ แแก, แแ แแแจแแแแก, แ แแ แแ แแแ แแแแก แแ แจแแฃแซแแแ แฎแแแ แจแแฃแจแแแแก แกแแกแขแแแแก แแฃแจแแแแแก - BPF แแ แแแ แแแแแก, แขแแแแแแแแ แแแแแแแแแแ แ, แจแแฃแซแแแแ แแแ แแแแก แแแฎแกแแแ แแแแก แกแแฅแชแแแแแก แฌแแแแแฎแแ แแ แแแแแฌแแ แ, แคแฃแแฅแชแแแแแก แแแแจแแแแแแแแแแก แแแแ แฃแแแแ, แแแ แแแ, แแแแแขแแแ, แแแแแฌแแ แ. แแ แแแแแ แแแแแแแแแแแแ แฅแกแแแแก แแแแแขแแแ. แแแ แแคแแแแขแแ แ แแซแแแแ แแแ แแแขแแแก, แ แแ BPF แแ แแแ แแแแก แแแจแแแแ แแ แแแแ แฆแแแแก แแแ แแแก แแ แ แแ แแ แแแ แแแ, แ แแแแแกแแช แฌแแกแแแแก แแแฎแแแแแ แแฅแแก แฉแแฌแแ แแก แฌแแแแแ, แแแแแแแแแ, แแแแแแแแ แแแแแขแแก แแแแแชแแแแแแ, แแแ แจแแซแแแแก แแแ แแแแก แแแฎแกแแแ แแแแก แแแแแฌแแ แแก แแแแแขแแก แแแ แแ. แแแ แแคแแแแขแแ แก แชแแขแ แฃแคแ แ แแแขแแแฃแ แแ แแแแแแฎแแแแแ แจแแกแแแแแแก แแแแงแแคแแแแแแจแ, แแแก แจแแแแแ แ แแช แแแแแชแแแแแ BPF-แแก แงแแแแ แกแฎแแ แแแแแแแแแขแก.
แแแจ แ แ แแแกแฌแแแแแ แแฅแแแแ? แแแแฎแแแ แแแแแ แฌแแ แก แแ แแแ แแแแก C-แแ, แแขแแแ แแแแ แแแก แแแ แแแจแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ bpf(2)
, แกแแแแช แแก แแแฌแแแแแ แแแ แแคแแแแขแแ แแก แแแแ แแ แแแแ แแแแแแ แแจแแแแแฃแ แแแแขแแแแแจแ. แจแแแแแ แแแแแ แแ แกแฎแแ แแแแฎแแแ แแแแแ แแแแแจแแ แแแก แแ แแแ แแแแก แแแแแแแแก แฌแงแแ แแกแแแ แแ แแก แแฌแงแแแก แจแแกแ แฃแแแแแก. แฉแแขแแแ แแแแกแ แแ แแแแจแแ แแก แแแแแฏแแแ แแฃแชแแแแแแแแ แ แแแแแแแแ แแแแแแแก แแแแ. แฏแแ แแ แแ, แแแ แแคแแแแขแแ แแก แแแจแแแแ แจแแแแ แแแแ แซแแแ แแ แแ แแ แแ แแ แแแแแ แแ แแแ แแแแก แ แแแแแแฏแแ แแ แแแแแแขแแแ แแแแ แแแแแแฃแขแแ แแก แแ แแก แแแแ แแแแ. แแแแ แแช, แแฃแกแขแแ แ แแแแ แแ แแก แแแแแแจแแ แแแฃแแ แแ แแแ แแแ, แแแแแแแแแแฃแแแ แแแก แขแแแแ แแ แแ แแ แฌแแแก แฌแแ แจแแแฃแจแแแแแฃแแ แแ แแ "แฃแแแแแ แกแแแฃแ แ" แแแขแแ แคแแแกแ แจแแแซแแแแ แแ แแงแแก แจแแกแแคแแ แแกแ แแฎแแแ แขแแแแก แแ แแแ แแแแแแกแแแแก. (แแฃแแชแ แแฎแแ, แ แแแแกแแช แแ แฅแแขแแฅแขแฃแ แ แฃแคแ แ แแแแฌแแคแแแฃแแแ, แแ แกแแแแแก แแแแ แแ แแแขแแ แคแแแกแแก แแแแแแ แแแแ แแแแแแแแก libbpf
.)
แงแฃแ แแแฆแแแแแแแ แแแแแฎแแแแแ แจแแแซแแแแ แจแแแแฉแแแแก, แ แแ แฉแแแ แฏแแ แแ แแแแแแกแ แฃแแแแแ แกแฃแ แแแแแ. แแแ แแแแช, แงแแแแแแแ แแแแแแฅแแฃแแ แแ แฎแกแแแก, แ แแขแแ แชแแแแก BPF แซแแ แแฃแแแ แกแฃแ แแแก แแแแกแแแฃแ BPF-แแแ แจแแแแ แแแแ. แแ แ แแแแแแชแแ, แ แแแแแแแช แแแแจแแแแแแแแแ แแคแแ แแแแแก แแแแแงแแแแแแก แคแแ แแแแแก, แแ แแก แกแแแ แแ แแแฎแกแแแ แแแแก แแ แแแ แแแแก แแแแฎแแแ แ แคแฃแแฅแชแแแแแก แแแแแงแแแแแแก แจแแกแแซแแแแแแแ. BPF-แจแ แกแแแแแ แ แแแฎแกแแแ แแแแก แแแแแ แแแ แฎแแแแ แแแ แแ แฌแแแแแฃแแ แ แฃแฅแแแแก แแแแแงแแแแแแ - แแแแแแ แแแฃแแ แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแแ แแแแแ แแขแฃแแ API-แแ. แแแ แแก แกแแฎแแแ แแแแแ แแแแขแแ แแแแฆแแก, แ แแ แ แฃแแแก แแแ แแแแ แขแแแ, แ แแแแแแช แแแแแฉแแแ, แแงแ แฐแแจแแก แชแฎแ แแแ. แจแแแแแ แแแแแฉแแแ แแแกแแแแแ, แแแแแแฃแ แ (แแแแ CPU) แฐแแจแแก แชแฎแ แแแแแ แแ แแแแแแฃแ แ แแแกแแแแแ, แกแแซแแแแ แฎแแแแ, BPF แแ แแแ แแแแแแก แแแแแแแแแแแก แจแแแชแแแแ แ แฃแฅแแแ แแ แแ แแแแแ แกแฎแแ. แ แแช แแฎแแ แฉแแแแแแแก แกแแแแขแแ แแกแแ แแ แแก แแก, แ แแ BPF แแ แแแ แแแแแก แแฎแแ แแฅแแ แฃแแแ แ แจแแแแ แฉแฃแแแแก แแแแแแแ แแแแ แแแ แแแก แจแแ แแก แแ แแแฃแแแแ แแ แแก แกแฎแแ แแ แแแ แแแแแก แแ แแแแฎแแแ แแแแแก แกแแแ แชแแก.
แ แฃแแแแแ แฌแแแแแ แฎแแแแ แแแแฎแแแ แแแแแก แแ แแชแแกแแแแแแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ bpf(2)
, แแ แแแ แแแจแ แแแจแแแแฃแแ BPF แแ แแแ แแแแแแแแ แแแแฎแแแ แ แคแฃแแฅแชแแแแแก แแแแแงแแแแแแ. แฃแคแ แ แแแขแแช, แแแแฎแแแ แแแแ แแ แกแแแแแแ แแ แ แแฎแแแแ แ แฃแแแแแแ แแฃแจแแแแแกแแแแก, แแ แแแแ แแแ แแแแก แกแฎแแ แจแแกแแซแแแแแแแแแแ แฌแแแแแแกแแแแก. แแแแแแแแแ, BPF แแ แแแ แแแแแก แจแแฃแซแแแแ แแแแแแงแแแแ แแแแฎแแแ แ แคแฃแแฅแชแแแแ แแแแแขแแแแก แกแฎแแ แแแขแแ แคแแแกแแแแ แแแแแกแแขแแแแ, perf แแแแแแแแแแก แแแแแ แแ แแแแกแแแแก, แแแ แแแแก แกแขแ แฃแฅแขแฃแ แแแแ แฌแแแแแแกแแแแก แแ แ.แจ.
แแแแแแ, BPF แแซแแแแ แจแแกแแซแแแแแแแแก แฉแแขแแแ แแแก แแแแแแแแฃแ แ, แแแฃ แแแ แแคแแแแขแแ แแก แแแแ แแแแแชแแแแ แแแแฎแแแ แแแแแก แแแแ แแแ แแแแก แกแแแ แชแแจแ. แแ แแแแก แจแแฃแซแแแ แจแแแแแฎแแก แแแแแแแ แแแแ แแแ แแแก แจแแ แแก แแ แแแชแแแแแก แแแแแชแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแจแ, แแกแแแ แแฅแแก แฌแแแแแ แแแ แแแแก แฅแแแกแแกแขแแแแแแ, แ แแแแแแแช แแแจแแแแฃแแแ แแ แขแแแแก แแ แแแ แแแแก แแแแ .
แแก แฃแแแ แแกแแแแกแแ แแแ แแแแก แแแแฃแแแแแก แแแแ แแแฌแแแแแฃแ แจแแกแแซแแแแแแแแแแแ แจแแแแ แแแแ, แ แแแแแแแแแช BPF-แก แแฅแแก แแแ แแแแฃแแ แฃแแแ แแขแแกแแแแแ (แ แ แแฅแแ แฃแแแ, แจแแแแซแแแแ แแฎแแแแ แแกแแแแกแ แแแแแแแชแแแแแก แจแแแแ แแแ, แแแแแแแแแ, แกแแกแขแแแแก แแแแแแคแแแแชแแ - แแ แจแแแแซแแแแ แแแฌแแ แแ แแแแแแแแฃแ แ แแ แแแแแ แ BPF-แแ). แจแแแแซแแแแ แจแแแแจแแแ แจแแกแแแแก แแแแแแ แแแ แแแ แ (แแแแแแ แแ แฃแขแแแแขแ, แ แแแแแแช แแงแแแแแก BPF-แก, แแ แแแแแฎแแแก แแแแฎแแแ แแแแแกแแแ แแแ แแแแก แแ แแแ แแแแ แแแแก แฃแแแ แแแก, แแ แแแแแแแ แแ แแแ แแแแ แแแแก แฃแแแ แแแก), แแฃแจแแแแแก แแ แแก แฃแกแแคแ แแฎแแแแ (แแกแฌแแแ แฎแแแ แแแแแแขแแ แแแจแ แแแแแแแก, แแแแช แกแแกแขแแแ แแ แแแแ แฆแแแ แฌแแ แแกแแก. แแ แขแแกแขแแ แแแแก แแแแฃแแแแ), แแขแแแฃแ แแแ - แแแแฃแแแแแก แแแแแขแแแ แแแแกแแก แแ แแก แจแแคแแ แฎแแแแก แแ แ แแ BPF แฅแแแกแแกแขแแแ แฃแแ แฃแแแแแงแแคแก, แ แแ แแ แแแแแขแแแแ แ แแแแ แแแแแแแ (แกแแแแ แแแแแแ แ แแ แแแงแแ, แแก แแกแ แแ แแ แแก แงแแแแ แขแแแแก BPF แแ แแแ แแแแกแแแแก).
แแกแแแ แจแแกแแซแแแแแแแแแแก แแ แกแแแแแ BPF-แก แฃแแแแแ แกแแแฃแ แแแกแขแ แฃแแแแขแแ แแฅแชแแแก แแแ แแแแก แแแคแแ แแแแแแกแแแแก, แ แแช แแ แแฅแขแแแแจแ แแแกแขแฃแ แแแแ: BPF-แก แกแฃแ แฃแคแ แ แแแขแ แแฎแแแ แขแแแแก แแ แแแ แแแ แแแแขแแแ, แฃแคแ แ แแ แฃแคแ แ แแแแ แแแแแแแแ แแงแแแแแก BPF-แก แกแแแ แซแแแ แกแแ แแแ แแแแ 24ร7, แฃแคแ แ แแ แฃแคแ แ แแแขแ. แกแขแแ แขแแแแแ แแแแแแแ แแแแแแกแก แแจแแแแแแ แแแแแฌแงแแแขแแแแแแแแ, แ แแแแแแแแช แแแคแฃแซแแแแฃแแแ BPF-แแ. BPF แแแแแแงแแแแแ แงแแแแแแ: DDoS แจแแขแแแแแแกแแแ แแแกแแชแแแแ, SDN-แแก แจแแกแแฅแแแแแแ (แแแแแแแแแ, แแฃแแแ แแแขแแแแกแแแแก แฅแกแแแแแแก แแแแแ แแแ), แ แแแแ แช แกแแกแขแแแแก แแแแแงแฃแ แแกแแแแแแก แแแแแแ แ แแแกแขแ แฃแแแแขแ แแ แกแขแแขแแกแขแแแแก แจแแแแ แแแแแแแ, แจแแญแ แแก แแฆแแแฉแแแแก แกแแกแขแแแแแจแ แแ แกแแแแ แฏแแจแ แกแแกแขแแแแแจแ แแ แ.แจ.
แแแแแ แแแแแกแ แฃแแแ แกแขแแขแแแก แแแแแฎแแแแแก แแแฌแแแ แแ แฃแคแ แ แแแขแแแฃแ แแ แแแแแแฎแแแแ แแแ แขแฃแแแฃแ แแแแฅแแแแก แแ BPF แแแแกแแกแขแแแแก.
แแแแ แแกแแ: แแแแฃแแแแฃแ แ
แแแแกแแแแแก, แ แแ แจแแซแแแ แแแแแแแแแแแก แแแจแแแแ แจแแแแแ แแแแงแแคแแแแแแแจแ, แจแแแซแแแแ แแแแญแแ แแแ แ แแแแแแแแ แแแแฃแแแแฃแ แ แแ แแแ แแแ, แกแฃแ แแชแแ แ llvm
/clang
bpf-แแก แแฎแแ แแแญแแ แแ แแ bpftool
... แแแแจแ
BPF แแแ แขแฃแแแฃแ แ แแแแฅแแแแแแก แ แแแแกแขแ แแแแกแ แแ แแแกแขแ แฃแฅแชแแแก แกแแกแขแแแ
BPF-แแก แแ แฅแแขแแฅแขแฃแ แ แแ แแ แซแแแแแแก แกแแกแขแแแ แจแแแฃแจแแแแ แแแแก แแแแแแแแกแฌแแแแแแ, แ แแ แแ แแแ แแแแแ แแแแฌแแ แแแ C แแแแแ แแ, แแแ แแแจแ แฉแแขแแแ แแแแก แจแแแแแ, แแแแ แแแแแแ แแจแแแแแฃแ แแแแจแ. แแแแขแแ, แ แแแแกแขแ แแแแก แ แแแแแแแแ แแ แแ แซแแแแแแแแก แแแแ แแแ แจแแแ แฉแ แแแแแแแแ แแแ แแแแฅแแแแแแก แจแแกแแซแแแแแแแแแแก แแแแแแแขแแแฃแ แ แแแแแแแ แแแแแแแแแแก แแแแแแแแกแฌแแแแแแ. แแแ แแ แแแแกแ, แแ แแแ แแแแแแ แแแฌแแกแแ แกแฎแแแแแกแฎแแ แจแแแฆแฃแแแแแ, แแแแแแแแแ, แแแแ แแ แแแแ แจแแฃแซแแแแแแ แแงแ แแแ แงแฃแแแแแก แแ แฅแแแแ แแแ แแแแแแก แแแฌแแ แ, แฎแแแ แแแกแขแ แฃแฅแชแแแแแก แ แแแแแแแแ แจแแแแแคแแ แแแแแแแ 4096-แแแ (แแฎแแ แแ แแแแแแแแ แแแฃแ แแ แแแ แแแแแก แจแแฃแซแแแแ แแแแแแแแแแ แแแกแขแ แฃแฅแชแแแก แฉแแขแแแ แแแ).
BPF-แก แแฅแแก แแแ แแแแขแ แแแแฎแแแ แแแแแกแแแแก แฎแแแแแกแแฌแแแแแ 64-แแแขแแแแ แ แแแแกแขแ แ r0
-r10
แแ แแ แแแ แแแแก แแ แแชแฎแแแแ. แ แแแแกแขแ แแชแแ r10
แจแแแชแแแก แฉแแ แฉแแก แแแฉแแแแแแแแก แแ แแ แแก แแฎแแแแ แฌแแแแแฎแแแแ. แแ แแแ แแแแแก แแฅแแ แฌแแแแแ 512 แแแแขแแแ แแแกแขแแแ แแฃแจแแแแแก แแ แแก แแ แจแแฃแแฆแฃแแแแ แ แแแแแแแแแก แกแแแ แแ แแแฎแกแแแ แแแ แ แฃแฅแแแแก แกแแฎแแ.
BPF แแ แแแ แแแแแก แฃแคแแแแ แแฅแแ แแแแแฎแแ แชแแแแแ แแ แแแ แแแแก แขแแแแก แแแ แแแแก แแแแฎแแแ แแแแแก แแแแแ แแขแฃแแ แแแแ แแแ แแ, แแฎแแแฎแแ, แ แแแฃแแแ แฃแแ แคแฃแแฅแชแแแแ. แแแแแแฃแ แแแแแซแแฎแแแฃแ แคแฃแแฅแชแแแก แจแแฃแซแแแ แแแแฆแแก แฎแฃแแแแแ แแ แแฃแแแแขแ, แ แแแแแแแช แแแแแชแแแฃแแแ แ แแแกแขแ แแแจแ r1
-r5
แแ แแแแ แฃแแแแฃแแ แแแแจแแแแแแแ แแแแแแชแแแ r0
. แแแ แแแขแแ แแแฃแแแ, แ แแ แคแฃแแฅแชแแแแแ แแแแ แฃแแแแแก แจแแแแแ แ แแแแกแขแ แแแแก แจแแแแแ แกแ r6
-r9
แแ แจแแแชแแแแแ.
แแ แแแ แแแแก แแคแแฅแขแฃแ แ แแแ แแแแแกแแแแก, แ แแแแกแขแ แแชแแ r0
-r11
แงแแแแ แแฎแแ แแแญแแ แแแ แแ แฅแแขแแฅแขแฃแ แแกแแแแก แชแแแกแแฎแแ แแ แแก แจแแแแแแแแ แ แแแแฃแ แ แแแแกแขแ แแแแแ, แแแแแแแแ แ แแ แฅแแขแแฅแขแฃแ แแก ABI แแแฎแแกแแแแแแแแแแก แแแแแแแแกแฌแแแแแแ. แแแแแแแแแ, แแแแกแแแแก x86_64
แ แแแแกแขแ แแแ r1
-r5
, แ แแแแแแช แแแแแแงแแแแแ แคแฃแแฅแชแแแก แแแ แแแแขแ แแแแก แแแแแกแแชแแแแ, แแแฉแแแแแแแ rdi
, rsi
, rdx
, rcx
, r8
, แ แแแแแแแช แแแแแแงแแแแแ แคแฃแแฅแชแแแแแ แแแ แแแแขแ แแแแก แแแแแกแแชแแแแ x86_64
. แแแแแแแแแ, แแแแ แแแ แชแฎแแแ แแแแ แแแแแแ, แ แแแแ แช แแแ แฏแแแแ แแแแ แแกแ:
1: (b7) r1 = 1 mov $0x1,%rdi
2: (b7) r2 = 2 mov $0x2,%rsi
3: (b7) r3 = 3 mov $0x3,%rdx
4: (b7) r4 = 4 mov $0x4,%rcx
5: (b7) r5 = 5 mov $0x5,%r8
6: (85) call pc+1 callq 0x0000000000001ee8
แแแ แแแแกแขแ แแ แแแ r0
แแกแแแ แแแแแแงแแแแแ แแ แแแ แแแแก แจแแกแ แฃแแแแแก แจแแแแแแก แแแกแแแ แฃแแแแแแ แแ แ แแแกแขแ แจแ r1
แแ แแแ แแแแก แแแแแแชแแแ แแแแขแแฅแกแขแแก แแแฉแแแแแแแแ - แแ แแแ แแแแก แขแแแแก แแแฎแแแแแ, แแก แจแแแซแแแแ แแงแแก, แแแแแแแแแ, แกแขแ แฃแฅแขแฃแ แ struct xdp_md
struct __sk_buff
struct pt_regs
แแกแ แ แแ, แฉแแแ แแแฅแแแแ แ แแแแกแขแ แแแแก แแแแ แแแ, แแแ แแแแก แแแแฎแแแ แแแแ, แกแขแแแ, แแแแขแแฅแกแขแฃแ แ แแแฉแแแแแแแแ แแ แกแแแ แแ แแแฎแกแแแ แแแ แ แฃแแแแแก แกแแฎแแ. แแ แ, แ แแ แแก แงแแแแแคแแ แ แแแแแแฃแ แแแแกแแก แแฃแชแแแแแแแแ, แแแแ แแ...
แแแแแแ แซแแแแ แแฆแฌแแ แ แแ แแแกแแฃแแ แแ แแ แแแแแฅแขแแแแแ แแฃแจแแแแแก แแ แซแแแแแแก แกแแกแขแแแแแ. แงแแแแ (
แแฅ Code
- แแก แแ แแก แแแกแขแ แฃแฅแชแแแก แแแแแ แแแ, Dst
/Src
แแ แแก แแแแฆแแแแก แแ แฌแงแแ แแก แแแแแ แแแ, แจแแกแแแแแแกแแ, Off
- 16-แแแขแแแแ แฎแแแแแฌแแ แแแ แจแแฌแแแ แแ Imm
แแ แแก 32-แแแขแแแแ แฎแแแแแฌแแ แแแ แแแแแ แ แแชแฎแแ, แ แแแแแแช แแแแแแงแแแแแ แแแแแแ แ แแแกแขแ แฃแฅแชแแแจแ (cBPF แแฃแแแแแแก K-แแก แแกแแแแกแ). แแแแแ แแแ Code
แแฅแแก แแ แแ แแ แ แขแแแ:
แแแกแขแ แฃแฅแชแแแก แแแแกแแแ 0, 1, 2, 3 แแแแกแแแฆแแ แแแก แแ แซแแแแแแแก แแแฎแกแแแ แแแแกแแแ แแฃแจแแแแแกแแแแก. แแแ BPF_LD
, BPF_LDX
, BPF_ST
, BPF_STX
, แจแแกแแแแแแกแแ. แแแแกแแแ 4, 7 (BPF_ALU
, BPF_ALU64
) แฌแแ แแแแแแแแก ALU แแแกแขแ แฃแฅแชแแแแแก แแ แแแแแแแแแก. แแแแกแแแ 5, 6 (BPF_JMP
, BPF_JMP32
) แจแแแชแแแก แแแฎแขแแแแก แแแกแขแ แฃแฅแชแแแแก.
BPF แแแกแขแ แฃแฅแชแแแก แกแแกแขแแแแก แจแแกแฌแแแแแก แจแแแแแแแ แแแแแ แแกแแแแ: แแแแก แแแชแแแแ, แ แแ แแแแแแฌแแแแแ แฉแแแแแแแแแแ แงแแแแ แแแกแขแ แฃแฅแชแแ แแ แแแแ แแแ แแแแขแ แ, แฉแแแ แแแแแแฎแแแแแ แ แแแแแแแแ แแแแแแแแก แแ แแแแงแแคแแแแแแจแ แแ แแแแแแ แแแแ แแแแแ, แแฃ แ แแแแ แแฃแจแแแแก แแแกแขแ แฃแฅแชแแแแ แ แแแแฃแ แแ แแ แ แแแแ . แฎแแแแ แแแจแแแแ แแแแแกแแแแ แ แแแแแ แฃแแ แคแแแแ BPF-แแกแแแแก. แแแกแแแแก แจแแแแแแ แกแขแแขแแแจแ แแแกแแแงแแ แแแแแ, แฉแแแ แแกแแแ แจแแแฎแแแแแแ แแแแแแแแฃแแแฃแ แแแกแขแ แฃแฅแชแแแแก แแแแงแแคแแแแแแแจแ Verifier-แแก, JIT แจแแแแแแแแแแก, แแแแกแแแฃแ แ BPF-แแก แแแ แแแแแแก แจแแกแแฎแแ, แแกแแแ แ แฃแแแแแก แจแแกแฌแแแแแกแแก, แคแฃแแฅแชแแแแแก แแแ แแแแแกแแก แแ แ.แจ.
แ แแแแกแแช แแกแแฃแแ แแแ แแแแแแแแฃแแแฃแ แแแกแขแ แฃแฅแชแแแแแ, แฉแแแ แแแแแแ แแแแ แซแแ แแแแ แคแแแแแแก bpf.h
bpf_common.h
แแแแแแแแ: BPF-แแก แแแจแแ แแฅแแแแก แแแแจแ
แแแแแ แจแแแฎแแแแ แแแแแแแแก, แ แแแแแจแแช แฉแแแ แแแแแแแ แแ แแแ แแแแก readelf-example.c
แแ แจแแฎแแแแ แจแแแแแแ แแ แแแแแก. แฉแแแ แแแแแแแฅแแแงแแแแ แแ แแแแแแแฃแ แจแแแแแ แกแก readelf-example.c
แฅแแแแแ, แแแก แจแแแแแ, แ แแช แฉแแแ แแฆแแแแแแแ แแแก แแแแแแแก แแ แแแแแ แแแแแแแแแ:
$ clang -target bpf -c readelf-example.c -o readelf-example.o -O2
$ llvm-readelf -x .text readelf-example.o
Hex dump of section '.text':
0x00000000 b7000000 01000000 15010100 00000000 ................
0x00000010 b7000000 02000000 95000000 00000000 ................
แแแแแแแแแแ แแแ แแแแ แกแแแขแ readelf
แแ แแก แฉแแฆแ แแแแแแ แแ, แจแแกแแแแแแกแแ, แฉแแแแ แแ แแแ แแแ แจแแแแแแ แแแฎแ แแ แซแแแแแแกแแแ:
Code Dst Src Off Imm
b7 0 0 0000 01000000
15 0 1 0100 00000000
b7 0 0 0000 02000000
95 0 0 0000 00000000
แแ แซแแแแแแก แแแแแแ แแแแแแแ แแ b7
, 15
, b7
ะธ 95
. แจแแแแฎแกแแแแแ, แ แแ แงแแแแแแ แแแแแแแแ แแแแจแแแแแแแแแ แกแแแ แแแขแ แแ แแก แแแกแขแ แฃแฅแชแแแก แแแแกแ. แฉแแแแก แจแแแแฎแแแแแจแ, แงแแแแ แแแกแขแ แฃแฅแชแแแก แแแแแฎแ แแแขแ แชแแ แแแแแ, แแแแขแแ แแแกแขแ แฃแฅแชแแแก แแแแกแแแ แแ แแก 7, 5, 7, 5, แจแแกแแแแแแกแแ. แแแแกแ 7 แแ แแก BPF_ALU64
แแ 5 แแ แแก BPF_JMP
. แแ แแแ แแแแกแแกแแแแก, แแแกแขแ แฃแฅแชแแแก แคแแ แแแขแ แแแแแแ (แแฎ. แแแแแ) แแ แฉแแแ แจแแแแแซแแแ แแแแแแแฌแแ แแ แฉแแแแ แแ แแแ แแแ แแกแ (แแแแแ แแ แแก แฉแแแ แแแแแแฌแแ แ แแแ แฉแแแแ แกแแแขแแแก แแแแแแแแแก แกแแฎแแ):
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
แแแแ แแชแแ b
แแแแกแ ALU64
- แ แแแแแแแ s
(แฌแงแแ แ), แแแจแแ แแแแจแแแแแแแ แแฆแแแฃแแแ แฌแงแแ แแก แ แแแกแขแ แแแแ แแ แแฃ, แ แแแแ แช แฉแแแแก แจแแแแฎแแแแแจแ, แแ แแ แแก แแแแแแแแฃแแ, แแแจแแ แแแแจแแแแแแแ แแฆแแแฃแแแ แแแแแแแ. Imm
. แแกแ แ แแ, แแแ แแแ แแ แแแกแแแ แแแกแขแ แฃแฅแชแแแแจแ แฉแแแ แแแกแ แฃแแแแ แแแแ แแชแแแก r0 = Imm
. แแแ แแ แแแแกแ, JMP แแแแกแ 1 แแแแ แแชแแ แแ แแก S
แแ แแก แแฃแแ, แแก แแแแ แแแก แฌแงแแ แแก แ แแแแกแขแ แแก แแแแจแแแแแแแแก แแแแแแ Imm
. แแฃ แแแแจแแแแแแแแแ แแแแฎแแแแ, แแแจแแ แฎแแแแ แแแแแกแแแ PC + Off
แกแแ PC
, แ แแแแ แช แงแแแแแแแแก, แจแแแชแแแก แจแแแแแแ แแแกแขแ แฃแฅแชแแแก แแแกแแแแ แแก. แแ แแแแแก, JMP แแแแกแ 9 แแแแ แแชแแ แแ แแก BPF_EXIT
r0
. แแแแแ แแแแแแแขแแ แแฎแแแ แกแแแขแ แฉแแแแก แชแฎแ แแแก:
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
แฉแแแ แจแแแแแซแแแ แแแแแแแฌแแ แแ แแก แฃแคแ แ แแแกแแฎแแ แฎแแแแแ แคแแ แแแ:
r0 = 1
if (r1 == 0) goto END
r0 = 2
END:
exit
แแฃ แแแแแฎแกแแแแแ แ แ แแ แแก แ แแแกแขแ แจแ r1
แแ แแแ แแแแก แแแแแแชแแแ แแแแขแแฅแกแขแแก แแแฉแแแแแแแแ แแแ แแแแแแ แแ แ แแแกแขแ แจแ r0
แแแแจแแแแแแแ แฃแแ แฃแแแแแ แแแ แแแก, แแแจแแ แฉแแแ แแฎแแแแแ, แ แแ แแฃ แแแแขแแฅแกแขแแก แแแฉแแแแแแแแ แแฃแแแ, แแแจแแ แแแแ แฃแแแแ 1-แก, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ - 2-แก. แแแแแ แจแแแแแแฌแแแ, แ แแ แฉแแแ แแแ แแแแ แแแ แ แฌแงแแ แแก แแแแแแแแแ แแแแ:
$ cat readelf-example.c
int foo(void *ctx)
{
return ctx ? 2 : 1;
}
แแแแฎ, แแก แฃแแแ แ แแ แแแ แแแแ, แแแแ แแ แแก แแแแ แแแแแแ แแฎแแแแ แแแฎ แแแ แขแแ แแแกแขแ แฃแฅแชแแแจแ.
แแแแแแแแแแกแ แแแแแแแแ: 16 แแแแขแแแแ แแแกแขแ แฃแฅแชแแ
แแแ แ แแฆแแแแจแแแ, แ แแ แแแแแแ แแ แแแกแขแ แฃแฅแชแแ 64 แแแขแแ แแแขแก แแฆแแแก. แแก แแฎแแแ, แแแแแแแแแ, แแแกแขแ แฃแฅแชแแแแก lddw
(แแแแ = 0x18
= BPF_LD
BPF_DW
BPF_IMM
Imm
. แคแแฅแขแแ, แ แแ Imm
แแฅแแก แแแแ 32, แฎแแแ แแ แแแแ แกแแขแงแแ แแ แแก 64 แแแขแ, แแกแ แ แแ, 64-แแแขแแแแ แฃแจแฃแแแ แแแแจแแแแแแแแก แฉแแขแแแ แแแ แ แแแกแขแ แจแ แแ แ 64-แแแขแแแ แแแกแขแ แฃแฅแชแแแจแ แแ แแแฃแจแแแแแก. แแแแกแแแแแก แแแแแแงแแแแแ แแ แ แแแแแแแแ แ แแแกแขแ แฃแฅแชแแ แแแแจแ 64-แแแขแแแแ แแแแจแแแแแแแแก แแแแ แ แแแฌแแแแก แจแแกแแแแฎแแ Imm
... แแแแแแแแ:
$ cat x64.c
long foo(void *ctx)
{
return 0x11223344aabbccdd;
}
$ clang -target bpf -c x64.c -o x64.o -O2
$ llvm-readelf -x .text x64.o
Hex dump of section '.text':
0x00000000 18000000 ddccbbaa 00000000 44332211 ............D3".
0x00000010 95000000 00000000 ........
แแแแแ แฃแ แแ แแแ แแแแจแ แแฎแแแแ แแ แ แแแกแขแ แฃแฅแชแแแ:
Binary Disassm
18000000 ddccbbaa 00000000 44332211 r0 = Imm[0]|Imm[1]
95000000 00000000 exit
แฉแแแ แแแแแ แจแแแฎแแแแแแ แแแกแขแ แฃแฅแชแแแแแ lddw
, แ แแชแ แแกแแฃแแ แแแ แแแแแแแแแแแแแแ แแ แ แฃแแแแแแ แแฃแจแแแแแแ.
แแแแแแแแ: BPF-แแก แแแจแแ แกแขแแแแแ แขแฃแแ แฎแแแกแแฌแงแแแแแก แแแแแงแแแแแแ
แแกแ แ แแ, แฉแแแ แแแกแฌแแแแแ BPF แแ แแแแแ แแแแแแแก แฌแแแแแฎแแ แแ แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ แแแแ แแแ แ แแแแแแแแแแแแ แแแแแกแแแแ แ แแแกแขแ แฃแฅแชแแ. แแแแกแแแ, แฃแแแ แแแฅแแแก, แ แแ แแ แแฅแขแแแแจแ แฃแคแ แ แแแกแแฎแแ แฎแแแแแ แแ แกแฌแ แแคแแ แแ แแแ แแแแแแก แแแจแแ แกแขแแแแแ แขแฃแแ แฎแแแกแแฌแงแแแแแก แแแแแงแแแแแแ, แแแแแแแแแ:
$ llvm-objdump -d x64.o
Disassembly of section .text:
0000000000000000 <foo>:
0: 18 00 00 00 dd cc bb aa 00 00 00 00 44 33 22 11 r0 = 1234605617868164317 ll
2: 95 00 00 00 00 00 00 00 exit
BPF แแแแแฅแขแแแแก แกแแชแแชแฎแแแก แชแแแแ, bpffs แคแแแแฃแ แ แกแแกแขแแแ
(แแแ แแแแแ แแแกแฌแแแแ แแ แฅแแแแแแจแ แแฆแฌแแ แแแ แแแแแแ แแ แแแขแแแ
BPF แแแแแฅแขแแแ - แแ แแแ แแแแแ แแ แ แฃแฅแแแ - แแฅแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ แแ แซแแแแแแแแก แแแแแงแแแแแแ BPF_PROG_LOAD
ะธ BPF_MAP_CREATE
แกแแกแขแแแฃแ แ แแแ แ bpf(2)
, แฉแแแ แแแกแแฃแแ แแแ แแฃแกแขแแ แแแแแ, แแฃ แ แแแแ แฎแแแแ แแก แจแแแแแ แแแแงแแคแแแแแแจแ. แแก แฅแแแแก แแแ แแแแก แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแแก แแ แแแแแแฃแแ แแแแแแแแกแแแแก refcount
(แแแแแจแแแแแแแก แ แแแแแแแแ) แแแงแแแแแฃแแแ แแ แแแ แแ แคแแแแแก แแฆแฌแแ แแแแแ, แ แแแแแแช แแแฃแแแแแแก แแแแแฅแขแแ, แฃแแ แฃแแแแแ แแแแฎแแแ แแแแแก. แกแแฎแแแฃแ แแก แแแฎแฃแ แแแก แจแแแแแ refcount
แแแแแฅแขแ แแชแแ แแแแ แแ แแแ แแ แ แแแแกแแช แแก แแแแฆแฌแแแก แแฃแแก, แแแแแฅแขแ แแแแแฃแ แแแแ.
แแฃ แแ แแแ แแแ แแงแแแแแก แ แฃแแแแก, แแแจแแ refcount
แแก แ แฃแแแแ แแ แแแ แแแแก แฉแแขแแแ แแแแก แจแแแแแ แแแ แแแแ แแ แแแ, แ.แ. แแแแ แคแแแแแก แแฆแฌแแ แแแ แจแแแซแแแแ แแแแฎแฃแ แแก แแแแฎแแแ แแแแแก แแ แแชแแกแแแแ แแ แแแแแช refcount
แแ แแแฎแแแแ แแฃแแ:
แแ แแแ แแแแก แฌแแ แแแขแแแแ แฉแแขแแแ แแแแก แจแแแแแ, แฉแแแ แฉแแแฃแแแแ แแ แแแแแแ แแแ แแแก แ แแแแ แกแแฎแแก แแแแแแแแก แแแแแ แแขแแ แก. แแแแแแแแแ, แฉแแแ แจแแแแแซแแแ แแแแแงแแแแ แแก แฅแกแแแแก แแแขแแ แคแแแกแแ แจแแแแแแแแแ แแแแแขแแแแก แแแกแแแฃแจแแแแแแแ แแ แแแแแแ แแแแ แแแกแแแแแจแแ แแแแแ tracepoint
แแแ แแแจแ. แแ แแ แแก แกแแชแแแแแ แ แแ แแชแฎแแแแแช แแแแแ แแแแ แแ แแแ แแ แจแแแซแแแแ แฉแแแขแแแ แแแ แแ แแแ แแแแจแ แคแแแแแก แแฆแฌแแ แแก แแแฎแฃแ แแแก.
แ แ แแแฎแแแแ, แแฃ แฉแแแ แแฎแแ แแแแฎแฃแ แแแ แฉแแแขแแแ แแแแแก? แแก แแแแแแแแแแฃแแแ แแแแแแแแก แแแแแ แแขแแ แแก (hook) แขแแแแ. แงแแแแ แฅแกแแแแก แฐแฃแแ แแแ แกแแแแแก แฉแแแขแแแ แแแแแแก แแแกแ แฃแแแแแก แจแแแแแ, แแก แแ แแก แ.แฌ. แแแแแแแฃแ แ แฐแฃแแแแ. แแ, แแแแแแแแแ, แแแแแแคแแแแชแแแก แแ แแแ แแแแแ แแแแแแ แแแก แจแแแแแ, แ แแช แแแแ แจแแฅแแแแก แแ แแชแแกแ แแแกแ แฃแแแแแ (แแ แแแแขแแ แฃแฌแแแแแแ แแแแแแฃแ แก, โแแแแแแฃแ แแแแ แแ แแชแแกแแแแโ). แขแแฅแแแแฃแ แแ, แแแแแแฃแ แฐแฃแแแแก แงแแแแแแแแก แแฅแแ แจแแกแแแแแแกแ แคแแแแแก แแฆแฌแแ แแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แแ แแแแขแแ แแฎแฃแ แแแ แแ แแชแแกแแก แแแฎแฃแ แแแกแแก, แแแแ แแ แแแแแแแฃแ แฐแฃแแแแก แแ แ. แจแแแแแ แกแฃแ แแแแ, แฌแแแแแ แฏแแ แแแแก แแแแแงแแแแแแ, แแชแแแแแ แแแฉแแแแ, แแฃ แ แแแแ แแแฅแแแแแแก แฉแแแขแแแ แแแแ แแ แแแ แแแแก แจแแฌแงแแแขแ แแแแแฅแขแแแแก แกแแชแแชแฎแแแแ แแแแแแฃแ แ แแ แแแแแแแฃแ แ แฐแฃแแแแแก แจแแแแฎแแแแแจแ.
แ แแขแแ แแ แแก แแแแกแฎแแแแแแ แแแแแแแแ แแ แแ แแแแแแแฃแ แแแฃแญแแแก แจแแ แแก? แแแแแแ แแ แขแแแแก แฅแกแแแฃแ แ แแ แแแ แแแแก แแแจแแแแแก แแแ แ แแฅแแก แแแแฎแแแ แแแแแแ แกแแแ แชแแก แแแ แแจแ, แแแแแแแแแ, แฌแแ แแแแแแแแแ DDoS แแแชแแ - แฉแแแขแแแ แแแแแ แฌแแ แก แฌแแกแแแก แแ แแแแแจแแ แแแก BPF แแ แแแ แแแแก แฅแกแแแแก แแแขแแ แคแแแกแแแ, แ แแก แจแแแแแแแช แฉแแแขแแแ แแแแแก แจแแฃแซแแแ แฌแแแแแแก แแ แแแแแแแก แแแแ. แแแแ แแก แแฎแ แแ, แฌแแ แแแแแแแแแ แแแแแ แแแแก แแแแแ แแ แแแ แแแ, แ แแแแแแช แแแฌแแ แแ แแฃแฎแแแแแ แแ แฌแฃแแจแ - แ แแแแกแแช แแก แแแกแ แฃแแแแแ, แแกแฃแ แ แกแแกแขแแแแจแ แแแแแแ แแ แแแ แฉแแก แแ แแแแก แแแแแแแแ แแแ แฐแฃแแแแ แฃแแ แฃแแแแแงแแคแแ.
แแแแ แแก แแฎแ แแ, แฌแแ แแแแแแแแแ, แ แแ แแกแฃแ แ แแแฃแแแแจแแ แแแ แแแแแแคแแแแชแแแก แฌแแ แขแแแก แแแ แแแจแ แแ แจแแแแ แแแแ แกแขแแขแแกแขแแแ แแ แแแแแ แฌแแแก แแแแแแแแแแแจแ. แแ แจแแแแฎแแแแแจแ, แแฅแแแ แแกแฃแ แ แจแแแแกแแ แแแแฎแแแ แแแแแก แแแฌแแแ แแ แแ แแแแแ แ แแแฃแแ แฃแแแแ แกแขแแขแแกแขแแแแก. bpf แคแแแแฃแ แ แกแแกแขแแแ แแซแแแแ แแ แจแแกแแซแแแแแแแแก. แแก แแ แแก แแฎแแแแ แแแฎแกแแแ แแแแก แคแกแแแแ-แคแแแแแก แกแแกแขแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แคแแแแแแ, แ แแแแแแแช แแแฃแแแแแแแ BPF แแแแแฅแขแแแแ แแ แแแแ แแแ แแแแ refcount
แแแแแฅแขแแแ. แแแแก แจแแแแแ แแแแขแแแ แแแแก แจแแฃแซแแแ แแแกแแแ แแ แแแก แแแแ แจแแฅแแแแแ แแแแแฅแขแแแ แชแแชแฎแแแ แแแ แฉแแแ.
แคแแแแแแแก แจแแฅแแแแก bpffs-แจแ, แ แแแแแแแช แแแฃแแแแแแแ BPF แแแแแฅแขแแแแ, แแฌแแแแแ "แแแแแแ แแแ" (แ แแแแ แช แจแแแแแ แคแ แแแแจแ: "แแ แแชแแกแก แจแแฃแซแแแ BPF แแ แแแ แแแแก แแ แ แฃแแแก แฉแแแแแ แแแ"). BPF แแแแแฅแขแแแแกแแแแก แคแแแแแก แแแแแฅแขแแแแก แจแแฅแแแแก แแแ แ แแฅแแก แแ แ แแฎแแแแ แแแแแแฃแ แ แแแแแฅแขแแแแก แกแแชแแชแฎแแแก แแแฎแแแแ แซแแแแแแแกแแแแก, แแ แแแแ แแแแแแแฃแ แ แแแแแฅแขแแแแก แแแแแงแแแแแแแแแแกแแแแกแแช - แแแแฃแแ แฃแแแแ แแแแแแแแก DDoS แแแชแแแก แแแแแแแฃแ แ แแ แแแ แแแแ, แแแกแฃแ แก แจแแแแแซแแแก แแแกแแแ แแ แกแขแแขแแกแขแแแแก แแแฎแแ. แแ แแแแแ แ.
BPF แคแแแแฃแ แ แกแแกแขแแแ แฉแแแฃแแแแ แแ แแแแแแขแแแแแฃแแแ /sys/fs/bpf
, แแแแ แแ แแก แแกแแแ แจแแแซแแแแ แแแแแแขแแแแแก แแแแแแแแ แแแแ, แแแแแแแแแ, แแกแ:
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint
แคแแแแฃแ แ แกแแกแขแแแแก แกแแฎแแแแแ แแฅแแแแแ แแ แซแแแแแแก แแแแแงแแแแแแ BPF_OBJ_PIN
BPF แกแแกแขแแแแก แแแ แ. แกแแแแฃแกแขแ แแชแแแ, แแแแฆแแ แแ แแแ แแแ, แจแแแแแแแแแ, แแแขแแแ แแแ แแ แแแแแแแแ แแ bpffs
. แฉแแแแ แแ แแแ แแแ แแ แแคแแ แก แแแแแแแก แกแแกแแ แแแแแ, แฉแแแ แแฎแแแแ แฌแแ แแแแแแแแแ แแแแก, แ แแแ แแฅแแแ แจแแซแแแ แแแแแแแแแก แแแแแแ แแแ:
$ cat test.c
__attribute__((section("xdp"), used))
int test(void *ctx)
{
return 0;
}
char _license[] __attribute__((section("license"), used)) = "GPL";
แแแแแ แจแแแแแแแแแ แแก แแ แแแ แแแ แแ แจแแแฅแแแแ แคแแแแฃแ แ แกแแกแขแแแแก แแแแแแฃแ แ แแกแแ bpffs
:
$ clang -target bpf -c test.c -o test.o
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint
แแฎแแ แแแแแแแฌแแ แแ แฉแแแแ แแ แแแ แแแ แฃแขแแแแขแแก แแแแแงแแแแแแ bpftool
แแ แแแแแฎแแแแ แแแแแฎแแแ แกแแกแขแแแแก แแแ แแแก bpf(2)
(แแแแแแ แแ แจแแฃแกแแแแแ แกแขแ แแฅแแแ แแแแฆแแแฃแแแ แแแแแก แแแแแแแแแแแแแ):
$ sudo strace -e bpf bpftool prog load ./test.o bpf-mountpoint/test
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="test", ...}, 120) = 3
bpf(BPF_OBJ_PIN, {pathname="bpf-mountpoint/test", bpf_fd=3}, 120) = 0
แแฅ แฉแแแ แฉแแขแแแ แแแ แแ แแแ แแแ แแแแแงแแแแแแ BPF_PROG_LOAD
, แแแแฆแ แคแแแแแก แแฆแแฌแแ แ แแแ แแแแแแ 3
แแ แแ แซแแแแแแก แแแแแงแแแแแแ BPF_OBJ_PIN
แแแแแแแ แ แแก แคแแแแแก แแฆแแฌแแ แ แคแแแแแ "bpf-mountpoint/test"
. แแแแก แจแแแแแ แฉแแแขแแแ แแแแ แแ แแแ แแแ bpftool
แแแแกแ แฃแแ แแฃแจแแแแ, แแแแ แแ แฉแแแแ แแ แแแ แแแ แแแ แฉแ แแแ แแแจแ, แแฃแแชแ แฉแแแ แแ แแแแฃแแแแ แแ แแแ แแ แชแแ แ แฅแกแแแฃแ แแแขแแ แคแแแกแก:
$ sudo bpftool prog | tail -3
783: xdp name test tag 5c8ba0cf164cb46c gpl
loaded_at 2020-05-05T13:27:08+0000 uid 0
xlated 24B jited 41B memlock 4096B
แฉแแแ แจแแแแแซแแแ แฉแแแฃแแแแ แแ แฌแแแจแแแแ แคแแแแแก แแแแแฅแขแ unlink(2)
แแ แแแแก แจแแแแแ แฌแแแจแแแแ แจแแกแแแแแแกแ แแ แแแ แแแ:
$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory
แแแแแฅแขแแแแก แฌแแจแแ
แแแแแฅแขแแแแก แฌแแจแแแแ แกแแฃแแ แแกแแก, แแฃแชแแแแแแแแ แแแแแแแ แขแแ, แ แแ แแแก แจแแแแแ แ แแช แแ แแแ แแแแก แแแแแแจแแ แแแฃแญแแแแ (แแแแแแแแก แแแแแ แแขแแ แ), แแ แช แแ แแ แแฎแแแ แแแแแแแ แแ แแแแแแฌแแแแก แแแก แแแจแแแแแก, แแฃแแชแ, แแ แแแ แแแแก แงแแแแ แแแแแแแแ แ แแแกแขแแแชแแ แแแกแ แฃแแแแแ แแแ แแแแฃแ แ แแแแแแแแแแ แแแแ. .
BPF แแ แแแ แแแแแแก แแแแแแ แแ แขแแแ แกแแจแฃแแแแแแก แแแซแแแแ แจแแชแแแแแ แแ แแแ แแแ แคแ แแแแแ, แ.แ. แฃแแ แฃแแแแแงแแก แแแแแแแแแแ แแแแก แแขแแแฃแ แแแ replace = detach old program, attach new program
. แแ แจแแแแฎแแแแแจแ, แแ แแแ แแแแก แซแแแแ แแแ แกแแแก แงแแแแ แแฅแขแแฃแ แ แแแกแขแแแชแแ แแแแกแ แฃแแแแก แแแแแก แแฃแจแแแแแก แแ แแฎแแแ แแ แแแ แแแแแแ แจแแแฅแแแแแ แแฎแแแ แฆแแแแกแซแแแแแก แแแแแฃแจแแแแแแแแ แแ แแฅ โแแขแแแฃแ แแแโ แแแจแแแแก, แ แแ แแ แช แแ แแ แฆแแแแกแซแแแแ แแ แแฅแแแแ แแแแแขแแแแแฃแแ.
แแ แแแ แแแแแแก แแแแแแ แแแ แแแแแแแแก แฌแงแแ แแแแแ
แแ แกแขแแขแแแจแ แฉแแแ แชแแแแ แแ แแฆแแฌแแ แ แแ แแแ แแแแแแก แแแแแแจแแ แแแแก แแแแแแแแก แฌแงแแ แแแแแแ, แ แแแแแ แแแ แ แแฅแแก แแแแก แจแแกแฌแแแแแก แแแแแ แแขแฃแแ แขแแแแก แแ แแแ แแแแก แแแแขแแฅแกแขแจแ. แฒกแ.
แแแแแฅแขแแแแก แแแแแแฃแแแ แแแ bpf แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ
BPF แแ แแแ แแแแแ
แงแแแแ BPF แแแแแฅแขแ แแฅแแแแแ แแ แแแแ แแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ bpf
, แ แแแแแกแแช แแฅแแก แจแแแแแแ แแ แแขแแขแแแ:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
แแ แแฃแแแ cmd
แแ แแก แขแแแแก แแ แ-แแ แแ แแแแจแแแแแแแ enum bpf_cmd
attr
โ แแแ แแแแขแ แแแแก แแแฉแแแแแแแแ แแแแแ แแขแฃแแ แแ แแแ แแแแกแแแแก แแ size
- แแแแแฅแขแแก แแแแ แแแฉแแแแแแแแแก แแแฎแแแแแ, แ.แ. แฉแแแฃแแแแ แแ แแก sizeof(*attr)
. แแแ แแแจแ 5.8 แกแแกแขแแแฃแ แ แแแ แ bpf
แแฎแแ แก แฃแญแแ แก 34 แกแฎแแแแแกแฎแแ แแ แซแแแแแแก แแ union bpf_attr
แแแแแแแก 200 แฎแแแก. แแแแ แแ แฉแแแ แแแแ แแ แฃแแแ แจแแแแแจแแแแก, แ แแแแแ แ แแแแแแแแ แกแขแแขแแแก แแแแแแแแแแแจแ แแแแแชแแแแแ แแ แซแแแแแแแก แแ แแแ แแแแขแ แแแก.
แแแแแฌแงแแ แแฃแแแแ BPF_PROG_LOAD
, แ แแแแแแช แฅแแแแก BPF แแ แแแ แแแแแก - แแฆแแแก BPF แแแกแขแ แฃแฅแชแแแแแก แแแแแแแฅแขแก แแ แแขแแแ แแแแ แแแ แแแจแ. แฉแแขแแแ แแแแก แแแแแแขแจแ แฉแแ แแฃแแแ แแแ แแคแแแแขแแ แ, แจแแแแแ แแ JIT แจแแแแแแแแแ แแ แฌแแ แแแขแแแฃแแ แจแแกแ แฃแแแแแก แจแแแแแ, แแ แแแ แแแแก แคแแแแแก แแฆแแฌแแ แ แฃแแ แฃแแแแแ แแแแฎแแแ แแแแแก. แฉแแแ แแแแฎแแ แ แ แแแแแแ แแ แแแก แจแแแแแ แฌแแแ แแแฌแแแจแ
แฉแแแ แแฎแแ แแแแฌแแ แ แแแ แแแแฃแ แแ แแแ แแแแก, แ แแแแแแช แฉแแขแแแ แแแแก แแแ แขแแ BPF แแ แแแ แแแแก, แแแแ แแ แฏแแ แฃแแแ แแแแแแฌแงแแแขแแ, แ แแแแ แ แแ แแแ แแแแก แฉแแขแแแ แแแ แแแแแแ - แฃแแแ แแแแ แฉแแแ BPF_PROG_TYPE_XDP
, แ แแแแแแช แแแแแ แฃแแแแก แแแแจแแแแแแแแก XDP_PASS
(แแแแแขแแแแ แงแแแแ แแแแแขแ). BPF แแกแแแแแแ แจแ แแก แซแแแแแ แแแ แขแแแ แฉแแแก:
r0 = 2
exit
แแแก แจแแแแแ แ แแช แแแแแแฌแงแแแขแแ แ แแ แฉแแแ แแแขแแแ แแแแ, แจแแแแแซแแแ แแแแฎแ แแ, แ แแแแ แแแแแแแแแแ แแแแก:
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
static inline __u64 ptr_to_u64(const void *ptr)
{
return (__u64) (unsigned long) ptr;
}
int main(void)
{
struct bpf_insn insns[] = {
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_0,
.imm = XDP_PASS
},
{
.code = BPF_JMP | BPF_EXIT
},
};
union bpf_attr attr = {
.prog_type = BPF_PROG_TYPE_XDP,
.insns = ptr_to_u64(insns),
.insn_cnt = sizeof(insns)/sizeof(insns[0]),
.license = ptr_to_u64("GPL"),
};
strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
for ( ;; )
pause();
}
แแ แแแ แแแแจแ แกแแแแขแแ แแกแ แแแแแแแแแ แแฌแงแแแ แแแกแแแแก แแแแกแแแฆแแ แแ insns
- แฉแแแแ BPF แแ แแแ แแแ แแแแฅแแแแก แแแแจแ. แแ แจแแแแฎแแแแแจแ, BPF แแ แแแ แแแแก แแแแแแฃแแ แแแกแขแ แฃแฅแชแแ แจแแคแฃแแฃแแแ แกแขแ แฃแฅแขแฃแ แแจแ bpf_insn
insns
แจแแแกแแแแแแแ แแแแแแแแแแก r0 = 2
, แแแแ แ - exit
.
แฃแแแ แแแฎแแแ. แแแ แแแ แแแแกแแแฆแแ แแแก แฃแคแ แ แแแกแแฎแแ แฎแแแแ แแแแ แแแแก แแแแฅแแแแแแก แแแแแแแก แแแกแแฌแแ แแ แแ แแแ แแแแก แกแแแแฃแ แแก แคแแแแแก แแแแแกแแงแแแแแแแ tools/include/linux/filter.h
แจแแแแแซแแ แแแฌแแ แ
struct bpf_insn insns[] = {
BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
BPF_EXIT_INSN()
};
แแแแ แแ แแแแก แแแแ, แ แแ BPF แแ แแแ แแแแแแก แแจแแแแแฃแ แแแแจแ แฉแแฌแแ แ แกแแญแแ แแ แแฎแแแแ แแแ แแแจแ แขแแกแขแแแแก แแ BPF-แแก แจแแกแแฎแแ แกแขแแขแแแแแก แแแกแแฌแแ แแ, แแ แแแแ แแแแแก แแ แแ แกแแแแแ แแแแแแแแแ แแ แแ แแฃแแแแก แแแแแแแแแ แแก แชแฎแแแ แแแแก.
BPF แแ แแแ แแแแก แแแแกแแแฆแแ แแก แจแแแแแ แแแแแแแแแแ แ แแแก แแแ แแแจแ แฉแแขแแแ แแแแแ. แฉแแแแ แแแแแแแแแกแขแฃแ แ แแแ แแแแขแ แแแแก แแแแ แแแ attr
แแแแชแแแก แแ แแแ แแแแก แขแแแก, แแแกแขแ แฃแฅแชแแแแแก แแแแแแแฅแขแก แแ แ แแแแแแแแแก, แกแแญแแ แ แแแชแแแแแแก แแ แกแแฎแแแก "woo"
, แ แแแแแกแแช แแแงแแแแแ แฉแแแแขแแแ แแแแก แจแแแแแ แกแแกแขแแแแจแ แฉแแแแ แแ แแแ แแแแก แกแแแแแแแแแ. แแ แแแ แแแ, แ แแแแ แช แแแแแ แแ, แแขแแแ แแแแ แกแแกแขแแแแจแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ bpf
.
แแ แแแ แแแแก แแแแแก แฉแแแ แแฆแแแแฉแแแแแแ แฃแกแแกแ แฃแแ แแแ แงแฃแแจแ, แ แแแแแแช แแฎแแแแก แแแขแแแ แแแแก แกแแแฃแแแชแแแก. แแแแก แแแ แแจแ แแ แแแ แแแ แแแแฆแฃแแแแ แแแ แแแแก แแแแ , แ แแแแกแแช แแแแฎแฃแ แแแ แคแแแแแก แแฆแแฌแแ แ, แ แแแแแแช แกแแกแขแแแฃแ แแ แแแ แแ แแแแแแแ แฃแแแ. bpf
, แแ แกแแกแขแแแแจแ แแแ แแแแแแแฎแแแ.
แแแ แแแ, แฉแแแ แแแแ แแแ แ แขแแกแขแแ แแแแกแแแแก. แแแแแ แจแแแแแ แแแแ แแ แแแแฃแจแแแ แแ แแแ แแแ แฅแแแจ strace
แแแแก แจแแกแแแแฌแแแแแแ, แ แแ แงแแแแแคแแ แ แแฃแจแแแแก แแกแ, แ แแแแ แช แฃแแแ:
$ clang -g -O2 simple-prog.c -o simple-prog
$ sudo strace ./simple-prog
execve("./simple-prog", ["./simple-prog"], 0x7ffc7b553480 /* 13 vars */) = 0
...
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0x7ffe03c4ed50, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_V
ERSION(0, 0, 0), prog_flags=0, prog_name="woo", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS}, 72) = 3
pause(
แฒงแแแแแคแแ แ แแแ แแแแแ, bpf(2)
แแแแแแแ แฃแแแ แกแแฎแแแฃแ แ 3 แแ แฉแแแ แจแแแแแแ แฃแกแแกแ แฃแแ แแแ แงแฃแแจแ pause()
. แจแแแแชแแแแ แแแแแแแ แฉแแแแ แแ แแแ แแแ แกแแกแขแแแแจแ. แแแแกแแแแแก แฉแแแ แแแแแแแแ แกแฎแแ แขแแ แแแแแแจแ แแ แแแแแแแงแแแแแ แแแแฃแแแแฃแ แแ แแแ แแแแก bpftool
:
# bpftool prog | grep -A3 woo
390: xdp name woo tag 3b185187f1855c4c gpl
loaded_at 2020-08-31T24:66:44+0000 uid 0
xlated 16B jited 40B memlock 4096B
pids simple-prog(10381)
แฉแแแ แแฎแแแแแ, แ แแ แกแแกแขแแแแจแ แแ แแก แแแขแแแ แแฃแแ แแ แแแ แแแ woo
แ แแแแแก แแแแแแแฃแ แ ID แแ แแก 390 แแ แแแแแแแ แแแแแแแแ แแแแก simple-prog
แแ แแก แฆแแ แคแแแแแก แแฆแแฌแแ แ, แ แแแแแแช แแแฃแแแแแแก แแ แแแ แแแแแ (แแ แแฃ simple-prog
แแแจแแ แแแแกแ แฃแแแแก แกแแฅแแแก woo
แแแฅแ แแแ). แ แแแแ แช แแแกแแแแแแแแ แแงแ, แแ แแแ แแแ woo
แแฆแแแก 16 แแแแขแก - แแ แแแกแขแ แฃแฅแชแแแก - แแ แแแแแ แแแแแแแก BPF แแ แฅแแขแแฅแขแฃแ แแจแ, แแแแ แแ แแแกแ แแจแแแแแฃแ แ แคแแ แแแ (x86_64) แแก แฃแแแ 40 แแแแขแแ. แแแแแ แจแแแฎแแแแ แฉแแแแก แแ แแแ แแแแก แแแกแ แแ แแแแแแแฃแ แ แคแแ แแแ:
# bpftool prog dump xlated id 390
0: (b7) r0 = 2
1: (95) exit
แแ แแแแแแ แ แกแแฃแ แแ แแแแแ. แแฎแแ แแแแแ แแแแแแฎแแแแ JIT แจแแแแแแแแแแก แแแแ แแแแแ แแ แแแฃแ แแแแก:
# 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
แแ แแ แแก แซแแแแแ แแคแแฅแขแฃแ แ exit(2)
, แแแแ แแ แกแแแแ แแแแแแแ แ แแ แแแฅแแแ, แฉแแแแ แแ แแแ แแแ แซแแแแแ แแแ แขแแแแ แแ แแ แแขแ แแแแแแฃแ แ แแ แแแ แแแแแแกแแแแก JIT แจแแแแแแแแแก แแแแ แแแแแขแแแฃแแ แแ แแแแแ แแ แแแแแแแ, แ แ แแฅแแ แฃแแแ, แกแแญแแ แแ.
แ แฃแแแแ
BPF แแ แแแ แแแแแก แจแแฃแซแแแแ แแแแแแงแแแแ แกแขแ แฃแฅแขแฃแ แแ แแแฃแแ แแแฎแกแแแ แแแแก แแ แแแแ, แ แแแแแแแช แฎแแแแแกแแฌแแแแแแ แ แแแแ แช แกแฎแแ BPF แแ แแแ แแแแแแกแแแแก, แแกแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แแ แกแแแฃแแ แแ แแแ แแแแแแกแแแแก. แแ แแแแแฅแขแแแก แฐแฅแแแ แ แฃแแแแ แแ แแ แแแแงแแคแแแแแแจแ แฉแแแ แแแฉแแแแแแ, แแฃ แ แแแแ แฃแแแ แแแแแแฃแแแ แแแ แแแแแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ bpf
.
แแแฃแงแแแแแแแแ แแแฅแแแ, แ แแ แ แฃแฅแแแแก แจแแกแแซแแแแแแแแแ แแ แจแแแแแคแแ แแแแแ แแฎแแแแ แกแแแ แแ แแแฎแกแแแ แแแแแ แฌแแแแแแ. แแ แกแแแแแก แกแแแชแแแแฃแ แ แแแแแจแแฃแแแแแก แ แฃแฅแแแ, แ แแแแแแแช แจแแแชแแแก, แแแแแแแแแ, แแแแแแแแแแก BPF แแ แแแ แแแแแแกแแแ แแ แฅแกแแแแก แแแขแแ แคแแแกแแแแก แแแแแแแแแแก, แแแ แค แแแแแแแแแแแ แแฃแจแแแแแก แ แฃแฅแแแก แแ แ.แจ. แแแแแ แแฅ แแ แแแกแแฃแแ แแแ, แ แแแ แแแแแฎแแแแ แแ แแแแแแแแแ. แแแ แแ แแแแกแ, แฉแแแ แฃแแฃแแแแแแงแแคแ แกแแแฅแ แแแแแแชแแแก แกแแแแแฎแแแก, แ แแแแแ แแก แแ แแ แแก แแแแจแแแแแแแแแ แฉแแแแ แแแแแแแแแแแกแแแแก. แฎแแแแแกแแฌแแแแแ แ แฃแฅแแแแก แขแแแแแแก แกแ แฃแแ แกแแ แจแแแแซแแแแ แแฎแแแแ แแฅ <linux/bpf.h>
BPF_MAP_TYPE_HASH
.
แแฃ แจแแฅแแแแ แฐแแจแแก แชแฎแ แแแก, แแแฅแแแ, C++-แจแ, แแฅแแแ แแขแงแแแ unordered_map<int,long> woo
, แ แแช แ แฃแกแฃแแแ แแแจแแแแก โแแแแแแ แแญแแ แแแแ woo
แจแแฃแแฆแฃแแแแ แแแแ, แ แแแแแก แแแกแแฆแแแแแ แแ แแก แขแแแแก int
, แแ แแแแจแแแแแแแแแ แแ แแก แขแแแ long
" แแแแกแแแแแก, แ แแ แจแแแฅแแแแ BPF แฐแแจแแก แชแฎแ แแแ, แฉแแแ แฃแแแ แแแแแแแแแ แแแแฎแแแแแแ แแแแแ, แแแ แแ แแแแกแ, แ แแ แฉแแแ แฃแแแ แแแแฃแแแแแ แชแฎแ แแแแก แแแฅแกแแแแแฃแ แ แแแแ แแ แแแแก แแแชแแแแ, แ แแ แแแแฃแแแแแ แแแกแแฆแแแแแแก แขแแแแแ แแ แแแแจแแแแแแแแแ, แฉแแแ แฃแแแ แแแแฃแแแแแ แแแแ แแแแแแ แแแแขแแแจแ. . แ แฃแฅแแแแก แจแแกแแฅแแแแแแ แแแแแแงแแแแ แแ แซแแแแแ BPF_MAP_CREATE
แกแแกแขแแแฃแ แ แแแ แ bpf
. แแแแแ แจแแแฎแแแแ แแแข-แแแแแแแแ แแแแแแแแฃแ แแ แแแ แแแแก, แ แแแแแแช แฅแแแแก แ แฃแแแก. แฌแแแ แแ แแแ แแแแก แจแแแแแ, แ แแแแแแช แแขแแแ แแแแ BPF แแ แแแ แแแแแก, แแก แแแ แขแแแ แฃแแแ แแแแแฉแแแแแ:
$ cat simple-map.c
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
int main(void)
{
union bpf_attr attr = {
.map_type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(int),
.value_size = sizeof(int),
.max_entries = 4,
};
strncpy(attr.map_name, "woo", sizeof(attr.map_name));
syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
for ( ;; )
pause();
}
แแฅ แฉแแแ แแแแแกแแแฆแแ แแแ แแแ แแแแขแ แแแแก แแแแแแแฅแขแก attr
, แ แแแแแจแแช แฉแแแ แแแแแแแ โแแ แแญแแ แแแแ แฐแแจแแก แชแฎแ แแแ แแแกแแฆแแแแแแ แแ แแแแแก แแแแจแแแแแแแแแแ sizeof(int)
, แ แแแแแจแแช แแแฅแกแแแฃแ แแแฎแ แแแแแแแขแแก แฉแแกแแ แจแแแแซแแแ." BPF แ แฃแฅแแแแก แจแแฅแแแแกแแก แจแแแแซแแแแ แแแฃแแแแแ แกแฎแแ แแแ แแแแขแ แแแ, แแแแแแแแแ, แแกแแแ, แ แแแแ แช แแ แแแ แแแแก แแแแแแแแจแ, แฉแแแ แแแแแแฃแกแขแแ แแแแแฅแขแแก แกแแฎแแแ, แ แแแแ แช "woo"
.
แแแแแ แจแแแแแแแแแ แแ แแแแฃแจแแแ แแ แแแ แแแ:
$ clang -g -O2 simple-map.c -o simple-map
$ sudo strace ./simple-map
execve("./simple-map", ["./simple-map"], 0x7ffd40a27070 /* 14 vars */) = 0
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, value_size=4, max_entries=4, map_name="woo", ...}, 72) = 3
pause(
แแ แกแแกแขแแแฃแ แ แแแ แ bpf(2)
แแแแแแแ แฃแแ แแฆแฌแแ แแก แ แฃแแแก แแแแแ แ 3
แแ แจแแแแแ แแ แแแ แแแ, แ แแแแ แช แแแกแแแแแแแแ แแงแ, แแแแแแแ แจแแแแแแ แแแกแขแ แฃแฅแชแแแแก แกแแกแขแแแฃแ แแแ แจแ pause(2)
.
แแฎแแ แแแแแ แแแแแแแแแแแ แฉแแแแ แแ แแแ แแแ แคแแแแ แแ แแแแฎแกแแแ แกแฎแแ แขแแ แแแแแแ แแ แจแแแฎแแแแ แฉแแแแก แแแแแฅแขแก แฃแขแแแแขแแก แแแแแงแแแแแแ bpftool
(แฉแแแ แจแแแแแซแแแ แแแแแแกแฎแแแแแ แฉแแแแ แ แฃแแ แกแฎแแแแแกแแแ แแแแแกแ แกแแฎแแแแ):
$ sudo bpftool map
...
114: hash name woo flags 0x0
key 4B value 4B max_entries 4 memlock 4096B
...
แแแแแ แ 114 แแ แแก แฉแแแแ แแแแแฅแขแแก แแแแแแแฃแ แ ID. แกแแกแขแแแแก แแแแแกแแแแ แแ แแแ แแแแก แจแแฃแซแแแ แแแแแแงแแแแก แแก ID แแ แซแแแแแแก แแแแแงแแแแแแ แแ แกแแแฃแแ แ แฃแแแก แแแกแแฎแกแแแแแ BPF_MAP_GET_FD_BY_ID
แกแแกแขแแแฃแ แ แแแ แ bpf
.
แแฎแแ แฉแแแ แจแแแแแซแแแ แแแแแแแจแแ แฐแแจแแก แแแแแแแกแแแ. แแแแแ แจแแแฎแแแแ แแแก แจแแแแแ แกแก:
$ sudo bpftool map dump id 114
Found 0 elements
แชแแ แแแแ. แแแแแ แแแแแงแแแแ แแแกแจแ แฆแแ แแแฃแแแแ hash[1] = 1
:
$ sudo bpftool map update id 114 key 1 0 0 0 value 1 0 0 0
แแแแแ แแ แแฎแแ แแแแแแฎแแแแ แชแฎแ แแแก:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
Found 1 element
แฐแแ! แฉแแแ แแแแแฎแแ แฎแแ แแ แแ แแแแแแแขแแก แแแแแขแแแ. แแแแแแแแแกแฌแแแแ, แ แแ แแแแกแแแแแก แฉแแแ แฃแแแ แแแแฃแจแแแ แแแแขแแก แแแแแแ, แ แแแแแ bptftool
แแ แแชแแก แ แ แขแแแแก แแแแจแแแแแแแแแแ แฐแแจแแก แชแฎแ แแแจแ. (แแก แชแแแแ แจแแแซแแแแ แแแแแแชแแก แแแก BTF-แแก แแแแแงแแแแแแ, แแแแ แแ แแแแแ แแแขแ แแฎแแ.)
แแฃแกแขแแ แ แแแแ แแแแฎแฃแแแแก แแ แแแแขแแแก แแแแแแแขแแแก bpftool? แแแแแ แจแแแฎแแแแ แแแแแขแแก แฅแแแจ:
$ sudo strace -e bpf bpftool map dump id 114
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x55856ab65280}, 120) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x55856ab65280, value=0x55856ab652a0}, 120) = 0
key: 01 00 00 00 value: 01 00 00 00
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x55856ab65280, next_key=0x55856ab65280}, 120) = -1 ENOENT
แฏแแ แแแแฎแกแแแแ แ แฃแแ แแแกแ แแแแแแแฃแ แ ID-แแ แแ แซแแแแแแก แแแแแงแแแแแแ BPF_MAP_GET_FD_BY_ID
ะธ bpf(2)
แแแแแแแ แฃแแ แแฆแแฌแแ แ 3. แแ แซแแแแแแก แจแแแแแแแ แแแแแงแแแแแแ BPF_MAP_GET_NEXT_KEY
แชแฎแ แแแแก แแแ แแแแ แแแกแแฆแแแ แแแแแแแ แแแแแแก แแแแ NULL
แ แแแแ แช "แฌแแแ" แแแกแแฆแแแแก แแแฉแแแแแแแแ. แแฃ แฉแแแ แแแแฅแแก แแแกแแฆแแแ, แจแแแแแซแแแ แแแแแแแแแ BPF_MAP_LOOKUP_ELEM
แ แแแแแแช แฃแแ แฃแแแแก แแแแจแแแแแแแแก แแแฉแแแแแแแแก value
. แจแแแแแแ แแแแแฏแ แแ แแก แฉแแแ แแชแแแแแแ แแแแแแแ แจแแแแแแ แแแแแแแขแ แแแแแแแแ แ แแแแแแจแแ แแแฉแแแแแแแแก แแแแแชแแแแ, แแแแ แแ แฉแแแแ แชแฎแ แแแ แจแแแชแแแก แแฎแแแแ แแ แ แแแแแแแขแก แแ แแ แซแแแแแแก BPF_MAP_GET_NEXT_KEY
แแ แฃแแแแแ ENOENT
.
แแแ แแ, แแแแแ แจแแแชแแแแแ แแแแจแแแแแแแ 1-แแ, แแแฅแแแ, แฉแแแแ แแแแแแก แแแแแแ แแแแแฎแแแก แ แแแแกแขแ แแชแแแก hash[1] = 2
:
$ sudo strace -e bpf bpftool map update id 114 key 1 0 0 0 value 2 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x55dcd72be260, value=0x55dcd72be280, flags=BPF_ANY}, 120) = 0
แ แแแแ แช แแแกแแแแแแแแ แแงแ, แแก แซแแแแแ แแแ แขแแแแ: แแ แซแแแแแ BPF_MAP_GET_FD_BY_ID
แฎแกแแแก แฉแแแแก แ แฃแแแก ID-แแ แแ แแ แซแแแแแแ BPF_MAP_UPDATE_ELEM
แแแแแฌแแ แก แแแแแแแขแก.
แแกแ แ แแ, แแ แแ แแ แแแ แแแแแแ แฐแแจแแก แชแฎแ แแแแก แจแแฅแแแแก แจแแแแแ, แจแแแแแซแแแ แแแกแ แจแแแแแ แกแแก แฌแแแแแฎแแ แแ แฉแแฌแแ แ แกแฎแแแแแ. แแแแแแแแแกแฌแแแแ, แ แแ แแฃ แฉแแแ แจแแแซแแแแ แแแแก แแแแแแแแ แแ แซแแแแแแก แฎแแแแแแ, แแแจแแ แกแแกแขแแแแก แแแแแกแแแแ แกแฎแแ แแ แแแ แแแแก แจแแฃแซแแแ แแแแก แแแแแแแแ. แแแแแ แแฆแฌแแ แแแ แแ แซแแแแแแแแก แแแ แแ, แ แฃแแแแแแ แแฃแจแแแแแกแแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแแแ,
BPF_MAP_LOOKUP_ELEM
: แแแแแแแ แแแแจแแแแแแแ แแแกแแฆแแแแBPF_MAP_UPDATE_ELEM
: แแแแแฎแแแแ/แจแแฅแแแ แฆแแ แแแฃแแแแBPF_MAP_DELETE_ELEM
: แแแกแแฆแแแแก แแแแฆแแแBPF_MAP_GET_NEXT_KEY
: แแแแแแแ แจแแแแแแ (แแ แแแ แแแแ) แแแกแแฆแแแBPF_MAP_GET_NEXT_ID
: แแแซแแแแ แกแแจแฃแแแแแแก แแแแแ แแ แงแแแแ แแ แกแแแฃแแ แ แฃแแ, แแกแ แแฃแจแแแแกbpftool map
BPF_MAP_GET_FD_BY_ID
: แแแฎแกแแแแ แแ แกแแแฃแแ แ แฃแแ แแแกแ แแแแแแแฃแ แ ID-แแBPF_MAP_LOOKUP_AND_DELETE_ELEM
: แแขแแแฃแ แแ แแแแแแฎแแแ แแแแแฅแขแแก แแแแจแแแแแแแ แแ แแแแแ แฃแแแ แซแแแแBPF_MAP_FREEZE
: แแแฎแแแแ แ แฃแแ แจแแฃแชแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ (แแ แแแแ แแชแแแก แแแฃแฅแแแแ แจแแฃแซแแแแแแแ)BPF_MAP_LOOKUP_BATCH
,BPF_MAP_LOOKUP_AND_DELETE_BATCH
,BPF_MAP_UPDATE_BATCH
,BPF_MAP_DELETE_BATCH
: แแแกแแแ แแแ แแแแ แแชแแแแ. แฒแแแแแแแแ,BPF_MAP_LOOKUP_AND_DELETE_BATCH
- แแก แแ แแก แแ แแแแแ แแ แกแแแแแแ แแแ แ แฃแฅแแแแ แงแแแแ แแแแจแแแแแแแแก แฌแแแแแฎแแแกแ แแ แแแแแขแแแ แแแแกแแแแก
แงแแแแ แแก แแ แซแแแแแ แแ แแฃแจแแแแก แงแแแแ แขแแแแก แ แฃแฅแแกแแแแก, แแแแ แแ แแแแแแแ แกแฎแแ แขแแแแก แ แฃแฅแแแแแ แแฃแจแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ แแฃแกแขแแ แแกแ แแแแแแงแฃแ แแแ, แ แแแแ แช แฐแแจ แชแฎแ แแแแแแแ แแฃแจแแแแ.
แฌแแกแ แแแแก แแฃแแแกแแแแก, แแแแแ แแแแแกแ แฃแแแ แฐแแจแแก แชแฎแ แแแแก แแฅแกแแแ แแแแแขแแแ. แแแฎแกแแแแแ, แ แแ แฉแแแ แจแแแฅแแแแแ แชแฎแ แแแ, แ แแแแแแช แจแแแซแแแแ แจแแแชแแแแแก แแแฎแแแแ แแแแแแจแก? แแแแแแแขแแ แแแแแ แ แแแแแแแแ แแแแแแแขแ:
$ 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 bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
key: 02 00 00 00 value: 01 00 00 00
key: 04 00 00 00 value: 01 00 00 00
key: 03 00 00 00 value: 01 00 00 00
Found 4 elements
แจแแแแชแแแแ แแแแแแแขแแ แแแแแ แแ แแ:
$ sudo bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
Error: update failed: Argument list too long
แ แแแแ แช แแแกแแแแแแแแ แแงแ, แฌแแ แแแขแแแแก แแแ แแแแแฆแฌแแแ. แแแแแ แจแแแฎแแแแ แจแแชแแแแแก แฃแคแ แ แแแขแแแฃแ แแ:
$ 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 +++
แงแแแแแคแแ แ แแแ แแแแแ: แ แแแแ แช แแแกแแแแแแแแ แแงแ, แแฃแแแ BPF_MAP_UPDATE_ELEM
แชแแแแแแก แจแแฅแแแแก แแฎแแแ, แแแฎแฃแแ แแแกแแฆแแแ, แแแแ แแ แแแแ แแ E2BIG
.
แแแ แแแแ, แฉแแแ แจแแแแแซแแแ แจแแแฅแแแแ แแ แฉแแแขแแแ แแแ BPF แแ แแแ แแแแแ, แแกแแแ แจแแแฅแแแแ แแ แแแแ แแแ แ แฃแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ. แแฎแแ แแแแแแฃแ แแ แจแแแฎแแแแ, แแฃ แ แแแแ แจแแแแแซแแแ แแแแแแแงแแแแ แ แฃแแแแ แแแแแ BPF แแ แแแ แแแแแแแแ. แฉแแแ แจแแแแแซแแแ แแแกแแฃแแ แแ แแแแแ แซแแแแแ แฌแแกแแแแแฎแ แแ แแแ แแแแแแก แแแแแ แแแแฅแแแฃแ แแแแ แ แแแแแแจแ, แแแแ แแ แ แแแแฃแ แแ แแแแแ แแ แ, แแแฉแแแแแ, แแฃ แ แแแแ แแฌแแ แแแ แแ แแแแฎแแแ BPF แแ แแแ แแแแแ แ แแแแฃแ แแ - แแแแแงแแแแแแ libbpf
.
(แแแแแฎแแแแแแแกแแแแก, แ แแแแแแแช แฃแแแแงแแคแแแแแ แแ แแแ แแแแแแ แแแแแก แแแแแแแแแก แแ แแ แกแแแแแแ: แฉแแแ แแแขแแแฃแ แแ แแแแแแแแแแแแแ แแ แแแ แแแแแก, แ แแแแแแแช แแงแแแแแแ แ แฃแแแแก แแ แแแแฎแแแ แ แคแฃแแฅแชแแแแก, แ แแแแแแแช แจแแฅแแแแแแ แแแแแงแแแแแแ libbpf
แแ แแแแฎแ แแ แ แ แฎแแแแ แแแกแขแ แฃแฅแชแแแก แแแแแแ. แฃแแแแงแแคแแแ แแแแแฎแแแแแแแกแแแแก แซแแแแแ แแแแ แ, แแแแแแแขแแ
BPF แแ แแแ แแแแแแก แฌแแ แ libbpf-แแก แแแแแงแแแแแแ
BPF แแ แแแ แแแแแแก แฌแแ แ แแแแฅแแแแก แแแแแแแก แแแแแงแแแแแแ แจแแแซแแแแ แแงแแก แกแแแแขแแ แแกแ แแฎแแแแ แแแ แแแแแ, แจแแแแแ แแ แฉแแแแแ แแแฏแแ แแแ. แแ แแแแแแขแจแ แงแฃแ แแแฆแแแ แฃแแแ แแแแฅแชแแแ llvm
, แ แแแแแกแแช แแฅแแก BPF แแ แฅแแขแแฅแขแฃแ แแก แแแแแก แแแแแ แแ แแแแก แกแแคแแแแ, แแกแแแ แแแแแแแแแแ libbpf
, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแฌแแ แแ BPF แแแแแแแชแแแแแก แแแแฎแแแ แแแแแก แแฎแแ แ แแ แฉแแขแแแ แแแ BPF แแ แแแ แแแแแแก แแแแ, แ แแแแแแช แแแแแ แแ แแแฃแแแ แแแแแงแแแแแแ llvm
/clang
.
แกแแแแแแแแแแจแ, แ แแแแ แช แแ แแ แจแแแแแแ แกแขแแขแแแแจแ แแแแแแแฎแแแ, libbpf
แแแแแแแก แกแแแแแแ แแแแ แกแแแฃแจแแแก แแแก แแแ แแจแ (แแ แแกแแแแกแ แฎแแแกแแฌแงแแแแ - iproute2
, libbcc
, libbpf-go
แแ แ.แจ.) แจแแฃแซแแแแแแแ แชแฎแแแ แแแ. แแ แแแฅแขแแก แแ แ-แแ แแ แแแแแแแ แแแแกแแแ libbpf
แแ แแก BPF CO-RE (แจแแแแแแ แแ แแฎแแ, แแแฃแจแแแ แงแแแแแแ) - แแ แแแฅแขแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแฌแแ แแ BPF แแ แแแ แแแแแ, แ แแแแแแแช แแแ แขแแขแฃแแแ แแ แแ แแแ แแแแแแ แแแแ แแแ, แกแฎแแแแแกแฎแแ API-แแ แแแจแแแแแก แจแแกแแซแแแแแแแแ (แแแแแแแแแ, แ แแแแกแแช แแแ แแแแก แกแขแ แฃแฅแขแฃแ แ แแชแแแแแ แแแ แกแแแแแ. แแแ แกแแแแแ). แแแแกแแแแแก, แ แแ แจแแซแแแ CO-RE-แกแแแ แแฃแจแแแแ, แแฅแแแแ แแแ แแแ แฃแแแ แแงแแก แจแแแแแแแแ BTF แแฎแแ แแแญแแ แแ (แฉแแแ แแฆแแฌแแ แ, แแฃ แ แแแแ แฃแแแ แแแแแแแแแ แแก แแแแงแแคแแแแแแจแ
$ ls -lh /sys/kernel/btf/vmlinux
-r--r--r-- 1 root root 2.6M Jul 29 15:30 /sys/kernel/btf/vmlinux
แแก แคแแแแ แแแแฎแแแก แแแคแแ แแแชแแแก แแแ แแแจแ แแแแแงแแแแแฃแแ แงแแแแ แขแแแแก แแแแแชแแแแ แจแแกแแฎแแ แแ แแแแแแงแแแแแ แฉแแแแก แงแแแแ แแแแแแแแจแ libbpf
. CO-RE-แแ แแแขแแแฃแ แแ แแแกแแฃแแ แแแ แจแแแแแ แกแขแแขแแแจแ, แแแแ แแ แแ แกแขแแขแแแจแ - แฃแแ แแแแ แจแแฅแแแแแ แแแ แแแ CONFIG_DEBUG_INFO_BTF
.
แแแแแแแแแแ libbpf
แชแฎแแแ แแแก แแแ แแแแแ แแแ แแฅแขแแ แแแจแ tools/lib/bpf
แแแ แแแ แแ แแแกแ แแแแแแแแ แแแ แฎแแแแ แกแแคแแกแขแ แกแแแก แแแจแแแแแแ [email protected]
. แแฃแแชแ, แชแแแแ แกแแชแแแ แแแแฎแแแ แแแ แแแแก แแแ แแ แแชแฎแแแ แแแ แแแแแแแชแแแแแก แกแแญแแ แแแแแแแกแแแแก
แแ แแแแงแแคแแแแแแจแ แแแแแแฎแแแแแ, แแฃ แ แแแแ แจแแแแซแแแแ แจแแฅแแแแ แแ แแแฅแขแ, แ แแแแแแช แแงแแแแแก libbpf
, แแแแฌแแ แแ แ แแแแแแแแ (แแแข-แแแแแแแแ แฃแแแ แ) แกแแขแแกแขแ แแ แแแ แแแ แแ แแแขแแแฃแ แแ แแแแแแแแแแแแ แ แแแแ แแฃแจแแแแก แแก แงแแแแแคแแ แ. แแก แกแแจแฃแแแแแแก แแแแแชแแแก แฃแคแ แ แแแ แขแแแแ แแแฎแกแแแ แจแแแแแ แแแแงแแคแแแแแแแจแ, แแฃ แ แแแแ แฃแ แแแแ แแฅแแแแแแแ BPF แแ แแแ แแแแแ แ แฃแแแแแแ, แแแ แแแแก แแแแฎแแแ แแแแแแแแ, BTF แแ แ.แจ.
แ แแแแ แช แฌแแกแ, แแ แแแฅแขแแแแก แแแแแงแแแแแแ libbpf
แแแแแแขแแ GitHub แกแแชแแแ, แ แแแแ แช git แฅแแแแแแฃแแ, แฉแแแ แแแแแแก แแแแแแแแแแ:
$ mkdir /tmp/libbpf-example
$ cd /tmp/libbpf-example/
$ git init-db
Initialized empty Git repository in /tmp/libbpf-example/.git/
$ git submodule add https://github.com/libbpf/libbpf.git
Cloning into '/tmp/libbpf-example/libbpf'...
remote: Enumerating objects: 200, done.
remote: Counting objects: 100% (200/200), done.
remote: Compressing objects: 100% (103/103), done.
remote: Total 3354 (delta 101), reused 118 (delta 79), pack-reused 3154
Receiving objects: 100% (3354/3354), 2.05 MiB | 10.22 MiB/s, done.
Resolving deltas: 100% (2176/2176), done.
แแแแแก libbpf
แซแแแแแ แแแ แขแแแแ:
$ cd libbpf/src
$ mkdir build
$ OBJDIR=build DESTDIR=root make -s install
$ find root
root
root/usr
root/usr/include
root/usr/include/bpf
root/usr/include/bpf/bpf_tracing.h
root/usr/include/bpf/xsk.h
root/usr/include/bpf/libbpf_common.h
root/usr/include/bpf/bpf_endian.h
root/usr/include/bpf/bpf_helpers.h
root/usr/include/bpf/btf.h
root/usr/include/bpf/bpf_helper_defs.h
root/usr/include/bpf/bpf.h
root/usr/include/bpf/libbpf_util.h
root/usr/include/bpf/libbpf.h
root/usr/include/bpf/bpf_core_read.h
root/usr/lib64
root/usr/lib64/libbpf.so.0.1.0
root/usr/lib64/libbpf.so.0
root/usr/lib64/libbpf.a
root/usr/lib64/libbpf.so
root/usr/lib64/pkgconfig
root/usr/lib64/pkgconfig/libbpf.pc
แฉแแแแ แจแแแแแแ แแแแแ แแ แแแแงแแคแแแแแแจแ แแกแแแแ: แฉแแแ แแแแฌแแ แ BPF แแ แแแ แแแแก, แ แแแแ แแชแแ BPF_PROG_TYPE_XDP
, แแแแแ, แ แแช แฌแแแ แแแแแแแแจแ, แแแแ แแ C-แจแ, แฉแแแ แแแแแแแ แแแก แแแแแงแแแแแแ clang
แแ แแแฌแแ แแ แแแแฎแแแ แ แแ แแแ แแแ, แ แแแแแแช แฉแแขแแแ แแแแก แแแก แแแ แแแจแ. แจแแแแแ แแแแงแแคแแแแแแแจแ แฉแแแ แแแแแคแแ แแแแแแ แ แแแแ แช BPF แแ แแแ แแแแก, แแกแแแ แแกแแกแขแแแขแแก แแ แแแ แแแแก แจแแกแแซแแแแแแแแแก.
แแแแแแแแ: แกแ แฃแแคแแกแแแแแ แแแแแแแชแแแก แจแแฅแแแ libbpf-แแก แแแแแงแแแแแแ
แแแกแแฌแงแแกแแกแแแแก, แฉแแแ แแแงแแแแแ แคแแแแก /sys/kernel/btf/vmlinux
, แ แแแแแแช แแแแแ แแงแ แแแฎแกแแแแแ แแ แจแแฅแแแแแ แแแกแ แแแแแแแแแแขแ แกแแแแฃแ แแก แคแแแแแก แกแแฎแแ:
$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
แแก แคแแแแ แจแแแแแฎแแแก แฉแแแแก แแแ แแแจแ แแ แกแแแฃแ แงแแแแ แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแก, แแแแแแแแแ, แแกแ แแ แแก IPv4 แกแแแแฃแ แ แแแแกแแแฆแแ แฃแแ แแแ แแแจแ:
$ grep -A 12 'struct iphdr {' vmlinux.h
struct iphdr {
__u8 ihl: 4;
__u8 version: 4;
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
};
แแฎแแ แฉแแแ แแแแฌแแ แ แฉแแแแก BPF แแ แแแ แแแแก C-แจแ:
$ cat xdp-simple.bpf.c
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
SEC("xdp/simple")
int simple(void *ctx)
{
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";
แแแฃแฎแแแแแแ แแแแกแ, แ แแ แฉแแแแ แแ แแแ แแแ แซแแแแแ แแแ แขแแแ แแฆแแแฉแแแ, แฉแแแ แแแแแช แฃแแแ แแแแแฅแชแแแ แงแฃแ แแแฆแแแ แแแแ แแแขแแแก. แแแ แแแแ, แแแ แแแแ แกแแแแฃแ แแก แคแแแแ, แ แแแแแแช แฉแแแ แจแแแแขแแแ แแ แแก vmlinux.h
, แ แแแแแแช แฉแแแ แแฎแแแฎแแ แจแแแฅแแแแแ แแแแแงแแแแแแ bpftool btf dump
- แแฎแแ แฉแแแ แแ แแแญแแ แแแแ kernel-headers แแแแแขแแก แแแงแแแแแ, แ แแแ แแแแแแแ, แ แแแแ แแแแแแงแฃแ แแแ แแแ แแแแก แกแขแ แฃแฅแขแฃแ แแแ. แจแแแแแแ แกแแแแฃแ แแก แคแแแแ แฉแแแแแแ แแแแแก แแแแแแแแแแแแแ libbpf
. แแฎแแ แแก แแฎแแแแ แแแแ แแก แแแแกแแแฆแแ แแกแแแแก แแแญแแ แแแแ SEC
, แ แแแแแแช แแแแแแแแก แกแแแแแแแก ELF แแแแแฅแขแแก แคแแแแแก แจแแกแแแแแแก แแแแงแแคแแแแแแจแ. แฉแแแแ แแ แแแ แแแ แแแชแแแฃแแแ แแแแงแแคแแแแแแจแ xdp/simple
, แกแแแแช แฎแแแแแแ แฉแแแ แแแแแกแแแฆแแ แแแ แแ แแแ แแแแก แขแแแก BPF - แแก แแ แแก แแแแแแแชแแ, แ แแแแแแช แแแแแแงแแแแแ libbpf
, แแแแงแแคแแแแแแก แกแแฎแแแแ แแแงแ แแแแแแ, แแก แฉแแแแแชแแแแแก แกแฌแแ แขแแแก แแแจแแแแแกแแก bpf(2)
. แแแแแ BPF แแ แแแ แแแแ C
- แซแแแแแ แแแ แขแแแ แแ แจแแแแแแ แแ แแ แฎแแแแกแแแ return XDP_PASS
. แแ แแแแแก, แชแแแแ แแแแงแแคแแแแแ "license"
แจแแแชแแแก แแแชแแแแแแก แกแแฎแแแก.
แฉแแแ แจแแแแแซแแแ แจแแแแแแแแแ แฉแแแแ แแ แแแ แแแ llvm/clang-แแก แแแแแงแแแแแแ, แแแ แกแแ >= 10.0.0, แแ แแแแแ แฃแแแแแกแ, แฃแคแ แ แแแแ (แแฎแแแแ แกแแฅแชแแ
$ clang --version
clang version 11.0.0 (https://github.com/llvm/llvm-project.git afc287e0abec710398465ee1f86237513f2b5091)
...
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
แกแแแแขแแ แแกแ แแแฎแแกแแแแแแแแแก แจแแ แแก: แฉแแแ แแแแฃแแแแแแ แกแแแแแแ แแ แฅแแขแแฅแขแฃแ แแก -target bpf
แแ แแแ แกแแแแฃแ แแแแกแแแ libbpf
, แ แแแแแแช แฉแแแ แแฎแแแฎแแ แแแแแแแกแขแแแแ แแ. แแกแแแ, แแ แแแแแแฌแงแแ -O2
, แแ แแแ แแแแขแ แแก แแแ แแจแ แแแแแแแแจแ แจแแกแแซแแแ แกแแฃแ แแ แแแแแ แแฅแแแแแ. แแแแแ แแแแแแฎแแแแ แฉแแแแก แแแแก, แแแแแฎแแ แฎแแ แแฃ แแ แ แกแแกแฃแ แแแแ แแ แแแ แแแแก แแแฌแแ แ?
$ llvm-objdump --section=xdp/simple --no-show-raw-insn -D xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: r0 = 2
1: exit
แแแแฎ, แแแฃแจแแแ! แแฎแแ แฉแแแ แแแแฅแแก แแ แแแแแ แคแแแแ แแ แแแ แแแแ แแ แแแแแแ แจแแแฅแแแแ แแแแแแแชแแ, แ แแแแแแช แฉแแขแแแ แแแแก แแแก แแแ แแแจแ. แแ แแแแแแ แแแแแแแแแแ libbpf
แแแแแแแแแแก แแ แแแ แแแแขแก - แแแแแแงแแแแ แฅแแแแ แแแแแก API แแ แฃแคแ แ แแแฆแแแ แแแแแก API. แฉแแแ แฌแแแแแ แแแแ แ แแแแแ, แ แแแแแ แแแแแแ แแแกแฌแแแแแ แ แแแแ แแแแฌแแ แแ, แฉแแขแแแ แแแ แแ แแแแแแแจแแ แแ BPF แแ แแแ แแแแแ แแแแแแแแฃแ แ แซแแแแกแฎแแแแแ แแแแ แจแแแแแแแ แจแแกแฌแแแแแกแแแแก.
แแแ แแแ แ แแแจแ, แฉแแแ แฃแแแ แจแแแฅแแแแ แฉแแแแ แแ แแแ แแแแก โแฉแแแฉแฎแโ แแแกแ แแแแแ แแแแ แแแแแ แแ แแแ แแแแก แแแแแงแแแแแแ bpftool
- BPF แกแแแงแแ แแก แจแแแแชแแ แแฃแแ แแแแ (แ แแช แจแแแซแแแแ แกแแขแงแแแกแแขแงแแแ แแฅแแแก แแฆแฅแแฃแแ, แ แแแแแ แแแแแแ แแแ แแแแแ, BPF-แแก แแ แ-แแ แแ แจแแแฅแแแแแ แแ แจแแแกแ แฃแแแแแแ, แจแแแแชแแ แแแแแ):
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
แคแแแแจแ xdp-simple.skel.h
แจแแแชแแแก แฉแแแแ แแ แแแ แแแแก แแ แแแแ แแแแก แแ แคแฃแแฅแชแแแแก แแแ แแแแกแแแแก - แฉแแแแ แแแแแฅแขแแก แฉแแขแแแ แแแ, แแแแแแ แแแ, แฌแแจแแ. แฉแแแแก แแแ แขแแ แจแแแแฎแแแแแจแ, แแก แแแแแแขแแ แแแแแแงแฃแ แแแ, แแแแ แแ แแก แแกแแแ แแฃแจแแแแก แแ แจแแแแฎแแแแแจแ, แ แแแแกแแช แแแแแฅแขแแก แคแแแแ แจแแแชแแแก แแแแ BPF แแ แแแ แแแแก แแ แ แฃแฅแแก แแ แแ แแแแแแขแฃแ แ ELF-แแก แฉแแกแแขแแแ แแแ, แฉแแแ แฃแแ แแแแ แแแญแแ แแแแ แฉแแแฉแฎแแก แแแแแ แแ แแแ แแ แแ แแ แแ แแ แ แคแฃแแฅแชแแแก แแแแแซแแฎแแแ แแแ แแแแฃแแ แแแแแแแชแแแแแ. แฌแแ แแ แแฎแแแแ แแแแแแ แซแแแแ.
แแแแชแ แแ แ แแ แแแฅแแแ, แฉแแแแ แฉแแแขแแแ แแแแ แแ แแแ แแแ แขแ แแแแแแฃแ แแ:
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
pause();
xdp_simple_bpf__destroy(obj);
}
แแฅ struct xdp_simple_bpf
แคแแแแจแ แแแแกแแแฆแแ แฃแแ xdp-simple.skel.h
แแ แแฆแฌแแ แก แฉแแแแก แแแแแฅแขแแก แคแแแแก:
struct xdp_simple_bpf {
struct bpf_object_skeleton *skeleton;
struct bpf_object *obj;
struct {
struct bpf_program *simple;
} progs;
struct {
struct bpf_link *simple;
} links;
};
แฉแแแ แจแแแแแซแแแ แแแแแแแฎแแ แแแแแแ แแแแแก API-แก แแแแแ แแฅ: แกแขแ แฃแฅแขแฃแ แ struct bpf_program *simple
ะธ struct bpf_link *simple
. แแแ แแแแ แกแขแ แฃแฅแขแฃแ แ แแแแแ แแขแฃแแแ แแฆแฌแแ แก แฉแแแแก แแ แแแ แแแแก, แ แแแแแแช แแแฌแแ แแแแ แแแแงแแคแแแแแแจแ xdp/simple
แแ แแแแ แ แแฆแฌแแ แก, แแฃ แ แแแแ แฃแแแแจแแ แแแแ แแ แแแ แแแ แแแแแแแแก แฌแงแแ แแก.
แคแฃแแฅแชแแ xdp_simple_bpf__open_and_load
, แฎแกแแแก ELF แแแแแฅแขแก, แแแแแแแแแแก แแแก, แฅแแแแก แงแแแแ แกแขแ แฃแฅแขแฃแ แแก แแ แฅแแแกแขแ แฃแฅแขแฃแ แแก (แแ แแแ แแแแก แแแ แแ, ELF แจแแแชแแแก แกแฎแแ แแแแงแแคแแแแแแแกแแช - แแแแแชแแแแแก, แแฎแแแแ แฌแแแแแฎแแแก แแแแแชแแแแแก, แแแแแ แแแแก แแแคแแ แแแชแแแก, แแแชแแแแแแก แแ แ.แจ.) แแ แจแแแแแ แแขแแแ แแแแ แแแก แแแ แแแจแ แกแแกแขแแแแก แแแแแงแแแแแแ. แแแ แ bpf
, แ แแแแแแช แจแแแแแซแแแ แจแแแแแแฌแแแ แแ แแแ แแแแก แจแแแแแแแ แแ แแแจแแแแแ:
$ clang -O2 -I ./libbpf/src/root/usr/include/ xdp-simple.c -o xdp-simple ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_BTF_LOAD, 0x7ffdb8fd9670, 120) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0xdfd580, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 8, 0), prog_flags=0, prog_name="simple", prog_ifindex=0, expected_attach_type=0x25 /* BPF_??? */, ...}, 120) = 4
แแแแแ แแฎแแ แแแแแแฎแแแแ แฉแแแแก แแ แแแ แแแแก bpftool
. แแแแ แแแแแแแ แแแกแ ID:
# 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)
แแ dump (แฉแแแ แแแงแแแแแ แแ แซแแแแแแก แจแแแแแแแแฃแ แคแแ แแแก bpftool prog dump xlated
):
# bpftool p d x id 463
int simple(void *ctx):
; return XDP_PASS;
0: (b7) r0 = 2
1: (95) exit
แ แแฆแแช แแฎแแแ! แแ แแแ แแแแ แแแแแญแแ แฉแแแแ C แฌแงแแ แแก แคแแแแแก แแแฌแแแแแแแ. แแก แแแแแแแ แแแแแแแแแแแก แแแแ libbpf
, แ แแแแแแแช แแแแแ แแแแแ แแแแก แแแแงแแคแแแแแ แแแแแ แจแ, แจแแแแแแแ แแแ BTF แแแแแฅแขแจแ แแ แฉแแขแแแ แแ แแแ แแแจแ แแแแแงแแแแแแ BPF_BTF_LOAD
, แแ แจแแแแแ แแแฃแแแแแ แแแฆแแแฃแแ แคแแแแแก แแฆแแฌแแ แ แแ แแแ แแแแก แแ แซแแแแแแ แฉแแขแแแ แแแแกแแก BPG_PROG_LOAD
.
แแแ แแแแก แแแแฎแแแ แแแแ
BPF แแ แแแ แแแแแก แจแแฃแซแแแแ แแแฃแจแแแ "แแแ แ" แคแฃแแฅแชแแแแ - แแแ แแแแก แแแแฎแแแ แแแแ. แแก แแแแฎแแแ แ แคแฃแแฅแชแแแแ แกแแจแฃแแแแแแก แแซแแแแก BPF แแ แแแ แแแแแก แฌแแแแแ แแแแฆแแ แแแ แแแแก แกแขแ แฃแฅแขแฃแ แแแแ, แแแ แแแ แ แฃแแแแ แแ แแกแแแ แแแฃแแแแจแแ แแแแ "แ แแแแฃแ แกแแแงแแ แแก" - แจแแฅแแแแ perf แแแแแแแแแ, แแแแแแแขแ แแแแ แแแแ แแขแฃแ แ (แแแแแแแแแ, แแแแแขแแแแก แแแแแแแกแแแแ แแแแ) แแ แ.แจ.
แแแแแแแแ: bpf_get_smp_processor_id
โแแแแแแแแแ แกแฌแแแแแกโ แแแ แแแแแแแก แคแแ แแแแแจแ แแแแแแฎแแแแ แแแแฎแแแ แ แแ แ-แแ แแ แคแฃแแฅแชแแ. bpf_get_smp_processor_id()
, kernel/bpf/helpers.c
. แแก แแแ แฃแแแแก แแ แแชแแกแแ แแก แแแแแ แก, แ แแแแแแแแแช แแฃแจแแแแก BPF แแ แแแ แแแ, แ แแแแแแแช แแแก แแแฃแ แแแ. แแแแ แแ แฉแแแ แแ แแแแแแขแแ แแกแแแก แแแกแ แกแแแแแขแแแ, แ แแแแ แช แแก, แ แแ แแแกแ แแแแฎแแ แชแแแแแแ แแ แ แฎแแแก แแฆแแแก:
BPF_CALL_0(bpf_get_smp_processor_id)
{
return smp_processor_id();
}
BPF แแแแฎแแแ แ แคแฃแแฅแชแแแก แแแแแแ แขแแแแแ แแกแแแแกแแ Linux แกแแกแขแแแแก แแแ แแก แแแแแแ แขแแแแแแก. แแฅ, แแแแแแแแแ, แแแแกแแแฆแแ แฃแแแ แคแฃแแฅแชแแ, แ แแแแแกแแช แแ แแฅแแก แแ แแฃแแแแขแแแ. (แคแฃแแฅแชแแ, แ แแแแแแช แแฆแแแก, แแแฅแแแ, แกแแ แแ แแฃแแแแขแก, แแแแแกแแแฆแแ แแแ แแแแ แแก แแแแแงแแแแแแ BPF_CALL_3
. แแ แแฃแแแแขแแแแก แแแฅแกแแแแแฃแ แ แ แแแแแแแแ แแ แแก แฎแฃแแ.) แแฃแแชแ, แแก แแแแแแ แขแแแแก แแฎแแแแ แแแ แแแแ แแแฌแแแแ. แแแแ แ แแแฌแแแ แแ แแก แขแแแแก แกแขแ แฃแฅแขแฃแ แแก แแแแกแแแฆแแ แ struct bpf_func_proto
, แ แแแแแแช แจแแแชแแแก แแแแฎแแแ แ แคแฃแแฅแชแแแก แแฆแฌแแ แแก, แ แแแแแกแแช แแแ แแคแแแแขแแ แ แแกแแแก:
const struct bpf_func_proto bpf_get_smp_processor_id_proto = {
.func = bpf_get_smp_processor_id,
.gpl_only = false,
.ret_type = RET_INTEGER,
};
แแแแฎแแแ แ แคแฃแแฅแชแแแแแก แ แแแแกแขแ แแชแแ
แแแแกแแแแแก, แ แแ แแแแแ แแขแฃแแ แขแแแแก BPF แแ แแแ แแแแแแ แแแแแแงแแแแ แแก แคแฃแแฅแชแแ, แแแ แฃแแแ แแแแ แแแแกแขแ แแ แแ แแก, แแแแแแแแแ, แขแแแแกแแแแก BPF_PROG_TYPE_XDP
แคแฃแแฅแชแแ แแแแแกแแแฆแแ แแแ แแแ แแแจแ xdp_func_proto
, แ แแแแแแช แแแแฎแแแ แ แคแฃแแฅแชแแแก ID-แแแ แแแแกแแแฆแแ แแแก, แแฎแแ แก แฃแญแแ แก แแฃ แแ แ XDP แแ แคแฃแแฅแชแแแก. แฉแแแแ แคแฃแแฅแชแแแ
static const struct bpf_func_proto *
xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
switch (func_id) {
...
case BPF_FUNC_get_smp_processor_id:
return &bpf_get_smp_processor_id_proto;
...
}
}
BPF แแ แแแ แแแแก แแฎแแแ แขแแแแแ "แแแแกแแแฆแแ แฃแแแ" แคแแแแจแ include/linux/bpf_types.h
BPF_PROG_TYPE
. แแแแกแแแฆแแ แฃแแแ แแ แญแงแแแแแจแ, แ แแแแแ แแก แแ แแก แแแแแแฃแ แ แแแแแแ แขแแแ, แฎแแแ C แแแแก แขแแ แแแแแแจแ แแแขแแแแก แกแขแ แฃแฅแขแฃแ แแแแก แแแแแ แแแแ แแแแก แแแแแแ แขแแแ แฎแแแแ แกแฎแแ แแแแแแแแจแ. แแแ แซแแ, แคแแแแจแ kernel/bpf/verifier.c
แงแแแแ แแแแแแ แขแแแ แคแแแแแแแ bpf_types.h
แแแแแแงแแแแแ แกแขแ แฃแฅแขแฃแ แแแแก แแแกแแแแก แจแแกแแฅแแแแแแ bpf_verifier_ops[]
:
static const struct bpf_verifier_ops *const bpf_verifier_ops[] = {
#define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type)
[_id] = & _name ## _verifier_ops,
#include <linux/bpf_types.h>
#undef BPF_PROG_TYPE
};
แแแฃ, แแแแแแฃแแ แขแแแแก BPF แแ แแแ แแแแกแแแแก, แแแแแแแแฃแแแ แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแก แแแแแแแแ struct bpf_verifier_ops
, แ แแแแแแช แแแแชแแแแแแแแฃแแแ แแแแจแแแแแแแแ _name ## _verifier_ops
, แ.แ. xdp_verifier_ops
แแแแกแแแแก xdp
... แกแขแ แฃแฅแขแฃแ แ xdp_verifier_ops
net/core/filter.c
แจแแแแแแแแแ แแ:
const struct bpf_verifier_ops xdp_verifier_ops = {
.get_func_proto = xdp_func_proto,
.is_valid_access = xdp_is_valid_access,
.convert_ctx_access = xdp_convert_ctx_access,
.gen_prologue = bpf_noop_prologue,
};
แแฅ แฉแแแ แแฎแแแแแ แฉแแแแก แแแชแแแ แคแฃแแฅแชแแแก xdp_func_proto
, แ แแแแแแช แแแฃแจแแแแแก แแแ แแคแแแแขแแ แก แงแแแแ แฏแแ แแ, แ แแชแ แแก แแแแแฌแแแแแก แจแแฎแแแแแ แ แแฆแแชแแแแ แ แคแฃแแฅแชแแแแ BPF แแ แแแ แแแแก แจแแแแแ, แแฎ verifier.c
แแแแแ แจแแแฎแแแแ, แแฃ แ แแแแ แแงแแแแแก แฐแแแแแแขแฃแ แ BPF แแ แแแ แแแ แคแฃแแฅแชแแแก bpf_get_smp_processor_id
. แแแแกแแแแแก แฉแแแ แแแแแแแฌแแ แ แแ แแแ แแแแก แฉแแแแ แฌแแแ แแแแงแแคแแแแแแแแ แจแแแแแแแแแ แแ:
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
SEC("xdp/simple")
int simple(void *ctx)
{
if (bpf_get_smp_processor_id() != 0)
return XDP_DROP;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";
แกแขแ แแขแแแแ bpf_get_smp_processor_id
<bpf/bpf_helper_defs.h>
แแแแแแแแแแแแ libbpf
แ แแแแ แช
static u32 (*bpf_get_smp_processor_id)(void) = (void *) 8;
แแแฃ bpf_get_smp_processor_id
แแ แแก แคแฃแแฅแชแแแก แแแฉแแแแแแแแ, แ แแแแแก แแแแจแแแแแแแ แแ แแก 8, แกแแแแช 8 แแ แแก แแแแจแแแแแแแ BPF_FUNC_get_smp_processor_id
แขแแแ enum bpf_fun_id
, แ แแแแแแช แฉแแแแแแแก แแ แแก แแแแกแแแฆแแ แฃแแ แคแแแแจแ vmlinux.h
(แคแแแแ bpf_helper_defs.h
แแแ แแแจแ แแแแแ แแ แแแแ แกแแ แแแขแ, แแแแขแแ "แฏแแแแกแแฃแ แ" แแแแ แแแ แแแ แแแ). แแก แคแฃแแฅแชแแ แแ แแฆแแแก แแ แแฃแแแแขแแแก แแ แแแ แฃแแแแก แขแแแแก แแแแจแแแแแแแแก __u32
. แ แแแแกแแช แฉแแแ แแแขแแ แแแ แแแก แฉแแแแก แแ แแแ แแแแจแ, clang
แฅแแแแก แแแกแขแ แฃแฅแชแแแก BPF_CALL
"แกแฌแแ แ แขแแแ" แแแแแ แจแแแแแแแแแ แแ แแแ แแแ แแ แแแแแแฎแแแแ แแแแงแแคแแแแแแก xdp/simple
:
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ llvm-objdump -D --section=xdp/simple xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: bf 01 00 00 00 00 00 00 r1 = r0
2: 67 01 00 00 20 00 00 00 r1 <<= 32
3: 77 01 00 00 20 00 00 00 r1 >>= 32
4: b7 00 00 00 02 00 00 00 r0 = 2
5: 15 01 01 00 00 00 00 00 if r1 == 0 goto +1 <LBB0_2>
6: b7 00 00 00 01 00 00 00 r0 = 1
0000000000000038 <LBB0_2>:
7: 95 00 00 00 00 00 00 00 exit
แแแ แแแ แกแขแ แแฅแแแจแ แฉแแแ แแฎแแแแแ แแแกแขแ แฃแฅแชแแแแก call
, แแแ แแแแขแ แ IMM
แ แแแแแแช แฃแแ แแก 8-แก แแ SRC_REG
- แแฃแแ. แแแ แแคแแแแขแแ แแก แแแแ แแแแแงแแแแแฃแแ ABI แจแแแแแฎแแแแแก แแแแแฎแแแ, แแก แแ แแก แแแ แ แแแแฎแแแ แ แคแฃแแฅแชแแแก แแแแแ แ แ แแแแ. แแแกแ แแแจแแแแแก แจแแแแแ, แแแแแแ แแแ แขแแแแ. แแแแแ แฃแแแ แฆแแ แแแฃแแแแ แ แแแกแขแ แแแแ r0
แแแแแฌแแ แ r1
แฎแแแ 2,3 แกแขแ แแฅแแแแ แแก แแแ แแแแฅแแแแแ แขแแแแ u32
โ แแแแ 32 แแแขแ แแแกแฃแคแแแแแแฃแแแ. 4,5,6,7 แฎแแแแแแ แแแแ แฃแแแแ 2 (XDP_PASS
) แแ 1 (XDP_DROP
) แแแแกแแ แแแฎแแแแแ, แแแแฎแแแ แ แคแฃแแฅแชแแแ 0 แฎแแแแแแ แแแแแ แฃแแ แแฃแแแแแแ แแฃ แแ แ-แแฃแแแแแแ แแแแจแแแแแแแ.
แแแแแ แแแแแแชแแแแ แกแแแฃแแแ แ แแแแ: แฉแแขแแแ แแแ แแ แแแ แแแ แแ แจแแฎแแแแ แแแแแแแแแแก 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
แแแ แแ, แแแ แแคแแแแขแแ แแ แแแแแ แกแฌแแ แ แแแ แแแแก แแแแฎแแแ แ.
แแแแแแแแ: แแ แแฃแแแแขแแแแก แแแชแแแ แแ แแแแแก แแ แแแ แแแแก แแแจแแแแ!
แแแจแแแแแก แแแแแก แแแแฎแแแ แ แงแแแแ แคแฃแแฅแชแแแก แแฅแแก แแ แแขแแขแแแ
u64 fn(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)
แแแแฎแแแ แ แคแฃแแฅแชแแแแแก แแแ แแแแขแ แแแ แแแแแแชแแแ แ แแแกแขแ แแแจแ r1
-r5
, แแ แแแแจแแแแแแแ แแแแ แฃแแแแแ แ แแแกแขแ แจแ r0
. แแ แแ แกแแแแแก แคแฃแแฅแชแแแแ, แ แแแแแแแช แแฆแแแแ แฎแฃแแแ แแแข แแ แแฃแแแแขแก แแ แแแแ แแฎแแ แแแญแแ แ แแ แแ แแก แแแกแแแแแแแแ แแแแแแแแจแ.
แแแแแ แจแแแฎแแแแ แแแ แแแแก แแฎแแ แแแแฎแแแ แแก แแ แ แแแแ แแแแแกแชแแแก BPF แแแ แแแแขแ แแแก. แแแแแแแฌแแ แแ xdp-simple.bpf.c
แจแแแแแแแแแ แแ (แแแแแ แฉแแแ แกแขแ แแฅแแแแแ แแ แจแแชแแแแแ):
SEC("xdp/simple")
int simple(void *ctx)
{
bpf_printk("running on CPU%un", bpf_get_smp_processor_id());
return XDP_PASS;
}
แฉแแแแ แแ แแแ แแแ แแแญแแแแก CPU-แก แแแแแ แก, แ แแแแแแแช แแก แแฃแจแแแแก. แแแแแ แจแแแแแแแแแ แแ แจแแแฎแแแแ แแแแก:
$ llvm-objdump -D --section=xdp/simple --no-show-raw-insn xdp-simple.bpf.o
0000000000000000 <simple>:
0: r1 = 10
1: *(u16 *)(r10 - 8) = r1
2: r1 = 8441246879787806319 ll
4: *(u64 *)(r10 - 16) = r1
5: r1 = 2334956330918245746 ll
7: *(u64 *)(r10 - 24) = r1
8: call 8
9: r1 = r10
10: r1 += -24
11: r2 = 18
12: r3 = r0
13: call 6
14: r0 = 2
15: exit
0-7 แกแขแ แแฅแแแแแจแ แแฌแแ แ แกแขแ แแฅแแแก running on CPU%un
, แจแแแแแ แแ แแ-8 แกแขแ แแฅแแแแ แแแฌแแ แแแแแ แแแชแแแแก bpf_get_smp_processor_id
. 9-12 แกแขแ แแฅแแแแแแ แแแแแแแแแ แแแแฎแแแ แ แแ แแฃแแแแขแแแก bpf_printk
- แ แแแแกแขแ แแแ r1
, r2
, r3
. แ แแขแแ แแ แแก แกแแแ แแแแแแแ แแ แแ แ แแ แ? แแแแขแแ แ แแ bpf_printk
- bpf_trace_printk
, แ แแแแแแช แฃแแแ แแแแแ แแก แคแแ แแแขแแก แกแขแ แแฅแแแแก แแแแ.
แแฎแแ แแแแแแแขแแ แ แแแแแแแแ แกแขแ แแฅแแแ xdp-simple.c
แ แแแ แฉแแแแ แแ แแแ แแแ แแแฃแแแแจแแ แแแก แแแขแแ แคแแแกแก lo
แแ แแแ แแแ แแแแฌแงแ!
$ cat xdp-simple.c
#include <linux/if_link.h>
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
__u32 flags = XDP_FLAGS_SKB_MODE;
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
bpf_set_link_xdp_fd(1, -1, flags);
bpf_set_link_xdp_fd(1, bpf_program__fd(obj->progs.simple), flags);
cleanup:
xdp_simple_bpf__destroy(obj);
}
แแฅ แฉแแแ แแแงแแแแแ แคแฃแแฅแชแแแก bpf_set_link_xdp_fd
, แ แแแแแแช แแแแแจแแ แแแก BPF แแ แแแ แแแแแก, แ แแแแ แแชแแ XDP, แฅแกแแแฃแ แแแขแแ แคแแแกแแแแแ. แฉแแแ แแแแแคแแฅแกแแ แแ แแแขแแ แคแแแกแแก แแแแแ แ lo
, แ แแแแแแช แงแแแแแแแแก แแ แแก 1. แฉแแแ แแ แฏแแ แแแกแ แฃแแแแ แคแฃแแฅแชแแแก, แ แแ แฏแแ แแแแจแแ แแแ แซแแแแ แแ แแแ แแแแก, แแฃ แแก แแงแ แแแแแแ แแแฃแแ. แแแแแแแแแกแฌแแแแ, แ แแ แแฎแแ แฉแแแ แแ แแแญแแ แแแแ แแแแแฌแแแแ pause
แแ แฃแกแแกแ แฃแแ แแแ แงแฃแแ: แฉแแแแ แฉแแแขแแแ แแแแ แแ แแแ แแแ แแแแแแ, แแแแ แแ BPF แแ แแแ แแแ แแ แแแแแแ แแแแ, แ แแแแแ แแก แแแแแแจแแ แแแฃแแแ แแแแแแแแก แฌแงแแ แแกแแแ. แฌแแ แแแขแแแฃแแ แฉแแแแขแแแ แแแแกแ แแ แแแแแแจแแ แแแแก แจแแแแแ, แแ แแแ แแแ แแแแฅแแแแแแแ แแแแแแฃแแ แฅแกแแแแก แแแแแขแแกแแแแก, แ แแแแแแช แจแแแแแแก lo
.
แแแแแแแฌแแ แแ แแ แแแ แแแ แแ แแแแแแฎแแแแ แแแขแแ แคแแแกแก 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
แฉแแแ แแแแ แแแแแแฌแแ แแแ แแ แแแ แแแ แแฅแแก ID 669 แแ แแแแแ ID-แก แแฎแแแแแ แแแขแแ แคแแแกแแ lo
. แฉแแแ แแแแแแแแแแแแแ แ แแแแแแแแ แแแแแขแก 127.0.0.1
(แแแแฎแแแแ + แแแกแฃแฎแ):
$ ping -c1 localhost
แแ แแฎแแ แแแแแ แจแแแฎแแแแ แแแแแ แแแแก แแแ แขแฃแแแฃแ แ แคแแแแแก แจแแแแแ แกแก /sys/kernel/debug/tracing/trace_pipe
, แ แแแแแจแแช bpf_printk
แฌแแ แก แแแแแก แแแกแแฏแแแก:
# 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
แแ แ แแแแแขแ แแแคแแฅแกแแ แแ lo
แแ แแแแฃแจแแแแ CPU0-แแ - แฉแแแแ แแแ แแแแ แกแ แฃแแคแแกแแแแแ แฃแแแ แ BPF แแ แแแ แแแ แแฃแจแแแแแ!
แแฆแกแแแแจแแแแแ, แ แแ bpf_printk
แขแงแฃแแแแ แแ แฌแแ แก แแแแแ แแแแก แคแแแแจแ: แแก แแ แแ แแก แงแแแแแแ แฌแแ แแแขแแแฃแแ แแแแฎแแแ แ แฌแแ แแแแแแจแ แแแแแกแแงแแแแแแแ, แแแแ แแ แฉแแแแ แแแแแแ แแงแ แ แแฆแแช แแแ แขแแแแก แฉแแแแแแ.
แ แฃแแแแแ แฌแแแแแ BPF แแ แแแ แแแแแแแแ
แแแแแแแแ: แ แฃแแแก แแแแแงแแแแแ BPF แแ แแแ แแแแแแ
แฌแแแ แแแแงแแคแแแแแแแจแ แแแกแฌแแแแแ แ แฃแฅแแแแก แจแแฅแแแ แแ แแแแแงแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ, แแฎแแ แแ แแแแแ แแแแแแฎแแแแ แแแ แแแแก แแแฌแแแก. แแแแแฌแงแแ, แ แแแแ แช แงแแแแแแแแก, แแแแแแแแแ. แแแแแ แแแแแแแฌแแ แแ แฉแแแแ แแ แแแ แแแ xdp-simple.bpf.c
แจแแแแแแแแแ แแ:
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, 8);
__type(key, u32);
__type(value, u64);
} woo SEC(".maps");
SEC("xdp/simple")
int simple(void *ctx)
{
u32 key = bpf_get_smp_processor_id();
u32 *val;
val = bpf_map_lookup_elem(&woo, &key);
if (!val)
return XDP_ABORTED;
*val += 1;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";
แแ แแแ แแแแก แแแกแแฌแงแแกแจแ แฉแแแ แแแแแแแขแแ แ แฃแแแก แแแแแแ แขแแแ woo
: แแก แแ แแก 8 แแแแแแแขแแแแ แแแกแแแ, แ แแแแแแช แแแแฎแแแก แแกแแแแก แแแแจแแแแแแแแแก u64
(C-แจแ แฉแแแ แแแแแกแแแฆแแ แแแ แแกแแ แแแกแแแก, แ แแแแ แช u64 woo[8]
). แแ แแแ แแแแจแ "xdp/simple"
แฉแแแ แแแฆแแแ แแแแแแแแ แ แแ แแชแแกแแ แแก แแแแแ แก แชแแแแแจแ key
แจแแแแแ แแ แแแแฎแแแ แ แคแฃแแฅแชแแแก แแแแแงแแแแแแ bpf_map_lookup_element
แแแฆแแแ แแแฉแแแแแแแแก แแแกแแแแก แจแแกแแแแแแก แฉแแแแฌแแ แแ, แ แแแแแกแแช แแแ แแแ แแ แแแ. แ แฃแกแฃแแแ แแแแแ แแแแ: แฉแแแ แแแแแแแ แแจแแแ แกแขแแขแแกแขแแแแก, แ แแแแแแแแแช CPU แแแฃแจแแแแแก แจแแแแแแแแ แแแแแขแแแก. แแชแแแแ แแ แแแ แแแแก แแแจแแแแ:
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ 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
แแแแแ แจแแแแแแฌแแแ, แ แแ แแก แแแแแแจแแ แแแฃแแแ 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 108
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
แแฎแแ แแแแแ แจแแแฎแแแแ แแแกแแแแก แจแแแแแ แกแก:
$ sudo bpftool map dump name woo
[
{ "key": 0, "value": 0 },
{ "key": 1, "value": 400 },
{ "key": 2, "value": 0 },
{ "key": 3, "value": 0 },
{ "key": 4, "value": 0 },
{ "key": 5, "value": 0 },
{ "key": 6, "value": 0 },
{ "key": 7, "value": 46400 }
]
แแแแฅแแแก แงแแแแ แแ แแชแแกแ แแแแฃแจแแแแ CPU7-แแ. แฉแแแแแแแก แแก แแ แแ แแก แแแแจแแแแแแแแแ, แแแแแแ แแ, แ แแ แแ แแแ แแแ แแฃแจแแแแก แแ แฉแแแ แแแแกแแแก, แ แแแแ แแแแแฆแแ แ แฃแฅแแแ BPF แแ แแแ แแแแแแแแ - แแแแแงแแแแแแ ั
ะตะปะฟะตัะพะฒ bpf_mp_*
แแแกแขแแแฃแ แ แแแแแฅแกแ
แแกแ แ แแ, แ แฃแแแแ แฌแแแแแ แจแแแแแซแแแ BPF แแ แแแ แแแแแแ แแกแแแแกแ แแแ แแแแก แแแแแงแแแแแแ
val = bpf_map_lookup_elem(&woo, &key);
แกแแแแช แแแแฎแแแ แ แคแฃแแฅแชแแ แแแแแแงแฃแ แแแ
void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)
แแแแ แแ แฉแแแ แแแขแแ แแแ แแแฉแแแแแแแแก &woo
แฃแกแแฎแแแ แกแขแ แฃแฅแขแฃแ แแก struct { ... }
...
แแฃ แแแแแแฎแแแแแ แแ แแแ แแแแก แแกแแแแแแ แก, แฉแแแ แแฎแแแแแ, แ แแ แแแแจแแแแแแแ &woo
แ แแแแฃแ แแ แแ แแ แแก แแแแกแแแฆแแ แฃแแ (แกแขแ แแฅแแแ 4):
llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
...
แแ แจแแแแก แแแแแแแแแแแแแแจแ:
$ 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
แแแแ แแ แแฃ แแแแแแฎแแแแแ แฃแแแ แแแขแแแ แแฃแ แแ แแแ แแแแก, แฉแแแ แแฎแแแแแ แแแฉแแแแแแแแก แกแฌแแ แ แ แฃแแแกแแแ (แกแขแ แแฅแแแ 4):
$ sudo bpftool prog dump x name simple
int simple(void *ctx):
0: (85) call bpf_get_smp_processor_id#114128
1: (63) *(u32 *)(r10 -4) = r0
2: (bf) r2 = r10
3: (07) r2 += -4
4: (18) r1 = map[id:64]
...
แแแ แแแแ, แจแแแแแซแแแ แแแแแกแแแแแ, แ แแ แฉแแแแ แฉแแแขแแแ แแแแ แแ แแแ แแแแก แแแจแแแแแก แแ แแก, แแแฃแแ &woo
แจแแแชแแแแ แ แแฆแแช แแแแแแแแแแแ libbpf
. แแแ แแแ แ แแแจแ, แฉแแแ แจแแแฎแแแแแ แแแแแกแแแแแก strace
:
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=8, max_entries=8, map_name="woo", ...}, 120) = 4
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="simple", ...}, 120) = 5
แฉแแแ แแแแก แแฎแแแแแ libbpf
แจแแฅแแแ แ แฃแแ woo
แแ แจแแแแแ แแแแแแแฌแแ แ แฉแแแแ แแ แแแ แแแ simple
. แแแแแ แฃแคแ แ แแแขแแแฃแ แแ แแแแแแฎแแแแ, แแฃ แ แแแแ แแขแแแ แแแแ แแ แแแ แแแแก:
- แแแ แ
xdp_simple_bpf__open_and_load
แคแแแแแแแxdp-simple.skel.h
- แ แแช แแฌแแแแก
xdp_simple_bpf__load
แคแแแแแแแxdp-simple.skel.h
- แ แแช แแฌแแแแก
bpf_object__load_skeleton
แคแแแแแแแlibbpf/src/libbpf.c
- แ แแช แแฌแแแแก
bpf_object__load_xattr
แกแแฅแแ แแแแแแกlibbpf/src/libbpf.c
แแแแ แคแฃแแฅแชแแ, แกแฎแแ แกแแแแแฎแแแแแ แแ แแแ, แแแ แแแแแก bpf_object__create_maps
, แ แแแแแแช แฅแแแแก แแ แฎแกแแแก แแ แกแแแฃแ แ แฃแแแแก, แแฅแชแแแก แแแ แคแแแแแก แแฆแฌแแ แแ. (แแก แแ แแก แกแแแแช แฉแแแ แแฎแแแแแ BPF_MAP_CREATE
แแแแแแแแแแจแ strace
.) แจแแแแแ แคแฃแแฅแชแแ แแแแแแซแแฎแแแ bpf_object__relocate
แแ แแก แแ แแก แแก, แแแแช แแแแแแขแแ แแกแแแก, แ แแแแแ แแแแฎแกแแแก แแก, แ แแช แแแแฎแแ woo
แแแแแแแแแแแแแก แชแฎแ แแแจแ. แแแกแ แจแแกแฌแแแแแ, แฉแแแ แกแแแแแแแ แแฆแแแแฉแแแแแแ แคแฃแแฅแชแแแจแ bpf_program__relocate
, แ แแแแแแช
case RELO_LD64:
insn[0].src_reg = BPF_PSEUDO_MAP_FD;
insn[0].imm = obj->maps[relo->map_idx].fd;
break;
แแกแ แ แแ, แฉแแแ แแแฆแแแ แฉแแแแก แแแแแแแแแแก
18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
แแ แจแแชแแแแแ แแแกแจแ แแ แกแแแฃแแ แฌแงแแ แแก แ แแแแกแขแ แ BPF_PSEUDO_MAP_FD
แแ แแแ แแแแ IMM แฉแแแแ แ แฃแฅแแก แคแแแแแก แแฆแฌแแ แแกแแแแก แแ, แแฃ แแก แฃแแ แแก, แแแแแแแแแ, 0xdeadbeef
, แจแแแแแ แฉแแแ แแแแแฆแแแ แแแกแขแ แฃแฅแชแแแก
18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 ll
แแกแ แแแแแแแก แ แฃแฅแแก แแแคแแ แแแชแแ แแแแแ แแขแฃแ แแแขแแแ แแฃแ BPF แแ แแแ แแแแจแ. แแ แจแแแแฎแแแแแจแ, แ แฃแแ แจแแแซแแแแ แจแแแฅแแแแก แแแแแงแแแแแแ BPF_MAP_CREATE
แแ แแแแฎแกแแ ID-แแก แแแแแงแแแแแแ BPF_MAP_GET_FD_BY_ID
.
แกแฃแ, แแแแแงแแแแแแกแแก libbpf
แแแแแ แแแแ แแกแแแแ:
- แจแแแแแแแก แแ แแก, แฉแแแแฌแแ แแแ แแฅแแแแแ แแแแแขแแแแก แชแฎแ แแแจแ แ แฃแแแแแก แแแฃแแแแแกแแแแก
libbpf
แฎแกแแแก ELF แแแแแฅแขแแแแก แฌแแแแก, แแแฃแแแแก แงแแแแ แแแแแงแแแแแฃแ แ แฃแฅแแก แแ แฅแแแแก แแแแแแแก แคแแแแแก แแฆแฌแแ แแแก- แคแแแแแก แแฆแฌแแ แแแ แแขแแแ แแแแ แแแ แแแจแ, แ แแแแ แช แแแกแขแ แฃแฅแชแแแก แแแฌแแแ
LD64
แ แแแแ แช แแฅแแแ แฌแแ แแแแแแแแแ, แฌแแ แแแแแ แแแแ แแ แแ แฉแแแ แฃแแแ แฉแแแแฎแแแแ แแแ แแแจแ. แกแแแแแแแแ แแ, แฉแแแ แแแแฅแแก แแแแแจแแแแ - แฉแแแฌแแ แแ แแแแจแแแแแแแ BPF_PSEUDO_MAP_FD
แฌแงแแ แแก แ แแแแกแขแ แจแ แแ แฉแแแ แจแแแแแซแแแ แแแแแแ แฎแแ แแแ, แ แแช แแแแแแงแแแแก แงแแแแ แฌแแแแแแแแก แฌแแแแแแแ - kernel/bpf/verifier.c
, แกแแแแช แแแแแแกแฎแแแแแแแแ แกแแฎแแแแก แแฅแแแ แคแฃแแฅแชแแ แชแแแแก แคแแแแแก แแฆแฌแแ แก แขแแแแก แกแขแ แฃแฅแขแฃแ แแก แแแกแแแแ แแแ struct bpf_map
:
static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) {
...
f = fdget(insn[0].imm);
map = __bpf_map_get(f);
if (insn->src_reg == BPF_PSEUDO_MAP_FD) {
addr = (unsigned long)map;
}
insn[0].imm = (u32)addr;
insn[1].imm = addr >> 32;
(แกแ แฃแแ แแแแ แจแแแแซแแแแ แแฎแแแแ
- แแ แแแ แแแแก แฉแแขแแแ แแแแกแแก แแแ แแคแแแแขแแ แ แแแแฌแแแแก แ แฃแแแก แกแฌแแ แแ แแแแแงแแแแแแก แแ แฌแแ แก แจแแกแแแแแแกแ แกแขแ แฃแฅแขแฃแ แแก แแแกแแแแ แแก
struct bpf_map
ELF แแแแแ แแก แฉแแแแขแแแ แแแแกแแก แแแแแงแแแแแแ libbpf
แแแแแ แแแแ แ แ แแ แฎแแแแ, แแแแ แแ แแแแก แกแฎแแ แกแขแแขแแแแจแ แแแแแแฎแแแแแ.
แแ แแแ แแแแแแกแ แแ แ แฃแฅแแแแก แฉแแขแแแ แแแ libbpf-แแก แแแ แแจแ
แ แแแแ แช แแแแแแ แแแ, แแฅ แแ แแก แแแแแแแแ แแแแแฎแแแแแแแกแแแแก, แ แแแแแแกแแช แกแฃแ แ แแชแแแแแ แ แแแแ แจแแฅแแแแ แแ แฉแแขแแแ แแแ แแ แแแ แแแ, แ แแแแแแช แแงแแแแแก แ แฃแแแแก แแแฎแแแ แแแแก แแแ แแจแ libbpf
. แแก แจแแแซแแแแ แแงแแก แกแแกแแ แแแแแ, แ แแแแกแแช แแฃแจแแแแ แแกแแ แแแ แแแแจแ, แ แแแแแกแแแแกแแช แแ แจแแแแซแแแแ แจแแฅแแแแ แแแแแแแแแแฃแแแแแแ, แแ แจแแแแแฎแแ แงแแแแแ แแแฌแแแ, แแ แฌแแ แ แแ แแแ แแแแก, แ แแแแ แแชแแ ply
แแแแแแแก แแแกแแแแแแแแแแแ, แฉแแแ แแแแแแฌแแ แ แฉแแแแก แแแแแแแแก แแ แแแแแแแแกแแแแก xdp-simple
. แแ แแแแแแแแจแ แแแแฎแแแฃแแ แแ แแแ แแแแก แกแ แฃแแ แแ แแแแแ แแแคแแ แแแแแฃแแ แแแแ แจแแแแซแแแแ แแฎแแแแ แแฅ
แฉแแแแ แแแแแชแฎแแแแก แแแแแแ แแกแแแแ:
- แจแแฅแแแแแ แขแแแแก แ แฃแแ
BPF_MAP_TYPE_ARRAY
แแ แซแแแแแแก แแแแแงแแแแแแBPF_MAP_CREATE
, - แจแแฅแแแแแ แแ แแแ แแแ, แ แแแแแแช แแงแแแแแก แแ แ แฃแแแก,
- แแแแแแแจแแ แแ แแ แแแ แแแ แแแขแแ แคแแแกแแแ
lo
,
แ แแช แแแแแแแแฃแ แแ แแแแ แแแแแแ แ แแแแ แช
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);
}
แแฅ map_create
แฅแแแแก แ แฃแแแก แแกแแแ, แ แแแแ แช แฉแแแ แแแแแแแแแ แแแ แแแ แแแแแแแแจแ แกแแกแขแแแฃแ แ แแแ แแก แจแแกแแฎแแ bpf
- โแแแ แแแ, แแแฎแแแ แแแแแแแแแแ แแฎแแแ แ แฃแแ 8 แแแแแแแขแแกแแแ แจแแแแแแ แ แแแกแแแแก แกแแฎแแ, แ แแแแ แแชแแ __u64
แแ แแแแแแ แฃแแ แคแแแแแก แแฆแแฌแแ แ":
static int map_create()
{
union bpf_attr attr;
memset(&attr, 0, sizeof(attr));
attr.map_type = BPF_MAP_TYPE_ARRAY,
attr.key_size = sizeof(__u32),
attr.value_size = sizeof(__u64),
attr.max_entries = 8,
strncpy(attr.map_name, "woo", sizeof(attr.map_name));
return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
}
แแ แแแ แแแ แแกแแแ แแแแแแแ แแขแแแ แแแแ:
static int prog_load(int map_fd)
{
union bpf_attr attr;
struct bpf_insn insns[] = {
...
};
memset(&attr, 0, sizeof(attr));
attr.prog_type = BPF_PROG_TYPE_XDP;
attr.insns = ptr_to_u64(insns);
attr.insn_cnt = sizeof(insns)/sizeof(insns[0]);
attr.license = ptr_to_u64("GPL");
strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
}
แ แแฃแแ แแแฌแแแ prog_load
แแ แแก แฉแแแแ BPF แแ แแแ แแแแก แแแแแแ แขแแแ, แ แแแแ แช แกแขแ แฃแฅแขแฃแ แแแแก แแแกแแแ struct bpf_insn insns[]
. แแแแ แแ แ แแแแแ แฉแแแ แแแงแแแแแ แแ แแแ แแแแก, แ แแแแแแช แแแแฅแแก C-แจแ, แจแแแแแซแแแ แชแแขแ แแแแแขแงแฃแแ:
$ llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
7: b7 01 00 00 00 00 00 00 r1 = 0
8: 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2>
9: 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0)
10: 07 01 00 00 01 00 00 00 r1 += 1
11: 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1
12: b7 01 00 00 02 00 00 00 r1 = 2
0000000000000068 <LBB0_2>:
13: bf 10 00 00 00 00 00 00 r0 = r1
14: 95 00 00 00 00 00 00 00 exit
แกแแแ แแ แฏแแแจแ, แฉแแแ แฃแแแ แแแแฌแแ แแ 14 แแแกแขแ แฃแฅแชแแ แแกแแแแกแ แกแขแ แฃแฅแขแฃแ แแแแก แกแแฎแแ struct bpf_insn
(แ แฉแแแ: แแแฆแแ แแแแแแกแแงแ แแแ แแแแแแแ, แฎแแแแฎแแ แฌแแแแแแฎแแ แแแกแขแ แฃแฅแชแแแแแก แแแแงแแคแแแแแ, แแแฎแกแแแแ linux/bpf.h
linux/bpf_common.h
struct bpf_insn insns[]
แแ แแ แกแแแฃแแแ แ):
struct bpf_insn insns[] = {
/* 85 00 00 00 08 00 00 00 call 8 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 8,
},
/* 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0 */
{
.code = BPF_MEM | BPF_STX,
.off = -4,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_10,
},
/* bf a2 00 00 00 00 00 00 r2 = r10 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_10,
.dst_reg = BPF_REG_2,
},
/* 07 02 00 00 fc ff ff ff r2 += -4 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_2,
.imm = -4,
},
/* 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll */
{
.code = BPF_LD | BPF_DW | BPF_IMM,
.src_reg = BPF_PSEUDO_MAP_FD,
.dst_reg = BPF_REG_1,
.imm = map_fd,
},
{ }, /* placeholder */
/* 85 00 00 00 01 00 00 00 call 1 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 1,
},
/* b7 01 00 00 00 00 00 00 r1 = 0 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 0,
},
/* 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2> */
{
.code = BPF_JMP | BPF_JEQ | BPF_K,
.off = 4,
.src_reg = BPF_REG_0,
.imm = 0,
},
/* 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0) */
{
.code = BPF_MEM | BPF_LDX,
.off = 0,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_1,
},
/* 07 01 00 00 01 00 00 00 r1 += 1 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 1,
},
/* 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1 */
{
.code = BPF_MEM | BPF_STX,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* b7 01 00 00 02 00 00 00 r1 = 2 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 2,
},
/* <LBB0_2>: bf 10 00 00 00 00 00 00 r0 = r1 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* 95 00 00 00 00 00 00 00 exit */
{
.code = BPF_JMP | BPF_EXIT
},
};
แกแแแแ แฏแแจแ แแแแแแแก, แแแแช แแแแแแ แแ แแแฌแแ แ แแก - แแแแแแแ map_fd
.
แฉแแแแก แแ แแแ แแแแจแ แแแ แฉแ แแแแแ แแ แแ แแแฃแ แแแแแแแ แแแฌแแแ - xdp_attach
. แกแแแฌแฃแฎแแ แแ, แแกแแแ แแ แแแ แแแแแ, แ แแแแ แแชแแ XDP, แจแแฃแซแแแแแแแ แกแแกแขแแแฃแ แ แแแ แแก แแแแแงแแแแแแ bpf
. แแแแแแแแแแ, แ แแแแแแแแช แจแแฅแแแแก BPF แแ XDP, แแงแแแแ แแแแแแ Linux แกแแแแแแแแแแแกแแแ, แ แแช แแแจแแแแก, แ แแ แแแ แแงแแแแแแแแ แแแแแแแก แงแแแแแแ แแแชแแแแก (แแแแ แแ แแ แ แแแ แแแแฃแ แ แฎแแแฎแ) แแแขแแ แคแแแกแ แแแ แแแแแ แฃแ แแแแ แแแแแกแแแแก: xdp_attach
แแแแแ แแแก แแแแก libbpf
, แแแ แซแแ, แคแแแแแแแ netlink.c
แแแแแแ แแงแแก แแฅแแแแ แแแแ แซแแแแแ netlink แกแแแแขแแแแก แกแแแงแแ แแจแ
แแแฎแกแแแแ netlink แกแแแแขแแก แขแแแ NETLINK_ROUTE
:
int netlink_open(__u32 *nl_pid)
{
struct sockaddr_nl sa;
socklen_t addrlen;
int one = 1, ret;
int sock;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock < 0)
err(1, "socket");
if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, &one, sizeof(one)) < 0)
warnx("netlink error reporting not supported");
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0)
err(1, "bind");
addrlen = sizeof(sa);
if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0)
err(1, "getsockname");
*nl_pid = sa.nl_pid;
return sock;
}
แแ แกแแแแขแแแแ แแแแแฎแฃแแแแ:
static int bpf_netlink_recv(int sock, __u32 nl_pid, int seq)
{
bool multipart = true;
struct nlmsgerr *errm;
struct nlmsghdr *nh;
char buf[4096];
int len, ret;
while (multipart) {
multipart = false;
len = recv(sock, buf, sizeof(buf), 0);
if (len < 0)
err(1, "recv");
if (len == 0)
break;
for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len);
nh = NLMSG_NEXT(nh, len)) {
if (nh->nlmsg_pid != nl_pid)
errx(1, "wrong pid");
if (nh->nlmsg_seq != seq)
errx(1, "INVSEQ");
if (nh->nlmsg_flags & NLM_F_MULTI)
multipart = true;
switch (nh->nlmsg_type) {
case NLMSG_ERROR:
errm = (struct nlmsgerr *)NLMSG_DATA(nh);
if (!errm->error)
continue;
ret = errm->error;
// libbpf_nla_dump_errormsg(nh); too many code to copy...
goto done;
case NLMSG_DONE:
return 0;
default:
break;
}
}
}
ret = 0;
done:
return ret;
}
แแแแแแแก, แแฅ แแ แแก แฉแแแแ แคแฃแแฅแชแแ, แ แแแแแแช แฎแกแแแก แกแแแแขแก แแ แแแแแแแแก แแแก แกแแแชแแแแฃแ แจแแขแงแแแแแแแแก, แ แแแแแแช แจแแแชแแแก แคแแแแแก แแฆแฌแแ แก:
static int xdp_attach(int ifindex, int prog_fd)
{
int sock, seq = 0, ret;
struct nlattr *nla, *nla_xdp;
struct {
struct nlmsghdr nh;
struct ifinfomsg ifinfo;
char attrbuf[64];
} req;
__u32 nl_pid = 0;
sock = netlink_open(&nl_pid);
if (sock < 0)
return sock;
memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
req.nh.nlmsg_type = RTM_SETLINK;
req.nh.nlmsg_pid = 0;
req.nh.nlmsg_seq = ++seq;
req.ifinfo.ifi_family = AF_UNSPEC;
req.ifinfo.ifi_index = ifindex;
/* started nested attribute for XDP */
nla = (struct nlattr *)(((char *)&req)
+ NLMSG_ALIGN(req.nh.nlmsg_len));
nla->nla_type = NLA_F_NESTED | IFLA_XDP;
nla->nla_len = NLA_HDRLEN;
/* add XDP fd */
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FD;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(int);
memcpy((char *)nla_xdp + NLA_HDRLEN, &prog_fd, sizeof(prog_fd));
nla->nla_len += nla_xdp->nla_len;
/* if user passed in any flags, add those too */
__u32 flags = XDP_FLAGS_SKB_MODE;
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FLAGS;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(flags);
memcpy((char *)nla_xdp + NLA_HDRLEN, &flags, sizeof(flags));
nla->nla_len += nla_xdp->nla_len;
req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);
if (send(sock, &req, req.nh.nlmsg_len, 0) < 0)
err(1, "send");
ret = bpf_netlink_recv(sock, nl_pid, seq);
cleanup:
close(sock);
return ret;
}
แแกแ แ แแ, แงแแแแแคแแ แ แแแแ แแ แแก แขแแกแขแแ แแแแกแแแแก:
$ cc nolibbpf.c -o nolibbpf
$ sudo strace -e bpf ./nolibbpf
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, map_name="woo", ...}, 72) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=15, prog_name="woo", ...}, 72) = 4
+++ exited with 0 +++
แแแแฎแแ, แฃแแแแจแแ แแแแ แแฃ แแ แ แฉแแแแ แแ แแแ แแแ 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
แแแแแ แแแแฃแแแแแแแ แแแแแแแ แแ แแแแแแฎแแแแ แ แฃแแแก:
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ sudo bpftool m dump name woo
key: 00 00 00 00 value: 90 01 00 00 00 00 00 00
key: 01 00 00 00 value: 00 00 00 00 00 00 00 00
key: 02 00 00 00 value: 00 00 00 00 00 00 00 00
key: 03 00 00 00 value: 00 00 00 00 00 00 00 00
key: 04 00 00 00 value: 00 00 00 00 00 00 00 00
key: 05 00 00 00 value: 00 00 00 00 00 00 00 00
key: 06 00 00 00 value: 40 b5 00 00 00 00 00 00
key: 07 00 00 00 value: 00 00 00 00 00 00 00 00
Found 8 elements
แ แ, แงแแแแแคแแ แ แแฃแจแแแแก. แกแฎแแแแ แจแแ แแก, แแแแแแแแแกแฌแแแแ, แ แแ แฉแแแแ แ แฃแแ แแแแแ แแแฉแแแแแแแ แแแแขแแแแก แกแแฎแแ. แแก แแแแแฌแแแฃแแแ แแแแ, แ แแ แแแแกแฎแแแแแแแ libbpf
แฉแแแ แแ แฉแแแขแแแ แแแ แขแแแแก แแแคแแ แแแชแแ (BTF). แแแแ แแ แแแแแ แแแขแก แจแแแแแ แฏแแ แแ แแแกแแฃแแ แแแ.
แแแแแแแแ แแแแก แแแกแขแ แฃแแแแขแแแ
แแ แแแแงแแคแแแแแแจแ แฉแแแ แจแแแฎแแแแแ BPF แแแแแแแแแ แแก แแแกแขแ แฃแแแแขแแ แแฃแแแก แแแแแแแแฃแ แแแแแแแฅแขแก.
แแแแแแแ แ แแ แแแฅแแแ, แแฅแแแ แแ แแญแแ แแแแแ แ แแแแ แแแแกแแแฃแแ แแแฃแแ BPF แแ แแแ แแแแแแก แจแแกแแฅแแแแแแ - BPF แแฃแจแแแแก แแแแแกแแแแ แฆแแ แกแแฃแ แแแแแฌแแแแแแก แแแ แแแแ แแ แแ แแแ แแแแแ แแแแแฃแแแ แแแแแงแแแแแแ clang
, แ แแแแแก แแแฌแแแแแ แจแแกแแซแแแแแแแ แแแแแขแแแแ. แแฃแแชแ, แแแแก แแแแ, แ แแ BPF แแแแฃแจแแแแแแก แแ แแชแแกแจแแ, แแแ แแแ แแ แแแกแขแ แฃแแแแขแแแ แแฃแแแแแแ แแชแแแแแ, แแฃ แแ แแกแฃแ แ BPF แแ แแแ แแแแแแก แแแฌแแ แ แแแซแแแแแแฃแแ แแแแแแแแแ 2019 แฌแแแแแ, แแแจแแ แแแแแฌแแแ แจแแแแแแ
llvm
/clang
pahole
- แแแกแ แแแ แแแ
bpftool
(แชแแแแแกแแแแก, แแก แแแแงแแคแแแแแ แแ แกแขแแขแแแก แงแแแแ แแแแแแแแ แแแจแแแแฃแแแ Debian 10-แแ.)
llvm/clang
BPF แแแแแแ แฃแแแ LLVM-แแแ แแ, แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแแแ แแ แแก BPF-แแก แแ แแแ แแแแแแก แจแแแแแแ แจแแกแแซแแแแแแแ gcc-แแก แแแแแงแแแแแแ, แงแแแแ แแแแแแแแ แ แแแแแแแแ แแแ แฎแแ แชแแแแแแแ LLVM-แกแแแแก. แแแแขแแ, แแแ แแแ แ แแแจแ, แฉแแแ แแแแจแแแแแ แแแแแแแแ แ แแแ แกแแแก clang
git-แแแ:
$ sudo apt install ninja-build
$ git clone --depth 1 https://github.com/llvm/llvm-project.git
$ mkdir -p llvm-project/llvm/build/install
$ cd llvm-project/llvm/build
$ cmake .. -G "Ninja" -DLLVM_TARGETS_TO_BUILD="BPF;X86"
-DLLVM_ENABLE_PROJECTS="clang"
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=Release
-DLLVM_BUILD_RUNTIME=OFF
$ time ninja
... ะผะฝะพะณะพ ะฒัะตะผะตะฝะธ ัะฟัััั
$
แแฎแแ แฉแแแ แจแแแแแซแแแ แจแแแแแแฌแแแ แแฃ แแ แ แงแแแแแคแแ แ แกแฌแแ แแ:
$ ./bin/llc --version
LLVM (http://llvm.org/):
LLVM version 11.0.0git
Optimized build.
Default target: x86_64-unknown-linux-gnu
Host CPU: znver1
Registered Targets:
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
(แจแแแ แแแแก แแแกแขแ แฃแฅแชแแ clang
แฉแแ แแแแ แแฆแแแฃแแ
แฉแแแ แแ แแแแแแแกแขแแแแ แแแ แแ แแแ แแแแแก, แ แแแแแแแช แแฎแแแฎแแ แจแแแฅแแแแแ, แแ แแแแ แฃแแ แแแแ แแแแแแแขแแแ แแแ PATH
, แแแแแแแแแ:
export PATH="`pwd`/bin:$PATH"
(แแก แจแแแซแแแแ แแแแแแขแแก .bashrc
แแ แชแแแแ แคแแแแจแ. แแแ แแแแ แแ แแแแแขแแ แแกแแแแก แ แแฆแแชแแแแก ~/bin/activate-llvm.sh
แแ แ แแชแ แกแแญแแ แแ แแแแแแแ . activate-llvm.sh
.)
แแแฐแแแ แแ BTF
แแแแฃแแแแฃแ แ pahole
แแแแแแงแแแแแ แแแ แแแแก แแแแแแกแแก BTF แคแแ แแแขแจแ แแแแแ แแแแก แแแคแแ แแแชแแแก แจแแกแแฅแแแแแแ. BTF แขแแฅแแแแแแแแก แแแขแแแแแแก แจแแกแแฎแแ แแ แกแขแแขแแแจแ แแ แแแแแแฎแแแแแ, แแแ แแ แแแแกแ, แ แแ แแก แแแกแแฎแแ แฎแแแแแแ แแ แแแแแแ แแแแแแแงแแแแ. แแกแ แ แแ, แแฃ แแฅแแแแ แแแ แแแแก แจแแฅแแแแก แแแแ แแแ, แฏแแ แแแจแแแแ pahole
(แแแ แแจแ pahole
แแฅแแแ แแแ แจแแซแแแแ แแแ แแแแก แแจแแแแแแก แแแ แแแแขแ แแ 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
แแแ แแแแแ BPF-แแก แแฅแกแแแ แแแแแขแแแแกแแแแก
BPF-แแก แจแแกแแซแแแแแแแแแแก แจแแกแฌแแแแแกแแก, แแกแฃแ แก แกแแแฃแแแ แ แแแ แแแแก แจแแแ แแแ. แแก, แแแแแแแ แ แแ แแแฅแแแ, แแ แแ แแก แแฃแชแแแแแแแ, แ แแแแแ แแฅแแแ แจแแซแแแแ BPF แแ แแแ แแแแแแก แจแแแแแแแก แแ แฉแแขแแแ แแแแก แแแแแฌแแแแแแก แแแ แแแแ, แแฃแแชแ, แกแแแฃแแแ แ แแแ แแแแก แแ แกแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแงแแแแ แฃแแฎแแแกแ BPF แคแฃแแฅแชแแแแ, แ แแแแแแแช แแฅแแแแก แแแแแฌแแแแแแจแ แแแแแฉแแแแแ แแแแแแแก แแแแแแแแแแแจแ. , แแ, แ แแแแ แช แแแแแแ แแ แแแแแ แแแแก แฎแแแกแแฌแงแแก แจแแแแฎแแแแแจแ, แฃแแฎแแแแก แแแแแแแแจแ แกแแแ แแแ แแ แแฅแแแแ แจแแคแฃแแฃแแ. แแกแแแ, แกแแแฃแแแ แ แแแ แแแ แฎแแแก แแ แซแแแแก, แ แแ แแแแจแแแแแแแแแแ แแฅแกแแแ แแแแแขแ แแแแแ.
แแแ แแแแก แแกแแจแแแแแแแ, แแแ แแแ แ แแแจแ, แกแแญแแ แแ แแแแแ แแแ แแแ แแ แแแแ แแช, แแแ แแแแก แแแแคแแแฃแ แแชแแแก แคแแแแ. BPF-แแ แแฅแกแแแ แแแแแขแแกแแแแก แจแแแแแซแแแ แแแแแแแงแแแแ แฉแแแฃแแแแ แแแ net
net-next
bpf
bpf-next
*-next
แแแ แแแแแ แฉแแแแแแแแแแแแแ แงแแแแแแ แแ แแกแขแแแแแฃแ แแ).
แแ แกแขแแขแแแก แคแแ แแแแแก แกแชแแแแแแ แกแแฃแแแ แ, แแฃ แ แแแแ แฃแแแ แแแ แแแ แแแ แแแแก แแแแคแแแฃแ แแชแแแก แคแแแแแแ - แแแ แแฃแแแแแ, แ แแ แแฅแแแ แแ แฃแแแ แแชแแ แ แแแแ แแแแแแแแ แแก, แแ
แฉแแแแขแแแ แแแ แแ แ-แแ แแ แแแแแ แแแชแแแฃแแ แแแ แแแ:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next
แจแแฅแแแแแ แแแแแแแแฃแ แ แกแแแฃแจแแ แแแ แแแแก แแแแคแแแฃแ แแชแแ:
$ cp /boot/config-`uname -r` .config
$ make localmodconfig
แฉแแ แแแ BPF แแแ แแแแขแ แแแ แคแแแแจแ .config
แแฅแแแแ แแ แฉแแแแแแ (แกแแแแ แแฃแแแ CONFIG_BPF
แฃแแแ แฉแแ แแฃแแ แแฅแแแแ, แ แแแแแ systemd แแงแแแแแก แแแก). แแฅ แแแชแแแฃแแแ แแ แกแขแแขแแแกแแแแก แแแแแงแแแแแฃแแ แแแ แแแแก แแแ แแแแขแแแแก แกแแ:
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
แจแแแแแ แฉแแแ แจแแแแแซแแแ แแแ แขแแแแ แแแแฌแงแแ แแ แแแแแแแกแขแแแแ แแ แแแแฃแแแแ แแ แแแ แแแ (แกแฎแแแแ แจแแ แแก, แแแ แแแแก แแฌแงแแแ แจแแแแซแแแแ แแฎแแแ แแฌแงแแแแแแก แแแแแงแแแแแแ clang
แแแแแขแแแแ CC=clang
):
$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install
แแ แแแแแขแแแ แแแ แแฎแแแ แแแ แแแแ (แแแแกแแแแก แแแงแแแแ kexec
แแแแแขแแแแ kexec-tools
):
v=5.8.0-rc6+ # ะตัะปะธ ะฒั ะฟะตัะตัะพะฑะธัะฐะตัะต ัะตะบััะตะต ัะดัะพ, ัะพ ะผะพะถะฝะพ ะดะตะปะฐัั v=`uname -r`
sudo kexec -l -t bzImage /boot/vmlinuz-$v --initrd=/boot/initrd.img-$v --reuse-cmdline &&
sudo kexec -e
bpftool
แกแขแแขแแแจแ แงแแแแแแ แฎแจแแ แแ แแแแแงแแแแแฃแแ แฃแขแแแแขแ แแฅแแแแ แฃแขแแแแขแ bpftool
, แแแฌแแแแแฃแแ, แ แแแแ แช Linux kernel-แแก แแแฌแแแ. แแก แแแฌแแ แแแแ แแ แแแแฎแแแ BPF แแแแแแแแแ แแแแก แแแแ BPF แแแแแแแแแ แแแแกแแแแก แแ แแแกแ แแแแแงแแแแแ แจแแกแแซแแแแแแแ แงแแแแ แขแแแแก BPF แแแแแฅแขแแก แกแแแแ แแแแแ - แแ แแแ แแแแแแก แฉแแขแแแ แแแ, แ แฃแฅแแแแก แจแแฅแแแ แแ แ แแแแฅแขแแ แแแ, BPF แแแแกแแกแขแแแแก แชแฎแแแ แแแแก แจแแกแฌแแแแ แแ แ.แจ. แจแแแแซแแแแ แแฎแแแแ แแแแฃแแแแขแแชแแ แฌแงแแ แแก แแแแแแแก แกแแฎแแ man แแแแ แแแแแกแแแแก
แแ แฌแแ แแก แแ แแก bpftool
แแแแแแแแ แแฎแแแแ RHEL, Fedora แแ Ubuntu-แกแแแแก (แแฎแแแแ, แแแแแแแแแ, bpftool
Debian-แจแ). แแแแ แแ แแฃ แฃแแแ แจแแฅแแแแแ แแฅแแแแ แแแ แแแ, แแแจแแ แแแจแแแแ bpftool
แขแแ แขแแแแ แแแ แขแแแ:
$ 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 ]
$
(แแฅ ${linux}
- แแก แแ แแก แแฅแแแแ แแแ แแแแก แแแ แแฅแขแแ แแ.) แแ แแ แซแแแแแแแแก แจแแกแ แฃแแแแแก แจแแแแแ bpftool
แจแแแ แแแแแแ แแแ แแฅแขแแ แแแจแ ${linux}/tools/bpf/bpftool
แแ แแก แจแแแซแแแแ แแแแแแขแแก แแแแแแก (แแแ แแแ แ แแแจแ แแแแฎแแแ แแแแแกแแแแก root
) แแ แฃแแ แแแแ แแแแแแแแ แแ /usr/local/sbin
.
แฒจแแแ แแแแแ bpftool
แฃแแฏแแแแกแแ แแแแแแงแแแแ แแก แฃแแแแแกแแแแแ clang
, แแฌแงแแแแแแ แ แแแแ แช แแแแแ แแฆแฌแแ แแแ แแ แจแแแแแฌแแแ แกแฌแแ แแ แแ แแก แแฃ แแ แ แแฌแงแแแแแ - แแแแแแแแแ, แแ แซแแแแแแก แแแแแงแแแแแแ
$ 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
...
แ แแแแแแช แแฉแแแแแแก, แ แแแแแ BPF แคแฃแแฅแชแแแแแ แฉแแ แแฃแแ แแฅแแแแก แแแ แแแจแ.
แกแฎแแแแ แจแแ แแก, แฌแแแ แแ แซแแแแแ แจแแแซแแแแ แจแแกแ แฃแแแแก แ แแแแ แช
# bpftool f p k
แแก แแแแแแแ แแแแแขแแแแ แแแแฃแแแแฃแ แ แกแแจแฃแแแแแแแแก แแแแแแแแแ iproute2
, แกแแแแช แจแแแแแซแแแ, แแแแแแแแแ, แแแฅแแแ ip a s eth0
แแแชแแแแ ip addr show dev eth0
.
แแแกแแแแ
BPF แแแซแแแแ แกแแจแฃแแแแแแก แคแแฎแกแแชแแแแก แ แฌแงแแแ แแคแแฅแขแฃแ แแ แแแแแแแ แแ แจแแชแแแแแ แแแ แแแแก แคแฃแแฅแชแแแแแ แแแ. แกแแกแขแแแ แแฆแแแฉแแแ แซแแแแแ แฌแแ แแแขแแแฃแแ, UNIX-แแก แกแแฃแแแแแกแ แขแ แแแแชแแแแจแ: แแแ แขแแแ แแแฅแแแแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ (แฎแแแแฎแแ) แแแแ แแแ แแแแ แแแ แแแ, แกแแจแฃแแแแแแก แแซแแแแ แฃแแแ แแ แแแแแแแแก แแ แแ แแแแแแแชแแแก แแฅแกแแแ แแแแแขแแแ แฉแแแขแแ แแแแแแ. แแ แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแฅแกแแแ แแแแแขแแแ, แแกแแแ แ แแแแ แช แแแแแ BPF แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแแแแแแแ แแแ, แจแแ แก แแ แแก แแแกแ แฃแแแแแแแ, แกแแกแขแแแแก แฃแแแ แแฅแแก แกแขแแแแแฃแ แ ABI, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แกแแแแแแ แแ แ แแช แแแแแแ แแ แแคแแฅแขแฃแ แ แแแแแแก แแแแแแ.
แแแแแ แแฆแแแแจแแ, แ แแ, แฉแแแ แแแ แแ, แขแแฅแแแแแแแ แแแแแแแ แแแแฃแแแ แฃแแ แแแฎแแ, แ แแแแแ, แแ แแ แแฎแ แแ, แแแก แจแแฃแซแแแ ะธะณัะฐัั (แแแแฅแแแแก แแ แฅแแขแแฅแขแฃแ แ แจแแแซแแแแ แแแแแแแ แแแข-แแแแแแแแ แแ แ แกแแฆแแแแก), แแแแ แแก แแฎแ แแ แแ แแ แแแแแแแแแก แแแแแญแ แ, แ แแแแแแ แแแแแญแ แแช (แแแแแแแ) แแแก แแแแแฉแแแแแแ แจแแฃแซแแแแแแแ. แแก แแ แ แแแแแแแแแขแ แแ แแแ แแแซแฃแแแแก แแแแแแแแแแก แแฅแกแแแ แแแแแขแ แแ แแชแแแแ, แ แแช แแฌแแแแก แฃแคแ แ แแ แฃแคแ แ แแแแแแชแแฃแ แ แแแแแฌแงแแแขแแแแแแแแก แแแฉแแแแก.
แแก แกแขแแขแแ, แแฃแแชแ แแ แช แแฃ แแกแ แแแแแแ, แแ แแก แแฎแแแแ แจแแกแแแแแ BPF-แแก แกแแแงแแ แแจแ แแ แแ แแฆแฌแแ แก โแแแฌแแแแแโ แแแฎแแกแแแแแแแแแก แแ แแ แฅแแขแแฅแขแฃแ แแก แแแแจแแแแแแแแ แแแฌแแแแแก. แแแแแแแแ แแแแแ แแแแฎแแแแแแ แแกแแแแ: แจแแแแแแ แกแขแแขแแ แแฅแแแแ BPF แแ แแแ แแแแก แขแแแแแแก แแแแแฎแแแแ (5.8 แแแ แแแจแ แแฎแแ แแแญแแ แแแแ แแ แแแ แแแแก 30 แขแแแ), แจแแแแแ แฉแแแ แกแแแแแแแ แแแแแแฎแแแแแ, แแฃ แ แแแแ แแแแฌแแ แแ แ แแแแฃแ แ BPF แแแแแแแชแแแแ แแแ แแแแก แแแแแแแแแก แแ แแแ แแแแแแก แแแแแงแแแแแแ. แแแแแแแแแ, แแ แแ แฉแแแแขแแ แแ แฃแคแ แ แกแแฆแ แแแกแแฃแแ แแฃแ แกแ BPF แแ แฅแแขแแฅแขแฃแ แแแ, แ แแกแแช แแแฐแงแแแแ BPF แฅแกแแแแก แแ แฃแกแแคแ แแฎแแแแแก แแแแแแแชแแแแแก แแแแแแแแแแ.
แฌแแแ แกแขแแขแแแแ แแ แกแแ แแแก
แแแฃแแแแ
-
BPF แแ XDP แกแแชแแแแแ แ แแแแแแแแแแ - แแแแฃแแแแขแแชแแ BPF-แแก แจแแกแแฎแแ cilium-แแแ, แฃแคแ แ แกแฌแแ แแ แแแแแแ แแแ แแแแแแกแแแ, BPF-แแก แแ แ-แแ แแ แจแแแฅแแแแแแกแ แแ แจแแแกแ แฃแแแแแแกแแแ. แแก แแ แแก แแ แ-แแ แแ แแแ แแแแ แกแแ แแแแฃแแ แแฆแฌแแ แแแแแ, แ แแแแแแช แแแแกแฎแแแแแแแ แกแฎแแแแแกแแแ แแแแ, แ แแ แแแแแแแแ แแฃแกแขแแ แแชแแก, แ แแแ แฌแแ แก แแ แแฅ แจแแชแแแแแแ แแ แแ แแก. แแแ แซแแ, แแก แแแแฃแแแแขแ แแฆแฌแแ แก, แแฃ แ แแแแ แฃแแแ แแแฃแจแแแ XDP แแ TC แขแแแแก BPF แแ แแแ แแแแแแแ แชแแแแแแ แฃแขแแแแขแแก แแแแแงแแแแแแ.ip
แแแแแขแแแแiproute2
. -
Documentation/networking/filter.txt โ แแ แแแแแแแฃแ แ แคแแแแ แแแแกแแแฃแ แ แแ แจแแแแแ แแแคแแ แแแแแฃแแ BPF-แแก แแแแฃแแแแขแแชแแแ. แแแ แแ แฌแแกแแแแแฎแแ, แแฃ แแกแฃแ แ แแกแแแแแแแก แแแแกแ แแ แขแแฅแแแแฃแ แ แแ แฅแแขแแฅแขแฃแ แฃแแ แแแขแแแแแแก แจแแกแฌแแแแ. -
แแแแแ BPF-แแก แจแแกแแฎแแ แคแแแกแแฃแฅแแแแ . แแแ แแแแแฎแแแแฃแแแ แแจแแแแแแ, แแแแ แแ แแแ แแแแฃแแแ, แ แแแแ แช แฌแแ แแ แแฅ แแแแฅแกแแ แกแขแแ แแแแแขแแแ (eBPF-แแก แแแขแแ แ) แแ แแแแ แแ แแแแ แแแแ - (แจแแแกแ แฃแแแแแแ).libbpf
). -
bpftool-แแก แกแแแแฃแแแแแแแแ . แแแกแแ แแแแ แขแแแขแแ แแก แแแแ แแแแแขแแ แแแแแกแแแ bpftool-แแก แแแแแงแแแแแแก แแแแแแแแแแแแ แแ แกแแแแฃแแแแแแแ. -
แฉแแงแแแแแแ BPF-แจแ: แกแแแแแฎแแแ แแแกแแแแก แกแแ . แแแแแแขแฃแ แ (แแ แฏแแ แแแแแ แจแแแแ แฉแฃแแแแฃแแ) แกแแ BPF แแแแฃแแแแขแแชแแแก แแแฃแแแแแก แแแแแขแแ แแแแแแแ.
แฌแงแแ แ: www.habr.com