Прапанова па абмеркаванні пытання дадання ў ядро ​​Linux сродкаў для распрацоўкі на мове Rust

Нік Дзясанье (Nick Desaulniers), які займаецца ў Google забеспячэннем падтрымкі зборкі ядра Linux з выкарыстаннем кампілятара Clang і таксама які дапамагае выпраўляць памылкі ў кампілятары Rust, прапанаваў правесці на канферэнцыі Linux Plumbers Conference 2020 сесію для абмеркавання прадастаўлення магчымасці распрацоўкі кампанентаў ядра на мове Rust. Нік займаецца правядзеннем мікра-канферэнцыі, прысвечанай LLVM, і лічыць, што было б нядрэнна абмеркаваць тэхнічныя аспекты магчымай інтэграцыі падтрымкі Rust у ядро ​​(ім ужо падрыхтаваны працоўны прататып для KBuild) і зразумець ці трэба наогул дадаваць такую ​​падтрымку і якія абмежаванні па выкарыстанні Rust варта прыняць.

Нагадаем, што ў нядаўняй дыскусіі на канферэнцыі "Open Source Summit and Embedded Linux" Лінус Торвальдс не выключыў з'яўленне прывязак для распрацоўкі неасноўных падсістэм ядра (напрыклад, драйвераў) на такіх мовах як Rust. Магчымасць распрацоўкі драйвераў на мове Rust дазволіла б з мінімальнымі намаганнямі ствараць бяспечныя і больш якасныя драйверы, пазбаўленыя ад такіх праблем, як зварот да вобласці памяці пасля яе вызвалення, разнайменне нулявых паказальнікаў і выхад за межы буфера. Ужо існуе некалькі іншых праектаў па рэалізацыі такой магчымасці:

  • Распрацоўнікі з кампаніі «Fish in a Barrel» падрыхтавалі інструментар для напісання загружаных модуляў для ядра Linux на мове Rust, выкарыстаючы для падвышэння абароны набор абстрактных праслоек над інтэрфейсамі і структурамі ядра. Праслойкі аўтаматычна генеруюцца на базе наяўных загалоўкавых файлаў ядра пры дапамозе ўтыліты bindgen. Для зборкі праслоек выкарыстоўваецца Clang. Збіраныя модулі апроч праслоек выкарыстоўваюць пакет staticlib.
  • Даследнікі з Кітайскага ўніверсітэта ў Ганконгу развіваюць праект для распрацоўкі на Rust драйвераў для ўбудавальных сістэм і прылад інтэрнэту рэчаў, які таксама выкарыстоўвае bindgen для генерацыі праслоек на аснове загалоўкавых файлаў ядра. Фрэймворк дазваляе дамагчыся падвышэнні бяспекі драйвераў без занясення змен у ядро ​​— замест стварэння ў ядры дадатковых узроўняў ізаляцыі для драйвераў, прапануецца блакаваць праблемы на этапе кампіляцыі, ужываючы больш бяспечную мову Rust. Мяркуецца, што падобны падыход можа аказацца запатрабаваны вытворцамі абсталявання, якія распрацоўваюць прапрыетарныя драйверы на хуткую руку без правядзення належнага аўдыту.
  • Распрацоўнікі фрэймворка C2Rust для трансляцыі Сі-кода на Rust, праводзяць эксперыменты па пераўтварэнні модуляў ядра з мінімальнымі ручнымі праўкамі. З праблем адзначаецца ўжыванне ў шматлікіх частках ядра кода, у якім выкарыстоўваюцца пашырэнні GCC, пакуль не падтрымоўваныя ў C2Rust. Для рашэння дадзенай праблемы ў C2Rust плануецца дадаць падтрымку GCC атрыбутаў inline, cold, alias, used і section, а таксама пашырыць магчымасці inline-асэмблера і вырашыць праблемы са структурамі, якія адначасова выраўнаваны і спакаваныя (напрыклад, xregs_state). З істотных праблем, патрабавальных ручной працы, адзначаецца немагчымасць трансляваць нетрывіяльныя Сі-макрасы ў макрасы Rust і неабходнасць перавызначэння тыпаў, бо C2Rust транслюе Сі-тыпы ў азначэнні ў пакеце libc, але гэты пакет нельга выкарыстоўваць у модулях ядра.

Крыніца: opennet.ru

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