Patch versi keenam untuk kernel Linux dengan dukungan untuk bahasa Rust

Miguel Ojeda, penulis proyek Rust-for-Linux, mengusulkan rilis komponen v6 untuk mengembangkan driver perangkat dalam bahasa Rust untuk dipertimbangkan oleh pengembang kernel Linux. Ini adalah tambalan edisi ketujuh, dengan mempertimbangkan versi pertama, diterbitkan tanpa nomor versi. Dukungan Rust dianggap eksperimental, tetapi sudah termasuk dalam cabang linux-next dan cukup dikembangkan untuk mulai bekerja membuat lapisan abstraksi pada subsistem kernel, serta menulis driver dan modul. Pengembangan ini didanai oleh Google dan ISRG (Internet Security Research Group), yang merupakan pendiri proyek Let's Encrypt dan mempromosikan HTTPS serta pengembangan teknologi untuk meningkatkan keamanan Internet.

ΠΎΠ²ΠΎΠΉ Срсии:

  • Toolkit dan varian perpustakaan alokasi, terbebas dari kemungkinan timbulnya keadaan "panik" ketika terjadi kesalahan, telah diperbarui ke rilis Rust 1.60, yang menstabilkan dukungan untuk mode "maybe_uninit_extra" yang digunakan dalam patch kernel.
  • Menambahkan kemampuan untuk menjalankan pengujian dari dokumentasi (pengujian yang juga digunakan sebagai contoh dalam dokumentasi), melalui konversi pengujian pada waktu kompilasi yang terkait dengan API kernel menjadi pengujian KUnit yang dijalankan selama pemuatan kernel.
  • Persyaratan telah diterapkan bahwa pengujian tidak boleh menghasilkan peringatan linter Clippy, seperti kode kernel Rust.
  • Implementasi awal modul β€œnet” dengan fungsi jaringan diusulkan. Kode Rust memiliki akses ke struktur jaringan kernel seperti Namespace (berdasarkan struktur kernel struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) dan setara IPv6-nya .
  • Ada dukungan awal untuk teknik pemrograman asinkron (async), yang diimplementasikan dalam bentuk modul kasync. Misalnya, Anda dapat menulis kode asinkron untuk memanipulasi soket TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { biarkan n = stream.read(&mut buf).menunggu?; jika n == 0 { kembalikan Oke(()); } stream.write_all(&buf[..n]).menunggu?; } }
  • Menambahkan modul net::filter untuk memanipulasi filter paket jaringan. Menambahkan contoh Rust_netfilter.rs dengan implementasi filter dalam bahasa Rust.
  • Menambahkan implementasi mutex smutex::Mutex sederhana, yang tidak memerlukan penyematan.
  • Menambahkan NoWaitLock, yang tidak pernah menunggu kunci, dan jika ditempati oleh thread lain, menyebabkan kesalahan dilaporkan saat mencoba mendapatkan kunci alih-alih menghentikan pemanggil.
  • Menambahkan RawSpinLock, yang diidentifikasi dengan raw_spinlock_t di kernel, untuk diterapkan pada bagian yang tidak bisa menganggur.
  • Menambahkan tipe ARef untuk referensi ke objek yang mekanisme penghitungan referensinya diterapkan (selalu dihitung ulang).
  • Backend Rustc_codegen_gcc, yang memungkinkan Anda menggunakan perpustakaan libgccjit dari proyek GCC sebagai generator kode di Rustc untuk memberikan Rustc dukungan untuk arsitektur dan pengoptimalan yang tersedia di GCC, telah mengimplementasikan kemampuan untuk melakukan bootstrap pada kompiler Rustc. Promosi kompiler berarti kemampuan untuk menggunakan generator kode berbasis GCC di Rustc untuk membangun kompiler Rustc itu sendiri. Selain itu, rilis terbaru GCC 12.1 menyertakan perbaikan pada libgccjit yang diperlukan agar rustic_codegen_gcc dapat berfungsi dengan benar. Persiapan sedang dilakukan untuk menyediakan kemampuan menginstal Rustc_codegen_gcc menggunakan utilitas Rustup.
  • Kemajuan dalam pengembangan gccrs frontend GCC dengan implementasi kompiler bahasa Rust berdasarkan GCC dicatat. Saat ini ada dua pengembang penuh waktu yang mengerjakan gccrs.

Ingatlah bahwa perubahan yang diusulkan memungkinkan penggunaan Rust sebagai bahasa kedua untuk mengembangkan driver dan modul kernel. Dukungan Rust disajikan sebagai opsi yang tidak diaktifkan secara default dan tidak mengakibatkan Rust disertakan sebagai dependensi build yang diperlukan untuk kernel. Menggunakan Rust untuk pengembangan driver akan memungkinkan Anda membuat driver yang lebih aman dan lebih baik dengan sedikit usaha, bebas dari masalah seperti akses memori setelah pembebasan, dereferensi penunjuk nol, dan buffer overruns.

Penanganan aman-memori disediakan di Rust pada waktu kompilasi melalui pemeriksaan referensi, melacak kepemilikan objek dan masa pakai objek (cakupan), serta melalui evaluasi kebenaran akses memori selama eksekusi kode. Rust juga memberikan perlindungan terhadap integer overflow, membutuhkan inisialisasi wajib dari nilai variabel sebelum digunakan, menangani kesalahan dengan lebih baik di perpustakaan standar, menerapkan konsep referensi dan variabel yang tidak dapat diubah secara default, menawarkan pengetikan statis yang kuat untuk meminimalkan kesalahan logis.

Sumber: opennet.ru

Tambah komentar