Η έκτη έκδοση ενημερώσεων κώδικα για τον πυρήνα του Linux με υποστήριξη για τη γλώσσα Rust

Ο Miguel Ojeda, συγγραφέας του έργου Rust-for-Linux, πρότεινε την κυκλοφορία των στοιχείων v6 για την ανάπτυξη προγραμμάτων οδήγησης συσκευών στη γλώσσα Rust προς εξέταση από τους προγραμματιστές του πυρήνα Linux. Αυτή είναι η έβδομη έκδοση των ενημερώσεων κώδικα, λαμβάνοντας υπόψη την πρώτη έκδοση, που δημοσιεύτηκε χωρίς αριθμό έκδοσης. Η υποστήριξη Rust θεωρείται πειραματική, αλλά περιλαμβάνεται ήδη στον κλάδο του linux-next και έχει αναπτυχθεί επαρκώς για να ξεκινήσει η εργασία για τη δημιουργία επιπέδων αφαίρεσης σε υποσυστήματα πυρήνα, καθώς και τη σύνταξη προγραμμάτων οδήγησης και λειτουργικών μονάδων. Η ανάπτυξη χρηματοδοτείται από την Google και την ISRG (Internet Security Research Group), η οποία είναι ο ιδρυτής του έργου Let's Encrypt και προωθεί το HTTPS και την ανάπτυξη τεχνολογιών για τη βελτίωση της ασφάλειας στο Διαδίκτυο.

Στη νέα έκδοση:

  • Η εργαλειοθήκη και μια παραλλαγή της βιβλιοθήκης κατανομής, απαλλαγμένη από πιθανή δημιουργία κατάστασης "πανικού" όταν συμβαίνουν σφάλματα, έχουν ενημερωθεί στην έκδοση του Rust 1.60, η οποία σταθεροποιεί την υποστήριξη για τη λειτουργία "maybe_uninit_extra" που χρησιμοποιείται στις ενημερώσεις κώδικα του πυρήνα.
  • Προστέθηκε η δυνατότητα εκτέλεσης δοκιμών από την τεκμηρίωση (δοκιμές που χρησιμοποιούνται επίσης ως παραδείγματα στην τεκμηρίωση), μέσω μετατροπής χρόνου μεταγλώττισης των δοκιμών που συνδέονται με το API του πυρήνα σε δοκιμές KUnit που εκτελούνται κατά τη φόρτωση του πυρήνα.
  • Έχουν υιοθετηθεί απαιτήσεις ότι οι δοκιμές δεν πρέπει να οδηγούν σε προειδοποίηση Clippy linter, όπως ακριβώς ο κώδικας πυρήνα Rust.
  • Προτείνεται μια αρχική υλοποίηση της ενότητας «net» με λειτουργίες δικτύου. Ο κώδικας Rust έχει πρόσβαση σε δομές δικτύου πυρήνα, όπως το Namespace (με βάση τη δομή του πυρήνα του δικτύου struct), το SkBuff (struct sk_buff), το TcpListener, το TcpStream (struct socket), το Ipv4Addr (struct in_addr), το SocketAddrV4 (struct sk_buff) και το IPV6 .
  • Υπάρχει αρχική υποστήριξη για τεχνικές ασύγχρονου προγραμματισμού (async), που υλοποιούνται με τη μορφή της ενότητας kasync. Για παράδειγμα, μπορείτε να γράψετε ασύγχρονο κώδικα για να χειριστείτε υποδοχές TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).wait?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).αναμονή;; } }
  • Προστέθηκε μονάδα net::filter για χειρισμό φίλτρων πακέτων δικτύου. Προστέθηκε παράδειγμα rust_netfilter.rs με εφαρμογή φίλτρου στη γλώσσα Rust.
  • Προστέθηκε η υλοποίηση ενός απλού mutex smutex::Mutex, το οποίο δεν απαιτεί καρφίτσωμα.
  • Προστέθηκε το NoWaitLock, το οποίο δεν περιμένει ποτέ για κλείδωμα και εάν καταλαμβάνεται από άλλο νήμα, προκαλεί την αναφορά σφάλματος κατά την προσπάθεια απόκτησης του κλειδώματος αντί να σταματήσει τον καλούντα.
  • Προστέθηκε το RawSpinLock, που προσδιορίζεται από το raw_spinlock_t στον πυρήνα, για εφαρμογή σε ενότητες που δεν μπορούν να είναι αδρανείς.
  • Προστέθηκε ο τύπος ARef για αναφορές σε ένα αντικείμενο στο οποίο εφαρμόζεται ο μηχανισμός μέτρησης αναφορών (πάντα-επαναμετρούμενο).
  • Το backend rustc_codegen_gcc, το οποίο σας επιτρέπει να χρησιμοποιείτε τη βιβλιοθήκη libgccjit από το έργο GCC ως γεννήτρια κώδικα στο rustc για να παρέχετε στο rustc υποστήριξη για αρχιτεκτονικές και βελτιστοποιήσεις που είναι διαθέσιμες στο GCC, έχει εφαρμόσει τη δυνατότητα εκκίνησης του μεταγλωττιστή rustc. Προώθηση μεταγλωττιστή σημαίνει τη δυνατότητα χρήσης μιας γεννήτριας κώδικα που βασίζεται στο GCC στο rustc για την κατασκευή του ίδιου του μεταγλωττιστή rustc. Επιπλέον, η πρόσφατη έκδοση του GCC 12.1 περιλαμβάνει επιδιορθώσεις στο libgccjit που είναι απαραίτητες για τη σωστή λειτουργία του rustc_codegen_gcc. Γίνονται προετοιμασίες για την παροχή της δυνατότητας εγκατάστασης rustc_codegen_gcc χρησιμοποιώντας το βοηθητικό πρόγραμμα rustup.
  • Σημειώνεται η πρόοδος στην ανάπτυξη του GCC frontend gccrs με την εφαρμογή του μεταγλωττιστή γλώσσας Rust που βασίζεται στο GCC. Αυτήν τη στιγμή υπάρχουν δύο προγραμματιστές πλήρους απασχόλησης που εργάζονται στο gccrs.

Θυμηθείτε ότι οι προτεινόμενες αλλαγές καθιστούν δυνατή τη χρήση της Rust ως δεύτερης γλώσσας για την ανάπτυξη προγραμμάτων οδήγησης και λειτουργικών μονάδων πυρήνα. Η υποστήριξη Rust παρουσιάζεται ως μια επιλογή που δεν είναι ενεργοποιημένη από προεπιλογή και δεν έχει ως αποτέλεσμα τη συμπερίληψη του Rust στις απαιτούμενες εξαρτήσεις κατασκευής για τον πυρήνα. Η χρήση του Rust για την ανάπτυξη προγραμμάτων οδήγησης θα σας επιτρέψει να δημιουργήσετε ασφαλέστερα και καλύτερα προγράμματα οδήγησης με ελάχιστη προσπάθεια, χωρίς προβλήματα όπως η πρόσβαση σε μια περιοχή μνήμης μετά την απελευθέρωσή της, η κατάργηση αναφοράς μηδενικών δεικτών και οι υπερβάσεις buffer.

Ο ασφαλής χειρισμός της μνήμης παρέχεται στο Rust κατά το χρόνο μεταγλώττισης μέσω ελέγχου αναφοράς, παρακολούθησης της ιδιοκτησίας αντικειμένου και της διάρκειας ζωής του αντικειμένου (πεδίο), καθώς και μέσω αξιολόγησης της ορθότητας της πρόσβασης στη μνήμη κατά την εκτέλεση του κώδικα. Το Rust παρέχει επίσης προστασία έναντι υπερχείλισης ακεραίων, απαιτεί υποχρεωτική αρχικοποίηση τιμών μεταβλητών πριν από τη χρήση, χειρίζεται καλύτερα τα σφάλματα στην τυπική βιβλιοθήκη, εφαρμόζει την έννοια των αμετάβλητων αναφορών και μεταβλητών από προεπιλογή, προσφέρει ισχυρή στατική πληκτρολόγηση για την ελαχιστοποίηση των λογικών σφαλμάτων.

Πηγή: opennet.ru

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