Versi kadalapan patch pikeun kernel Linux kalayan dukungan pikeun basa Rust

МигСль ΠžΡ…Π΅Π΄Π° (Miguel Ojeda), Π°Π²Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Rust-for-Linux, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» для рассмотрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ядра Linux выпуск v8 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² устройств Π½Π° языкС Rust. Π­Ρ‚ΠΎ рСвятая рСдакция ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π΅Π· Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Rust рассматриваСтся ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ, Π½ΠΎ ΡƒΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π²Π΅Ρ‚ΠΊΡƒ linux-next, ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ Π² осСнний выпуск 5.20/6.0 ΠΈ достаточно Ρ€Π°Π·Π²ΠΈΡ‚Π° для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ созданию слоёв абстракции Π½Π°Π΄ подсистСмами ядра, Π° Ρ‚Π°ΠΊΠΆΠ΅ для написания Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° финансируСтся ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Google ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ISRG (Internet Security Research Group), которая являСтся ΡƒΡ‡Ρ€Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Let’s Encrypt ΠΈ способствуСт ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡŽ HTTPS ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ защищённости ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°.

Dina versi anyar:

  • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ alloc, ΠΈΠ·Π±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΉ состояния Β«panicΒ» ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибок, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ‹ Π΄ΠΎ выпуска Rust 1.62. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π°Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ вСрсиСй Π² инструмСнтарии Rust стабилизирована ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ const_fn_trait_bound, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² ΠΏΠ°Ρ‚Ρ‡Π°Ρ… ΠΊ ядру.
  • Код привязок Π²Ρ‹Π΄Π΅Π»Π΅Π½ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ crate-ΠΏΠ°ΠΊΠ΅Ρ‚ Β«bindingsΒ», Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ пСрСсборку Π² случаС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² основной ΠΏΠ°ΠΊΠ΅Ρ‚ Β«kernelΒ».
  • РСализация макроса Β«concat_idents!Β» пСрСписана Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса, Π½Π΅ привязанного ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ concat_idents ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ссылок Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.
  • ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Π½ макрос Β«static_assert!Β», Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Β«core::assert!()Β» Π² любом контСкстС вмСсто констант.
  • ΠœΠ°ΠΊΡ€ΠΎΡ Β«build_error!Β» Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈ выставлСнии для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ€Π΅ΠΆΠΈΠΌΠ° Β«RUST_BUILD_ASSERT_{WARN,ALLOW}Β».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с настройками Β«kernel/configs/rust.configΒ».
  • ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π² макроподстановках Ρ„Π°ΠΉΠ»Ρ‹ Β«*.iΒ» ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ‹ Π² Β«*.rsiΒ».
  • ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сборки Rust-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с уровнями ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ примСняСмых для ΠΊΠΎΠ΄Π° Π½Π° языкС Π‘ΠΈ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ fs, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ обвязки для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ систСмами. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простой Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, написанной Π½Π° языкС Rust.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ workqueue для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с систСмными очСрСдями (прСдоставляСт обвязки Π½Π°Π΄ структурами ядра work_struct ΠΈ workqueue_struct).
  • ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΎ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ модуля kasync с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² асинхронного программирования (async). Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра TCP-сСрвСра, написанного Π½Π° Rust.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π° языкС Rust ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ [Threaded]Handler ΠΈ Ρ‚ΠΈΠΏΠΎΠ² [Threaded]Registration`.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос Β«#[vtable]Β», ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ структура file_operations.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° рСализация Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… связных списков Β«unsafe_list::ListΒ».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° RCU (Read-copy-update) ΠΈ Ρ‚ΠΈΠΏ Guard для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ привязки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция Task::spawn() для создания ΠΈ автоматичСского запуска ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ядра. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Task::wake_up().
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ delay, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ (ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° Π½Π°Π΄ msleep()).

Parobahan anu diusulkeun ngamungkinkeun ngagunakeun Rust salaku basa kadua pikeun ngembangkeun supir sareng modul kernel. Pangrojong Rust dipidangkeun salaku pilihan anu henteu diaktipkeun sacara standar sareng henteu ngakibatkeun citakan Rust diantara katergantungan ngawangun anu diperyogikeun pikeun kernel. Ngagunakeun Rust pikeun ngembangkeun drivers bakal ngidinan Anjeun pikeun nyieun supir aman tur hadΓ© kalawan usaha minimal, bΓ©bas tina masalah kayaning ngakses wewengkon memori sanggeus dibΓ©baskeun, dereferencing null pointers, sarta overruns panyangga.

Kasalametan memori disadiakeun dina Rust dina waktos compile ngaliwatan mariksa rujukan, ngalacak kapamilikan obyΓ©k sarta hirupna objΓ©k (wengkuan), kitu ogΓ© ngaliwatan evaluasi correctness aksΓ©s memori salila palaksanaan kode. Karat ogΓ© nyadiakeun panyalindungan ngalawan overflows integer, merlukeun variabel bisa initialized samΓ©mΓ©h pamakΓ©an, handles kasalahan hadΓ© dina perpustakaan baku, nerapkeun konsΓ©p rujukan immutable sarta variabel sacara standar, sarta nawarkeun ketikan statik kuat pikeun ngaleutikan kasalahan logis.

sumber: opennet.ru

Tambahkeun komentar