Versi keenam patch untuk kernel Linux dengan sokongan untuk bahasa Rust

Miguel Ojeda, pengarang projek Rust-for-Linux, mencadangkan pelepasan komponen v6 untuk membangunkan pemacu peranti dalam bahasa Rust untuk dipertimbangkan oleh pembangun kernel Linux. Ini adalah edisi ketujuh tampalan, dengan mengambil kira versi pertama, diterbitkan tanpa nombor versi. Sokongan karat dianggap eksperimen, tetapi sudah termasuk dalam cawangan linux-seterusnya dan cukup dibangunkan untuk memulakan kerja mencipta lapisan abstraksi ke atas subsistem kernel, serta menulis pemacu dan modul. Pembangunan ini dibiayai oleh Google dan ISRG (Kumpulan Penyelidikan Keselamatan Internet), yang merupakan pengasas projek Let's Encrypt dan mempromosikan HTTPS dan pembangunan teknologi untuk meningkatkan keselamatan Internet.

Dalam versi baharu:

  • Kit alat dan varian pustaka alloc, dibebaskan daripada kemungkinan penjanaan keadaan "panik" apabila ralat berlaku, telah dikemas kini kepada keluaran Rust 1.60, yang menstabilkan sokongan untuk mod "mungkin_uninit_extra" yang digunakan dalam tampalan kernel.
  • Menambah keupayaan untuk menjalankan ujian daripada dokumentasi (ujian yang juga digunakan sebagai contoh dalam dokumentasi), melalui penukaran masa kompilasi ujian yang terikat pada API kernel ke dalam ujian KUnit yang dilaksanakan semasa pemuatan kernel.
  • Keperluan telah diterima pakai bahawa ujian tidak boleh menghasilkan amaran linter Clippy, sama seperti kod kernel Rust.
  • Pelaksanaan awal modul "bersih" dengan fungsi rangkaian dicadangkan. Kod Rust mempunyai akses kepada struktur rangkaian kernel seperti Namespace (berdasarkan struktur kernel bersih struct), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 ( struct sockaddr_in) dan setara IPv6 mereka .
  • Terdapat sokongan awal untuk teknik pengaturcaraan tak segerak (async), dilaksanakan dalam bentuk modul kasync. Contohnya, anda boleh menulis kod tak segerak untuk memanipulasi soket TCP: async fn echo_server(strim: TcpStream) -> Result { let mut buf = [0u8; 1024]; gelung { biarkan n = stream.read(&mut buf).tunggu?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).tunggu?; } }
  • Menambah modul bersih::penapis untuk memanipulasi penapis paket rangkaian. Menambahkan contoh rust_netfilter.rs dengan pelaksanaan penapis dalam bahasa Rust.
  • Menambah pelaksanaan mutex smutex::Mutex mudah, yang tidak memerlukan penyematan.
  • Ditambah NoWaitLock, yang tidak pernah menunggu kunci, dan jika diduduki oleh urutan lain, menyebabkan ralat dilaporkan apabila cuba mendapatkan kunci dan bukannya menghentikan pemanggil.
  • Menambahkan RawSpinLock, yang dikenal pasti oleh raw_spinlock_t dalam kernel, untuk digunakan pada bahagian yang tidak boleh melahu.
  • Menambahkan jenis ARef untuk rujukan kepada objek yang mekanisme pengiraan rujukan digunakan (sentiasa dikira semula).
  • Bahagian belakang rustc_codegen_gcc, yang membolehkan anda menggunakan pustaka libgccjit daripada projek GCC sebagai penjana kod dalam rustc untuk menyediakan rustc dengan sokongan untuk seni bina dan pengoptimuman yang tersedia dalam GCC, telah melaksanakan keupayaan untuk bootstrap pengkompil rustc. Promosi pengkompil bermaksud keupayaan untuk menggunakan penjana kod berasaskan GCC dalam rustc untuk membina pengkompil rustc itu sendiri. Di samping itu, keluaran terbaru GCC 12.1 termasuk pembetulan libgccjit yang diperlukan untuk rustc_codegen_gcc berfungsi dengan betul. Persediaan sedang dijalankan untuk menyediakan keupayaan untuk memasang rustc_codegen_gcc menggunakan utiliti rustup.
  • Kemajuan dalam pembangunan gccrs bahagian hadapan GCC dengan pelaksanaan pengkompil bahasa Rust berdasarkan GCC dicatatkan. Pada masa ini terdapat dua pembangun sepenuh masa yang mengusahakan gccrs.

Ingat bahawa perubahan yang dicadangkan memungkinkan untuk menggunakan Rust sebagai bahasa kedua untuk membangunkan modul pemacu dan kernel. Sokongan Rust dibentangkan sebagai pilihan yang tidak didayakan secara lalai dan tidak menyebabkan Rust disertakan sebagai pergantungan binaan yang diperlukan untuk kernel. Menggunakan Rust untuk pembangunan pemandu akan membolehkan anda mencipta pemandu yang lebih selamat dan lebih baik dengan usaha yang minimum, bebas daripada masalah seperti akses memori selepas dibebaskan, penolakan penunjuk nol dan overrun penimbal.

Keselamatan memori disediakan dalam Rust pada masa penyusunan melalui semakan rujukan, menjejaki pemilikan objek dan jangka hayat objek (skop), serta melalui penilaian ketepatan akses memori semasa pelaksanaan kod. Rust juga menyediakan perlindungan terhadap limpahan integer, memerlukan permulaan mandatori nilai pembolehubah sebelum digunakan, mengendalikan ralat dengan lebih baik dalam perpustakaan standard, menggunakan konsep rujukan tidak berubah dan pembolehubah secara lalai, menawarkan penaipan statik yang kuat untuk meminimumkan ralat logik.

Sumber: opennet.ru

Tambah komen