ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ Π΅ ΠΏΡΡΠ²ΠΈΡΡ Π±ΡΠΎΠΉ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Aya, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ eBPF Π½Π° Π΅Π·ΠΈΠΊΠ° Rust, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π²ΡΡΡΠ΅ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ JIT. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Aya Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° libbpf ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° bcc, Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Rust, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠ° crate libc Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Aya Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π·Π° Π΅Π·ΠΈΠΊΠ° C ΠΈ Π·Π°Π³Π»Π°Π²Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. ΠΠΎΠ΄ΡΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΠ΅ MIT ΠΈ Apache 2.0.
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠΎΡΠΌΠ°ΡΠ° BTF (BPF Type Format), ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ Π² ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ BPF Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈ ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Ρ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½ΠΈ ΠΎΡ ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΠ΄ΡΠΎ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° BTF ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΈ eBPF ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π±Π΅Π· ΠΏΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ 'bpf-to-bpf', Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΡΠΎΡΠΌΡΠ½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° eBPF Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ aya ΠΊΠ°ΡΠΎ runtime, ΠΏΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΎΠ³Π»Π΅Π΄ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΏΠΎ eBPF.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ ΡΠ΄ΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ ΠΌΠ°ΡΠΈΠ²ΠΈ, Ρ Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠΈ (hash map), ΡΡΠ΅ΠΊΠΈ, ΠΎΠΏΠ°ΡΠΊΠΈ, ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° ΡΡΠ΅ΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΡΡΠΊΡΡΡΠΈ Π·Π° ΡΠΎΠΊΠ΅ΡΠΈ ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ 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
