Через півроку після публікації другої версії, Мігель Охеда, автор проекту Rust-for-Linux, оприлюднив пропозицію третього варіанту для розробки драйверів пристроїв мовою Rust в ядрі Linux.
Підтримка Rust вважається експериментальною, але її включення до гілки linux-next вже узгоджено. Розробка фінансується Google і організацією ISRG (Internet Security Research Group), яка є засновником проекту Let's Encrypt і сприяє просуванню HTTPS і розвитку технологій для покращення безпеки в Інтернеті.
Слід пам’ятати, що запропоновані зміни дозволяють використовувати Rust як другу мову для розробки драйверів і модулів ядра.
Підтримка Rust рекламується як опція, яка не активна за замовчуванням і це не призводить до того, що Rust буде включено в необхідні базові залежності збірки. Використання Rust для розробки драйверів дозволить вам створювати кращі та безпечніші драйвери з мінімальними зусиллями, без клопоту з доступом до області пам’яті після звільнення, розіменування нульових покажчиків і перевищення лімітів буфера.
Нова версія патчів продовжує усувати коментарі, зроблені під час обговорення першої та другої версії виправлень, і найбільш помітні зміни, які ми можемо знайти:
Перейшов на Rust 1.57 стабільну версію як еталонний компілятор і забезпечено прив’язку до стабілізованої версії мови Rust 2021. Перехід на специфікацію Rust 2021 pдозволено почати роботу, щоб уникнути використання таких нестабільних функцій у таких патчах, як const_fn_transmute, const_panic, const_unreachable_unchecked і core_panic і try_reserve.
Це також виділяється тим, що розробка версії alloc продовжується з бібліотеки Rust, у новій версії, параметри "no_rc" і "no_sync" реалізовані для вимкнення функціональності який не використовується в коді Rust для ядра, що робить бібліотеку більш модульною. Ми продовжуємо працювати з основними розробниками alloc, щоб внести необхідні зміни в основну бібліотеку. Параметр «no_fp_fmt_parse», необхідний для функціонування бібліотеки на рівні ядра, переміщено в базову бібліотеку (ядро) Rust.
Код очищено, щоб видалити можливі попередження компілятора під час компіляції ядра в режимі CONFIG_WERROR. Коли код створюється в Rust, додаються додаткові режими діагностики компілятора та попередження про лінтер Clippy.
Вони запропонували абстракції для використання seqlocks (блокування послідовності), виклики зворотного виклику для керування живленням, введення-виводу пам'яті (readX / writeX), обробники переривань і потоків, GPIO, доступ до пристроїв, драйвери та облікові дані в коді rust.
Інструменти розробки драйверів були розширені з використанням переміщуваних мьютексів, бітових ітераторів, спрощених прив’язок над покажчиками, покращеної діагностики несправностей та незалежної інфраструктури шини даних.
Покращено роботу з посиланнями за допомогою типу Ref спрощено, на основі бекенда refcount_t, який використовує центральний API з такою ж назвою для підрахунку посилань. Підтримка типів Arc і Rc, яка надається в стандартній бібліотеці відображення, була вилучена і недоступна в коді, що виконується на рівні ядра (для самої бібліотеки були підготовлені параметри для відключення цих типів).
До патчів додано версію драйвера PL061 GPIO, переписану на Rust. Особливістю драйвера є те, що його майже порядкова реалізація повторює існуючий драйвер C GPIO. Для розробників, які хочуть познайомитися з контролерами побудови в Rust, підготовлено порядкове порівняння, яке дає уявлення про те, якими збірками в Rust став код C.
Основна кодова база Rust використовує rustc_codegen_gcc, бекенд rustc для GCC, який реалізує компіляцію AOT за допомогою бібліотеки libgccjit. При належній розробці бекенда це дозволить вам збирати код Rust, задіяний в ядрі, за допомогою GCC.
Крім ARM, Google і Microsoft, Red Hat виявила зацікавленість у використанні Rust в ядрі Linux.
Нарешті, якщо вам цікаво дізнатися більше про це, ви можете ознайомитися з деталями У наступному посиланні.