Мигель Охеда (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 в качестве второго языка для разработки драйверов и модулей ядра. Поддержка 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.