เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ GCC เบ›เบฐเบเบญเบšเบกเบต backend เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบเบฑเบš eBPF

เบฅเบงเบกเบขเบนเปˆเปƒเบ™เบŠเบธเบ”เบฅเบงเบšเบฅเบงเบกเบ‚เปเป‰เบกเบนเบ™ GCC เบเบญเบกเบฎเบฑเบš เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบšเบฑเบ™เบ”เบฒเป‚เบ„เบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบ™เบฒเบเบžเบฒเบชเบฒ bytecode เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ Linux kernel eGMP. เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบฅเบงเบšเบฅเบงเบก JIT, kernel bytecode เป„เบ”เป‰เบ–เบทเบเปเบ›เป€เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ”เป‰เบงเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡. Patches เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ eBPF เบเบญเบกเบฎเบฑเบš เป„เบ›เบซเบฒเบชเบฒเบ‚เบฒเบ—เบตเปˆเบเบฒเบ™เบ›เปˆเบญเบ GCC 10 เบ–เบทเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบ backend เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบœเบฐเบฅเบดเบ” bytecode, GCC เบ›เบฐเบเบญเบšเบกเบตเบžเบญเบ” libgcc เบชเปเบฒเบฅเบฑเบš eBPF เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ ELF เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ”เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual eBPF เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเป‚เบซเบผเบ”เบ—เบตเปˆเปƒเบซเป‰ kernel. Patches เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ eBPF เปƒเบ™ GCC เป„เบ”เป‰เบ–เบทเบเบเบฐเบเบฝเบกเป‚เบ”เบเบงเบดเบชเบฐเบงเบฐเบเบญเบ™เบˆเบฒเบ Oracle, เบœเบนเป‰เบ—เบตเปˆเบกเบตเปเบฅเป‰เบง เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰ eBPF เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เปƒเบ™ GNU binutils. เบ•เบปเบงเบˆเบณเบฅเบญเบ‡ เปเบฅเบฐเปเบžเบฑเบเป€เบเบฑเบ”เบชเบณเบฅเบฑเบš GDB เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบเป‰เบšเบฑเบ™เบซเบฒเป‚เบ›เบฃเปเบเบก eBPF เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เป‚เบซเบผเบ”เบžเบงเบเบกเบฑเบ™เปƒเบชเปˆเปƒเบ™เปเบเปˆเบ™.

เป‚เบ„เบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบš eBPF เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เบขเบนเปˆเปƒเบ™เบŠเบธเบ”เบเปˆเบญเบเบ‚เบญเบ‡เบžเบฒเบชเบฒ C, เบฅเบงเบšเบฅเบงเบกเปเบฅเบฐเป‚เบซเบฅเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ kernel. เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”, เบ™เบฒเบเบžเบฒเบชเบฒ eBPF เบเบงเบ”เป€เบšเบดเปˆเบ‡ bytecode เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบซเบฑเบ” (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเปเปˆเบกเบต loops).
เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆ LLVM เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบฅเบงเบšเบฅเบงเบก eBPF เปƒเบ™ Linux. เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ eBPF เปƒเบ™ GCC เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เปƒเบŠเป‰เบŠเบธเบ”เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบซเบ™เบถเปˆเบ‡เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เป‚เบ›เบผเปเบเบผเบก Linux เปเบฅเบฐ eBPF, เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เป‚เบ›เบฅเปเบเบฅเบก eBPF, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™, เบˆเบฑเบ”เบเบฒเบ™เปเบšเบ™เบงเบดเบ”, เบฅเบฐเบšเบปเบšเบ•เบดเบ”เบ•เบฒเบกเบเบงเบ”เบเบฒ, เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบš, เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡, เบ™เบฑเบšเบ„เบงเบฒเบกเบ–เบตเปˆเปเบฅเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™, เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเป‚เบ”เบเปƒเบŠเป‰ kprobes / uprobes / tracepoints.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™