ΠΡΠ΅Π·Π΅Π½ΡΠΈΡΠ°Π½ΠΎ Π΅ ΠΏΡΠ²ΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Aya, ΠΊΠΎΠ΅ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΊΡΠ²Π°ΡΠΈ eBPF Π½Π° ΡΠ°Π·ΠΈΠΊΠΎΡ Rust ΠΊΠΎΠΈ ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π½Π° Linux Π²ΠΎ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΡΠΎ JIT. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ Π΄ΡΡΠ³ΠΈΡΠ΅ Π°Π»Π°ΡΠΊΠΈ Π·Π° ΡΠ°Π·Π²ΠΎΡ Π½Π° eBPF, Aya Π½Π΅ ΠΊΠΎΡΠΈΡΡΠΈ libbpf ΠΈ ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ bcc, ΡΡΠΊΡ Π½Π°ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ° Π½ΡΠ΄ΠΈ ΡΠ²ΠΎΡΠ° ΡΠΎΠΏΡΡΠ²Π΅Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π²ΠΎ Rust, ΠΊΠΎΡΠ° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ libc Π³Π°ΡΠ±Π° Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ. Building 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