Patch versi kedelapan untuk kernel Linux dengan dukungan untuk bahasa Rust

Miguel Ojeda, penulis proyek Rust-for-Linux, mengusulkan rilis komponen v8 untuk mengembangkan driver perangkat dalam bahasa Rust untuk dipertimbangkan oleh pengembang kernel Linux. Ini adalah versi tambalan yang direvisi, dengan mempertimbangkan versi pertama, diterbitkan tanpa nomor versi. Dukungan Rust dianggap eksperimental, namun sudah termasuk dalam cabang linux-next, diklaim terintegrasi ke dalam rilis musim gugur 5.20/6.0, dan cukup matang 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, bebas dari kemungkinan timbulnya keadaan "panik" ketika terjadi kesalahan, telah diperbarui untuk rilis Rust 1.62. Dibandingkan dengan versi yang digunakan sebelumnya, toolkit Rust telah menstabilkan dukungan untuk fungsionalitas const_fn_trait_bound yang digunakan dalam patch kernel.
  • Kode pengikatan dipisahkan menjadi "pengikatan" paket peti terpisah, yang menyederhanakan pembangunan kembali jika perubahan hanya dilakukan pada paket utama "kernel".
  • Implementasi makro β€œconcat_idents!” ditulis ulang dalam bentuk makro prosedural yang tidak terikat dengan fungsionalitas concat_idents dan memungkinkan penggunaan referensi ke variabel lokal.
  • Makro β€œstatic_assert!” telah ditulis ulang, memungkinkan penggunaan β€œcore::assert!()” dalam konteks apa pun, bukan konstanta.
  • Makro "build_error!" diadaptasi untuk bekerja ketika mode β€œRUST_BUILD_ASSERT_{WARN,ALLOW}” diatur untuk modul.
  • Menambahkan file terpisah dengan pengaturan "kernel/configs/rust.config".
  • File β€œ*.i” yang diproses dalam substitusi makro telah diubah namanya menjadi β€œ*.rsi”.
  • Dukungan untuk membuat komponen Rust dengan tingkat pengoptimalan yang berbeda dari yang digunakan untuk kode C telah dihentikan.
  • Menambahkan modul fs, yang menyediakan binding untuk bekerja dengan sistem file. Contoh sistem file sederhana yang ditulis dalam Rust disediakan.
  • Menambahkan modul workqueue untuk bekerja dengan antrian sistem (menyediakan pengikatan pada struktur kernel work_struct dan workqueue_struct).
  • Pengembangan modul kasync dilanjutkan dengan penerapan metode pemrograman asinkron (async). Menambahkan contoh server TCP tingkat inti yang ditulis dalam Rust.
  • Menambahkan kemampuan untuk menangani interupsi dalam bahasa Rust menggunakan tipe [Threaded]Handler dan tipe [Threaded]Registration`.
  • Menambahkan makro prosedural "#[vtable]" untuk mempermudah bekerja dengan tabel penunjuk fungsi, seperti struktur file_operations.
  • Menambahkan implementasi daftar tertaut dua arah "unsafe_list::List".
  • Menambahkan dukungan awal untuk RCU (Baca-salin-pembaruan) dan tipe Penjaga untuk memeriksa apakah kunci baca terikat ke thread saat ini.
  • Menambahkan fungsi Task::spawn() untuk membuat dan memulai thread kernel secara otomatis. Juga menambahkan metode Task::wake_up().
  • Menambahkan modul penundaan yang memungkinkan Anda menggunakan penundaan (pembungkus msleep()).

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 dimasukkannya Rust di antara dependensi build yang diperlukan untuk kernel. Menggunakan Rust untuk mengembangkan driver akan memungkinkan Anda membuat driver yang lebih aman dan lebih baik dengan sedikit usaha, bebas dari masalah seperti mengakses area memori setelah dibebaskan, mendereferensi pointer 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