Через полгода после публикации второй версии, Мигель Охеда, автор проекта 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, что делает библиотеку более модульной. Мы продолжаем работать с разработчиками основного выделения для внесения необходимых изменений ядра в основную библиотеку. Параметр «no_fp_fmt_parse», необходимый для работы библиотеки на уровне ядра, был перемещен в базовую библиотеку (ядро) Rust.
Код очищен, чтобы удалить возможные предупреждения компилятора при компиляции ядра в режиме CONFIG_WERROR. Когда код создается в Rust, включаются дополнительные диагностические режимы компилятора и предупреждения Clippy linter.
Они предложили абстракции для использования секлоков (блокировка последовательности), обратные вызовы для управления питанием, ввод-вывод памяти (readX / writeX), обработчики прерываний и потоков, GPIO, доступ к устройствам, драйверы и учетные данные в коде ржавчины.
Расширены инструменты разработки драйверов. с использованием перемещаемых мьютексов, битовых итераторов, упрощенных привязок по указателям, улучшенной диагностики сбоев и инфраструктуры, не зависящей от шины данных.
Улучшена работа со ссылками с использованием типа 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.
Наконец, если вам интересно узнать об этом больше, вы можете ознакомиться с подробностями По следующей ссылке.