Для включения в состав ядра Linux 6.15, релиз которого ожидается в конце мая, предложен набор патчей с начальной реализацией драйвера Nova для GPU NVIDIA, написанного на языке Rust. На первом этапе в ядро передан каркас nova-core, насчитывающий около 400 строк кода и реализующий базовый уровень абстракций над программными интерфейсами прошивок GSP. Помимо nova-core в состав патча включены некоторые обвязки, необходимые для работы драйверов с прошивками.
На следующем этапе в ядро планируют включить DRM-драйвер nova-drm (Direct Rendering Manager) для взаимодействия с GPU из пространства пользователя, а также VFIO-драйвер с менеджером vGPU, позволяющим использовать виртуальные GPU NVIDIA в системах виртуализации.
Драйвер Nova рассчитан на использование с GPU NVIDIA, оснащёнными GSP-прошивками, которые используются начиная с серии NVIDIA GeForce RTX 2000 на базе микроархитектуры Turing. В подобных GPU операции инициализации и управления реализованы в прошивке и выполняются отдельным микроконтроллером GSP (GPU System Processor). Предполагается, что в долгосрочной перспективе Nova заменит собой драйвер Nouveau для GPU с поддержкой GSP.
Проект развивается сотрудниками компании Red Hat с целью избавиться от усложнений, свойственных драйверу Nouveau. Значительное упрощение достигается благодаря задействованию готовых обработчиков, предоставляемых прошивкой GSP и отбрасыванию груза по поддержке старых GPU.
Nova также позволит решить архитектурные проблемы, которые в Nouveau требуют существенной переработки кодовой базы, например, проблемы с блокировками в коде VMM/MMU. Язык Rust выбран для снижения вероятности совершения ошибок при работе с памятью, и как возможность совместить работу над рабочим драйвером с созданием обвязок и абстракций для разработки драйверов на Rust.
Помимо Nova для ядра Linux на языке Rust развиваются драйверы для GPU Apple AGX (drm-asahi), NVMe(rnvme) и Android Binder. Компания Cisco развивает на Rust файловую систему PuzzleFS для ядра Linux. Уже приняты в состав ядра генератор QR-кодов для экрана аварийной остановки работы, драйвер блочных усторойств rnull (замена null_blk) и драйвер ax88796b_rust для PHY-интерфейса Ethernet-контроллера ASIX AX887xx.
Цели продвижения Rust в ядро Linux:
- Написание нового кода на языке Rust снизит риск ошибок при работе с памятью и состояний гонки, а также исключит некоторые логические ошибки.
- Мэйнтейнерам будет проще рецензировать изменения и проводить рефакторинг модулей с учётом гарантий, предоставляемых языком Rust.
- Наличие абстракций, использующих продвинутые возможности языка Rust, упростит создание новых драйверов и модулей.
- Поддержка современного языка привлечёт к разработке ядра новых участников.
- Применение возможностей инструментария Rust упростит выполнение требований к документированию кода. Например, в проекте Rust for Linux введено требование по обязательному документированию публичных API, требований к безопасности, unsafe-блоков и инвариантов типов.