Ник Десанье (Nick Desaulniers), занимающийся в Google обеспечением поддержки сборки ядра Linux с использованием компилятора Clang и также помогающий исправлять ошибки в компиляторе Rust, предложил провести на конференции Linux Plumbers Conference 2020 сессию для обсуждения предоставления возможности разработки компонентов ядра на языке Rust. Ник занимается проведением микро-конференции, посвящённой LLVM, и считает, что было бы неплохо обсудить технические аспекты возможной интеграции поддержки Rust в ядро (им уже подготовлен рабочий прототип для KBuild) и понять нужно ли вообще добавлять такую поддержку и какие ограничения по использованию Rust следует принять.

Напомним, что в недавней дискуссии на конференции «Open Source Summit and Embedded Linux» Линус Торвальдс не исключил появление привязок для разработки неосновных подсистем ядра (например, драйверов) на таких языках как Rust. Возможность разработки драйверов на языке Rust позволила бы с минимальными усилиями создавать безопасные и более качественные драйверы, избавленные от таких проблем, как обращение к области памяти после её освобождения, разыменование нулевых указателей и выход за границы буфера. Уже существует несколько сторонних проектов по реализации такой возможности:

  • Разработчики из компании «Fish in a Barrel» подготовили инструментарий для написания загружаемых модулей для ядра Linux на языке Rust, используя для повышения защиты набор абстрактных прослоек над интерфейсами и структурами ядра. Прослойки автоматически генерируются на базе имеющихся заголовочных файлов ядра при помощи утилиты bindgen. Для сборки прослоек используется Clang. Собираемые модули помимо прослоек используют пакет staticlib.
  • Исследователи из Китайского университета в Гонконге развивают проект для разработки на Rust драйверов для встраиваемых систем и устройств интернета вещей, который также использует bindgen для генерации прослоек на основе заголовочных файлов ядра. Фреймворк позволяет добиться повышения безопасности драйверов без внесения изменений в ядро — вместо создания в ядре дополнительных уровней изоляции для драйверов, предлагается блокировать проблемы на этапе компиляции, применяя более безопасный язык Rust. Предполагается, что подобный подход может оказаться востребован производителями оборудования, разрабатывающими проприетарные драйверы на скорую руку без проведения должного аудита.
  • Разработчики фреймворка C2Rust для трансляции Си-кода на Rust, проводят эксперименты по преобразованию модулей ядра с минимальными ручными правками. Из проблем отмечается применение во многих частях ядра кода, в котором используются расширения GCC, пока не поддерживаемые в C2Rust. Для решения данной проблемы в C2Rust планируется добавить поддержку GCC атрибутов inline, cold, alias, used и section, а также расширить возможности inline-ассемблера и решить проблемы со структурами, которые одновременно выровнены и упакованы (например, xregs_state). Из существенных проблем, требующих ручной работы, отмечается невозможность транслировать нетривиальные Си-макросы в макросы Rust и необходимость переопределения типов, так как C2Rust транслирует Си-типы в определения в пакете libc, но этот пакет нельзя использовать в модулях ядра.

Дополнение: Идею поддержал Грег Кроа-Хартман (Greg Kroah-Hartman), отвечающий за поддержку стабильной ветки ядра Linux, а также являющимся мэинтейнером ряда подсистем ядра Linux (USB, driver core) и основателем инициативы по разработке драйверов для Linux (Linux driver project). Высказался в комментариях и Линус Торвальдс.