Вторая редакция патчей для ядра Linux с поддержкой языка Rust
5 июля 2021 года
Мигель Охеда ( Miguel Ojeda), автор проекта Rust-for-Linux, предложил для рассмотрения разработчиками ядра Linux обновлённый вариант компонентов для разработки драйверов устройств на языке Rust. Поддержка Rust рассматривается как экспериментальная, но уже согласована для включения в ветку linux-next. В новом варианте устранены замечания, высказанные в процессе обсуждения первой версии патчей. Линус Торвальдс уже подключился к обсуждению и предложил изменить логику обработки некоторых битовых операций.
Напомним, что предложенные изменения дают возможность использовать Rust в качестве второго языка для разработки драйверов и модулей ядра. Поддержка Rust преподносится как опция, не активная по умолчанию и не приводящая к включению Rust в число обязательных сборочных зависимостей к ядру. Использование Rust для разработки драйверов позволит с минимальными усилиями создавать безопасные и более качественные драйверы, избавленные от таких проблем как обращение к области памяти после её освобождения, разыменование нулевых указателей и выход за границы буфера.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами и учёт времени жизни объектов (области видимости), а также через оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Наиболее заметные изменения в новой версии патчей:
- Код для распределения памяти избавлен от возможных генераций состояния "panic" при возникновении ошибок, таких как нехватка памяти.
В состав включён вариант Rust-библиотеки alloc, в которой переделан код для обработки сбоев, но конечной целью является перенос в основную редакцию alloc всех возможностей, необходимых для ядра (изменения уже подготовлены и переданы в состав стандартной библиотеки Rust).
- Вместо ночных сборок для компиляции ядра с поддержкой Rust теперь можно использовать бета выпуски и стабильные релизы компилятора rustc.
В настоящий момент в качестве эталонного компилятора используется rustc 1.54-beta1, но после выхода релиза 1.54 в конце месяца, в качестве эталонного будет поддерживаться именно он.
- Добавлена поддержка написания тестов с использованием штатного для Rust атрибута "#[test]" и возможность применения doctests для документирования тестов.
- Добавлена поддержка архитектур ARM32 и RISCV в дополнение к ранее поддерживаемым x86_64 и ARM64.
- Улучшены реализации GCC Rust (GCC-фронтэнда для Rust) и rustc_codegen_gcc (бэкенд rustc для GCC), который теперь проходит все базовые тесты.
- Преложен новый уровень абстракции для использования в программах на языке Rust механизмов ядра, написанных на языке Си, таких как красно-чёрное дерево, объекты с подсчётом ссылок, создание файловых дескрипторов, задачи, файлы и векторы ввода/вывода.
- В компонентах для разработки драйверов улучшена поддержка модуля
" file_operations", макроса "module!", регистрации макросов и рудиментарных драйверов (probe и remove).
- В Binder реализована поддержка передачи файловых дескрипторов и LSM-хуков.
- Предложен более функциональный пример драйвера на Rust - bcm2835-rng для аппаратного генератора случайных чисел плат Raspberry Pi.
Дополнительно упоминаются проекты некоторых компаний, связанные с использованием Rust в ядре:
- Компания Microsoft выразила интерес к участию в работе по интеграции поддержки Rust в ядро Linux и готова в ближайшие месяцы предоставить реализации драйверов для Hyper-V на Rust.
- Компания ARM работает над улучшением поддержи Rust для систем на базе процессоров ARM. Проекту Rust уже предложены изменения, переводящие 64-разрядные системы ARM в число платформ первого уровня поддержки (Tier-1).
- Компания Google напрямую обеспечивает поддержку проекта Rust for Linux, развивает новую реализацию механизма межпроцессного взаимодействия Binder на Rust и рассматривает возможность переработки на Rust различных драйверов. Через ISRG (Internet Security Research
Group) компания Google обеспечила финансирование работы по интеграции в ядро Linux поддержки Rust.
- Компания IBM реализована поддержку Rust в ядре для систем PowerPC.
- Лаборатория LSE (Systems
Research Laboratory) разработала SPI-драйвер на Rust.
Источники
[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.