В състава на комплекта от компилатори GCC код за компилиране на програми за вграден интерпретатор на байткод в ядрото на Linux . Благодаря на JIT компилация, байткодът в ядрото се трансформира в машинни инструкции в движение и се изпълнява с производителността на нативен код. Патчовете с поддръжка на eBPF в клон, на базата на който се развива версията GCC 10.
Освен бекенда за генериране на байткод, GCC включва порт на libgcc за eBPF и средства за създаване на ELF файлове, които дават възможност за изпълнение на кода във виртуална машина eBPF, използвайки предоставените от ядрото зареждачи. Патчовете за поддръжка на eBPF в GCC са подготвени от инженери на Oracle, които преди това вече поддръжка на eBPF в GNU binutils. В разработка също така е симулатор и патчове за GDB, които ще позволят отстраняването на грешки в eBPF програми без зареждане в ядрото.
Програмите за eBPF могат да се определят на подмножество от езика C, да се компилират и да се зареждат в ядрото. Преди изпълнение интерпретаторът eBPF проверява байткода за разрешени инструкции и налага определени правила на кода (например, липса на цикли).
Първоначално за компилиране на eBPF в Linux се използваше инструментариум на базата на LLVM. Поддръжката на eBPF в GCC представлява интерес, тъй като позволява използването на един инструментариум за компилиране на ядрото на Linux и eBPF програми, без инсталиране на допълнителни зависимости.
Във формата на програми eBPF могат да се създават обработчици на мрежови операции, да се филтрира трафик, да се управлява пропускната способност, да се наблюдава работата на системите, да се прихващат системни повиквания, да се контролира достъпа, да се изчислява честотата и времето за изпълнение на операции, да се извършва трасировка с помощта на kprobes/uprobes/tracepoints.
Източник: opennet.ru
