Несколько дней назад, Мигель Охеда, ответственный за разработку и подачу данных предложений и автор проекта Rust-for-Linux представила предложение седьмого компонента для разработки драйверов устройств Ржавчина для разработчиков ядра Linux.
Это седьмая редакция патчей и до которого даже поддержка Rust считается экспериментальной, но она уже включена в ветку linux-next и достаточно зрела, чтобы начать работать над созданием слоев абстракции над подсистемами ядра, а также писать контроллеры и модули. Разработка финансируется Google и ISRG (Internet Security Research Group), которая является основателем проекта Let’s Encrypt и продвигает HTTPS и разработку технологий для повышения интернет-безопасности.
Предлагаемые изменения позволяют использовать Rust в качестве второго языка для разработки драйверов и модулей ядра. Поддержка Rust представлена как опция, которая не включена по умолчанию и не приводит к включению Rust в число необходимых зависимостей сборки для ядра. Использование Rust для разработки драйверов позволит вам создавать более качественные и безопасные драйверы с минимальными усилиями, без проблем, таких как доступ к области памяти после ее освобождения, разыменование нулевых указателей и переполнение буфера.
Основные нововведения в седьмом предложении
Это новое предложение подчеркивает, что набор инструментов и вариант библиотеки alloc, что устранило возможную генерацию состояния "паника" при ошибках, обновлен до версии Rust 1.60 и тем самым стабилизирует поддержку режима «may_uninit_extra», используемого в исправлениях ядра.
В дополнение к этому отмечается, что добавлена возможность запускать тесты из документации (тесты, используемые одновременно в качестве примеров в документации), путем преобразования тестов времени компиляции, привязанных к API ядра, в тесты KUnit, которые запускаются во время загрузки ядра. Тесты должны не выдавать предупреждение Clippy linter, как это делается в основном коде Rust.
Более того предлагается начальная реализация модуля «net» с сетевыми функциями. Код Rust обеспечивает доступ к сетевым структурам ядра, таким как "Namespace" (на основе структуры ядра "struct net"), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) и его эквиваленты IPv6.
задний конец Rustc_codegen_gcc, реализована возможность запуска компилятора rustc. Ввод в эксплуатацию компилятора относится к способности rustc использовать генератор кода на основе GCC для сборки компилятора rustc.
Кроме того, недавний выпуск GCC 12.1 включает исправления в libgccjit, необходимые для правильной работы rustc_codegen_gcc. Идет подготовка к предоставлению возможности установки rustc_codegen_gcc с помощью утилиты rustup.
Из другие изменения, которые выделяются этой новой версии:
- Реализована начальная поддержка методов асинхронного программирования (async), реализованная в виде модуля kasync.
- Добавлен модуль net::filter для управления фильтрами сетевых пакетов. Добавлен пример rust_netfilter.rs с реализацией фильтра на языке Rust.
- Добавлена реализация простого мьютекса smutex::Mutex, не требующего закрепления.
- Добавлена блокировка NoWaitLock, которая никогда не ждет освобождения, и если она занята другим потоком, попытка получить блокировку вместо остановки вызывающего объекта завершается неудачно.
- Добавлена блокировка RawSpinLock, определяемая raw_spinlock_t в ядре, которая применяется к разделам, которые не могут простаивать.
- Добавлен тип ARef для ссылок на объекты, к которым применяется механизм подсчета ссылок (всегда опровергается).
- Наблюдается прогресс в разработке внешнего интерфейса GCC gccrs с реализацией компилятора языка Rust на основе GCC. В настоящее время над gccrs работают два штатных разработчика.
В конце концов Если вам интересно узнать об этом больше, вы можете проверить детали в по следующей ссылке.