ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π΅ ΠΏΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Aya, ΠΊΠΎΡΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ eBPF ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Rust, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ JIT. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° eBPF, Aya Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° libbpf ΠΈ bcc ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°, Π° Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Rust, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠ° libc crate Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Aya Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° C ΠΈΠ»ΠΈ Π·Π°Π³Π»Π°Π²Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠΎΠ΄ΡΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠ΅ MIT ΠΈ Apache 2.0.
ΠΡΠ½ΠΎΠ²Π½ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° BTF (BPF Type Format), ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΈΠΏΠ° Π² BPF ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠΏΠ° ΠΈ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ ΠΊΡΠΌ ΡΠΈΠΏΠΎΠ²Π΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΠ΄ΡΠΎ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° BTF ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ Π½Π° eBPF, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π±Π΅Π· ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ βbpf-to-bpfβ, Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° eBPF ΠΏΠΎ Π½Π°ΡΠΈΠ½, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ aya ΠΊΠ°ΡΠΎ ΡΡΠ΅Π΄Π° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅, ΠΊΠ°ΡΠΎ Π²Π·Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π² eBPF.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΡΠ΄ΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅Π΄ΠΎΠ²Π½ΠΈ ΠΌΠ°ΡΠΈΠ²ΠΈ, Ρ Π΅Ρ ΠΊΠ°ΡΡΠΈ, ΡΡΠ΅ΠΊΠΎΠ²Π΅, ΠΎΠΏΠ°ΡΠΊΠΈ, ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅ΠΊΠΎΠ²Π΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΡΡΠΊΡΡΡΠΈ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΎΠΊΠ΅Ρ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ eBTF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°ΡΠΈΠΊ, ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ Π½Π° cgroup ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΡ ΡΠΎΠΊΠ΅Ρ, XDP ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ Π·Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°Ρ ΡΠ΅ΠΆΠΈΠΌ tokio ΠΈ async-std.
- ΠΡΡΠ·ΠΎ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅, Π±Π΅Π· Π²ΡΡΠ·ΠΊΠ° Ρ Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈ Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ.
ΠΡΠΎΠ΅ΠΊΡΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ - API Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠ°Π½ ΠΈ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ. ΠΠΎ ΠΊΡΠ°Ρ Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°Ρ Π΄Π° ΠΈΠ·ΡΠ°Π²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° Aya Ρ libbpf, Π° ΠΏΡΠ΅Π· ΡΠ½ΡΠ°ΡΠΈ 2022 Π³. Π΄Π° ΡΡΠ·Π΄Π°Π΄Π°Ρ ΠΏΡΡΠ²Π°ΡΠ° ΡΡΠ°Π±ΠΈΠ»Π½Π° Π²Π΅ΡΡΠΈΡ. ΠΠΌΠ° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π·Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΡΡΠΈΡΠ΅ Π½Π° Aya, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° Rust ΠΊΠΎΠ΄ Π·Π° Linux ΡΠ΄ΡΠΎΡΠΎ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅, ΠΏΡΠΈΠΊΠ°ΡΠ²Π°Π½Π΅ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
ΠΠ΅ΠΊΠ° ΡΠΈ ΠΏΡΠΈΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ eBPF Π΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π½Π° Π±Π°ΠΉΡ ΠΊΠΎΠ΄, Π²Π³ΡΠ°Π΄Π΅Π½ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π΄Π° ΠΏΡΠΈΡ
Π²Π°ΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ°, Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ, ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΡΠ΅ ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅, Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° kprobes/uprobes /tracepoints. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, Π±Π°ΠΉΡ ΠΊΠΎΠ΄ΡΡ ΡΠ΅ ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π° Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΠΈΠ½Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΈΡ ΠΊΠΎΠ΄. XDP ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΠΌΡΠ΅ΠΆΠΎΠ² Π΄ΡΠ°ΠΉΠ²Π΅Ρ, Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ DMA ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ Π±ΡΡΠ΅Ρ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠΈ Π³ΠΎΠ»ΡΠΌΠΎ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru