Восьмая версія патчаў для ядра Linux з падтрымкай мовы 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 і развіццю тэхналогій для павышэння абароненасці інтэрнэту.

У новай версіі:

  • Інструментарый і варыянт бібліятэкі 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()).

Прапанаваныя змены даюць магчымасць выкарыстоўваць Rust у якасці другой мовы для распрацоўкі драйвераў і модуляў ядра. Падтрымка Rust падаецца як опцыя, не актыўная па змаўчанні і не якая прыводзіць да ўключэння Rust у лік абавязковых зборачных залежнасцяў да ядра. Выкарыстанне Rust для распрацоўкі драйвераў дазволіць з мінімальнымі намаганнямі ствараць бяспечныя і больш якасныя драйверы, пазбаўленыя ад такіх праблем як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў і выхад за межы буфера.

Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі і ўлік часу жыцця аб'ектаў (вобласці бачнасці), а таксама праз адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.

Крыніца: opennet.ru

Дадаць каментар