Το GCC περιλαμβάνει πλέον ένα backend για μεταγλώττιση στο eBPF

Περιλαμβάνεται στη σουίτα μεταγλωττιστή GCC υιοθετήθηκε κώδικας για τη μεταγλώττιση προγραμμάτων για τον διερμηνέα bytecode που είναι ενσωματωμένος στον πυρήνα του Linux eGMP. Χάρη στη χρήση της μεταγλώττισης JIT, ο bytecode του πυρήνα μεταφράζεται αμέσως σε οδηγίες μηχανής και εκτελείται με την απόδοση του εγγενούς κώδικα. Patches με υποστήριξη eBPF δεκτός στον κλάδο από τον οποίο αναπτύσσεται η έκδοση GCC 10.

Εκτός από ένα backend για δημιουργία bytecode, το GCC περιλαμβάνει μια θύρα libgcc για eBPF και εργαλεία για τη δημιουργία αρχείων ELF που καθιστούν δυνατή την εκτέλεση κώδικα στην εικονική μηχανή eBPF χρησιμοποιώντας φορτωτές που παρέχονται από τον πυρήνα. Patches για την υποστήριξη του eBPF στο GCC προετοιμάστηκαν από μηχανικούς της Oracle, οι οποίοι είχαν ήδη υπό την προϋπόθεση Υποστήριξη eBPF σε binutils GNU. Ένας προσομοιωτής και ενημερώσεις κώδικα για το GDB είναι επίσης υπό ανάπτυξη, που θα σας επιτρέψουν να διορθώσετε τα προγράμματα eBPF χωρίς να τα φορτώσετε στον πυρήνα.

Τα προγράμματα για το eBPF μπορούν να οριστούν σε ένα υποσύνολο της γλώσσας C, να μεταγλωττιστούν και να φορτωθούν στον πυρήνα. Πριν από την εκτέλεση, ο διερμηνέας eBPF ελέγχει τον bytecode για τη χρήση των επιτρεπόμενων εντολών και επιβάλλει ορισμένους κανόνες στον κώδικα (για παράδειγμα, χωρίς βρόχους).
Αρχικά, χρησιμοποιήθηκαν εργαλεία βασισμένα στο LLVM για τη μεταγλώττιση του eBPF σε Linux. Η υποστήριξη eBPF στο GCC είναι ενδιαφέρουσα επειδή σας επιτρέπει να χρησιμοποιήσετε ένα κιτ εργαλείων για να δημιουργήσετε τον πυρήνα Linux και τα προγράμματα eBPF, χωρίς να εγκαταστήσετε πρόσθετες εξαρτήσεις.

Με τη μορφή προγραμμάτων eBPF, μπορείτε να δημιουργήσετε χειριστές λειτουργιών δικτύου, να φιλτράρετε την κίνηση, να διαχειριστείτε το εύρος ζώνης, να παρακολουθείτε συστήματα, να παρακολουθείτε κλήσεις συστήματος, να ελέγχετε την πρόσβαση, να μετράτε τη συχνότητα και τον χρόνο των λειτουργιών και να πραγματοποιείτε ιχνηλάτηση χρησιμοποιώντας kprobes/uprobes/tracepoints.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο