Напомним, что предложенные изменения дают возможность использовать 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.
Источник: https://www.opennet.ru/opennews/art.shtml?num=55443
(opennet.ru, основная лента)