ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ KernelScript β Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΡΠΈ ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π½Π° Linux ΡΠ΄ΡΠΎΡΠΎ ΠΎΡ Π΅Π΄ΠΈΠ½Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π°. ΠΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Multikernel Technologies, ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠ·ΠΈΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° split-kernel / multikernel Π·Π° Linux. ΠΠ° KernelScript ΡΠ°Π·ΠΊΠ°Π·Π° ΠΎΡΠ½ΠΎΠ²Π°ΡΠ΅Π»ΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΠΠΎΠ½Π³ Π£Π°Π½Π³ Π½Π° Linux Foundation Open Source Summit; ΠΊΠΎΠ΄ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ Π² GitHub ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π· Apache 2.0.
eBPF (Π Π°Π·ΡΠΈΡΠ΅Π½ Berkeley Packet Filter) β ΡΠΎΠ²Π° Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, Π±Π΅Π· Π΄Π° ΡΠ΅ Π·Π°ΡΡΠ³Π° Π½Π΅Π³ΠΎΠ²ΠΈΡΡ ΠΊΠΎΠ΄ ΠΈ Π±Π΅Π· Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Ρ ΠΏΠΎΠ΄ ΡΠΈΡΠΊ ΡΡΠ°Π±ΠΈΠ»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. eBPF ΠΏΠΎΠΌΠ°Π³Π° Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°ΡΠΈ, ΠΎΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΄ΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° eBPF ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ»Π΅Π΄ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, ΠΌΡΠ΅ΠΆΠΎΠ² ΡΡΠ°ΡΠΈΠΊ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΡΠ΅ΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° (Π₯Π°Π±Ρ).
ΠΠ΄Π΅ΡΡΠ° Π½Π° KernelScript Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° eBPF ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π°, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡΠ° C + libbpf, ΠΈ ΡΡΡΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° Π½Π΅ ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ bpftrace. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π΅Π·ΠΈΠΊΠ° ΠΊΠ°ΡΠΎ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ DSL, ΠΊΠΎΠΉΡΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π° eBPF, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈ kernelspace: ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΡΠ°ΠΉΠ» ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΊΠΎΠ΄ Π·Π° eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΡΠ°ΡΡ ΠΎΡ userspace ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ kernel ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΡΠ΅Π· kfunc.
ΠΠ±ΡΠ²Π΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° KernelScript:
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π»ΠΈ ΠΎΡ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» β ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π°ΡΡΠΈΠ±ΡΡΠΈ ΠΊΠ°ΡΠΎ @xdp, @tc, @helper ΠΈ @kfunc Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ Π½Π° Π½ΡΠΆΠ½Π°ΡΠ° ΡΠ°ΡΡ: XDP/TC ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΏΠΎΠΌΠΎΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΡΠ΄ΡΠΎ ΠΈΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΊΠΎΠ΄.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° tail calls β Π²ΠΌΠ΅ΡΡΠΎ ΡΡΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° program array ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° bpf_tail_call() ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π΄Π° ΠΏΠΈΡΠ°Ρ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½ΠΈΡΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΈΡ eBPF ΠΊΠΎΠ΄ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΡΠ°Π²Π΅Π½ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°.
ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ dynptr ΠΈ eBPF maps β Π΅Π·ΠΈΠΊΡΡ ΡΠΊΡΠΈΠ²Π° ΡΠ°ΡΡ ΠΎΡ ΡΡΡΠ½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Ρ bpf_ringbuf_reserve_dynptr, bpf_dynptr_write ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ API. eBPF ΠΊΠ°ΡΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΊΠ°ΡΠΎ Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
ΠΠΎΠ½ΡΡΠΎΠ» Π½Π° ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ» Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ β eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡ ΠΊΠ°ΡΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ, ΠΏΠΎ Π·Π°ΠΌΠΈΡΡΠ» Π½Π° Π°Π²ΡΠΎΡΠΈΡΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΡ Π³ΡΠ΅ΡΠΊΠΈ ΠΊΠ°ΡΠΎ ΠΎΠΏΠΈΡΠΈ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° attach() ΠΏΡΠ΅Π΄ΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ load().
ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΠ° Π·Π° kfunc β KernelScript ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΠ±ΡΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π°ΡΡΠΈΠ±ΡΡ @kfunc, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π² ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈ ΠΎΡ eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ; Π·Π° ΡΡΡ Π΅ ΠΎΠ±Π΅ΡΠ°Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π½Π° kernel module ΠΈ BTF ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ.
ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ β Π² README ΡΠ° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° XDP, TC, probe ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ perf_event, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°Π±ΠΎΡΠ° Ρ Ρ Π°ΡΠ΄ΡΠ΅ΡΠ½ΠΈ Π±ΡΠΎΡΡΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ.
ΠΠ²ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π²Π°Ρ, ΡΠ΅ KernelScript Π½Π΅ Π΅ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΈΠ»ΠΈ Π½ΠΎΠ² eBPF runtime. Π’ΠΎΠ²Π° ΠΏΠΎ-ΡΠΊΠΎΡΠΎ Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ ΠΈ Π΅Π·ΠΈΠΊ ΠΎΡ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΏΠΎΠ·Π½Π°ΡΠΈ Π½ΠΈΡΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ: eBPF ΠΊΠΎΠ΄, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°ΡΠΈ, Makefile ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ, kernel module.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠ·ΠΏΡΠΈΠ΅ΠΌΠ°Π½ ΠΊΠ°ΡΠΎ ΡΠ°Π½Π΅Π½ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ. Π ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ, ΡΠ΅ KernelScript Π΅ Π² Π΅ΡΠ°ΠΏ Π±Π΅ΡΠ°, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡΡ ΠΈ API ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ Π±Π΅Π· Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ°, Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΌΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΡΡΠ΅Π΄ΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru
