ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΏΠ΅ΡΠ²ΡΠΉ Π²ΡΠΏΡΡΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Aya, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π° ΡΠ·ΡΠΊΠ΅ Rust ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ eBPF, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠ΅ Π²Π½ΡΡΡΠΈ ΡΠ΄ΡΠ° 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