Трэцяя рэдакцыя патчаў для ядра Linux з падтрымкай мовы Rust

Мігель Охеда (Miguel Ojeda), аўтар праекта Rust-for-Linux, прапанаваў для разгляду распрацоўшчыкамі ядра Linux трэці варыянт кампанентаў для распрацоўкі драйвераў прылад на мове Rust. Падтрымка Rust разглядаецца як эксперыментальная, але ўжо ўзгоднена для ўключэння ў галінку linux-next. Распрацоўка фінансуецца кампаніяй Google і арганізацыяй ISRG (Internet Security Research Group), якая з'яўляецца заснавальнікам праекту Let’s Encrypt і спрыяе пасоўванню HTTPS і развіццю тэхналогій для падвышэння абароненасці інтэрнэту.

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

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

У новым варыянце патчаў працягнута ўхіленне заўваг, выказаных падчас абмеркаванняў першай і другой версій патчаў. Найбольш прыкметныя змены:

  • Ажыццёўлены пераход на выкарыстанне ў якасці эталоннага кампілятара стабільнага выпуску Rust 1.57 і забяспечана прывязка да стабілізаванай рэдакцыі мовы Rust 2021. Раней патчы былі завязаныя на бэта-галінку Rust і выкарыстоўвалі некаторыя магчымасці мовы, якія ўваходзяць у катэгорыю нестабільных. Пераход на спецыфікацыю Rust 2021 дазволіў ініцыяваць працу па сыходзе ад выкарыстання ў патчах такіх нестабільных магчымасцяў, як const_fn_transmute, const_panic, const_unreachable_unchecked і core_panic і try_reserve.
  • Працягнута развіццё ўваходнага ў склад патчаў варыянту Rust-бібліятэкі alloc, змененай для збавення функцый размеркавання памяці ад магчымых генерацый стану "panic" пры ўзнікненні памылак, такіх як недахоп памяці. У новай версіі рэалізаваны опцыі "no_rc" і "no_sync" для адключэння функцыянальнасці, не выкарыстоўванай у Rust-кодзе для ядра, якія робяць бібліятэку больш модульнай. Працягваецца праца з асноўнымі распрацоўшчыкамі alloc, накіраваная на перанос неабходных для ядра змены ў асноўны склад бібліятэкі. У базавую бібліятэку Rust (core) перанесена опцыя "no_fp_fmt_parse", неабходная для працы бібліятэкі на ўзроўні ядра.
  • Праведзена чыстка кода для збавення ад магчымых папярэджанняў кампілятара пры зборцы ядра ў рэжыме CONFIG_WERROR. Пры зборцы кода на мове Rust уключаны дадатковыя дыягнастычныя рэжымы кампілятара і папярэджанні лінтара Clippy.
  • Прапанаваны абстракцыі для выкарыстання ў кодзе на мове Rust блакіровак seqlock (sequence locks), callback-выклікаў для кіравання харчаваннем, I/O Memory (readX/writeX), апрацоўшчыкаў перапыненняў і патокаў, GPIO, доступу да прылад, драйвераў і ўліковых дадзеных.
  • Пашыраны сродкі для распрацоўкі драйвераў з задзейнічаннем перамяшчаных мьютэксаў, бітавых ітэратараў, спрошчаных абвязак над паказальнікамі, палепшанай дыягностыкі збояў і інфраструктуры, незалежнай ад шыны дадзеных.
  • Палепшана праца са спасылкамі пры дапамозе спрошчанага тыпу Ref, які базуецца на бэкендзе refcount_t, які выкарыстоўвае аднайменны API ядра для падліку спасылак. Падтрымка тыпаў Arc і Rc, якія прадстаўляюцца ў штатнай бібліятэцы alloc, выдаленая і не даступная ў кодзе, выкананым на ўзроўні ядра (для самой бібліятэкі падрыхтаваны опцыі, якія адключаюць дадзеныя тыпы).
  • У склад патчаў дададзены варыянт драйвера PL061 GPIO, перапісаны на Rust. Асаблівасцю драйвера з'яўляецца тое, што яго рэалізацыя практычна парадкова паўтарае наяўны драйвер GPIO на мове Сі. Для распрацоўшчыкаў, якія жадаюць пазнаёміцца ​​са стварэннем драйвераў на Rust, падрыхтавана парадковае параўнанне, якое дазваляе зразумець у якія канструкцыі на Rust ператвораны код на Сі.
  • У асноўную кодавую базу Rust прыняты rustc_codegen_gcc, бэкенд rustc для GCC, які рэалізуе магчымасць папераджальнай (AOT) кампіляцыі з выкарыстаннем бібліятэкі libgccjit. Пры належным развіцці бэкенда ён дазволіць збіраць задзейнічаны ў ядры Rust-код пры дапамозе GCC.
  • Апроч кампаній ARM, Google і Microsoft, цікавасць да выкарыстання мовы Rust у ядры Linux выказала кампанія Red Hat. Нагадаем, што Google наўпрост забяспечвае падтрымку праекту Rust for Linux, развівае новую рэалізацыю механізму міжпрацэснага ўзаемадзеяння Binder на Rust і разглядае магчымасць перапрацоўкі на Rust розных драйвераў. Кампанія Microsoft прыступіла да рэалізацыі драйвераў для Hyper-V на Rust. Кампанія ARM працуе над паляпшэннем падтрымай Rust для сістэм на базе працэсараў ARM. Кампанія IBM рэалізавала падтрымку Rust у ядры для сістэм PowerPC.

Крыніца: opennet.ru

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