Rust в Linux: где мы находимся и куда идем дальше
Шаг за шагом язык программирования Rust все глубже проникает в ядро Linux.
На конференции Linux Plumbers в Ричмонде, штат Вирджиния, разработчик Linux и Rust Мигель Охеда предоставил разработчикам ядра Linux обновленную информацию о состоянии Rust в ядре Linux. Короче говоря, Rust Linux продолжает развиваться и получает мощную поддержку со стороны разработчиков и поставщиков, таких как Cisco, Samsung и Canonical.
Конечно, Rust присутствует в Linux с тех пор, как Линус Торвальдс благословил этот безопасный для памяти язык на выпуск Linux 6.1. Однако сейчас Rust предпринимает шаги, необходимые для того, чтобы стать — наряду с C — полноценным членом набора инструментов языка Linux.
Такая оценка объясняется тем, что, как сказал инженер-программист Microsoft Уэдсон Алмейда Фильо: «Мы чувствуем, что Rust теперь готов присоединиться к C в качестве практического языка для реализации ядра. Это может помочь нам уменьшить количество потенциальных ошибок и уязвимостей безопасности в привилегированных средах». код, при этом прекрасно взаимодействуя с ядром ядра и сохраняя его характеристики производительности».
В частности, как объяснили Алекс Гейнор и Джеффри Томас на саммите Linux Security Summit в 2019 году, почти две трети дыр в безопасности ядра Linux происходят из-за проблем с безопасностью памяти. И откуда берутся эти ошибки? Неотъемлемые недостатки C и C++. С другой стороны, Rust позволяет избежать этих проблем за счет использования гораздо более безопасных интерфейсов прикладного программирования (API).
Это не значит, что мы уже готовы отказаться от C для Rust. На самом деле, этот день вряд ли когда-нибудь наступит. Но Rust определенно находится на пути к тому, чтобы стать важным языком разработки Linux.
Прежде чем мы достигнем этой цели, нам предстоит преодолеть некоторые трудности. Как сказал Охеда на мероприятии, хотя «основная команда выросла за счет новых членов», предстоит еще много работы.
Эти усилия начинаются с инструментов программирования для Rust в Linux. Некоторые дистрибутивы уже принимают Rust с распростертыми объятиями. Например, Ubuntu теперь предоставляет «все необходимые инструменты и требования к ядру для сборки и тестирования внешних модулей ядра».
Сегодня существует три основных набора инструментов Linux Rust. Первый из них — это код GCC для Rusc. Этот набор инструментов компилируется и может загружать основные версии Rust и Linux без изменения исходного кода.
Кроме того, есть интерфейс GCC для Rust, который можно загрузить с помощью существующего интерфейса Rust, но он получает преимущества от оптимизации GCC. К сожалению, этот проект все еще представляет собой альфа-код. Наконец, есть Coccinelle для Rust. Coccinelle — это инструмент для создания крупномасштабного исходного кода ядра Linux C, и Coccinelle for Rust стремится привнести эту мощь в кодовые базы Rust.
Что касается повседневной работы, необходимой для полной интеграции Rust с Linux, «официальным» веб-сайтом инициативы теперь является самоочевидный Rust для Linux. Этот сайт — ваш универсальный источник всего, что касается Rust в Linux.
Исходная ветка кода Rust, разработка которой велась в течение двух лет, удалена. Код все еще существует, но он заморожен и заархивирован. В дальнейшем,rust-next станет веткой, содержащей новые функции Rust, которые будут представлены во время следующего окна слияния ядра Linux. Эта ветка, как следует из названия, является частью Linux Next.
Между тем, Rust-fixes — это ветка, содержащая исправления Rust для текущего цикла ядра Linux. Кроме того, Rust-dev — это экспериментальная ветка для целей интеграции. Это очередь патчей, которые «выглядят достаточно хорошо», чтобы ими можно было поделиться и поработать.
Однако движение вперед не было простым. Разработчики Rust для Linux обнаружили некоторые проблемы. Например, хотя взаимоблокировки, когда два или более потоков ожидают завершения другого, безопасны в Rust, поскольку они не приводят к неопределенному поведению, они небезопасны в ядре Linux. Программисты работают над решением этой проблемы.
Разработчиков также беспокоит, как поступить с версиями Rust. Сегодня разработчики не могут гарантировать, что новые версии Rust будут работать в Linux, поскольку последняя версия Rust Linux совместима с некоторыми нестабильными функциями. Будут ли эти функции в следующей версии Rust? Будут ли они обратно совместимы? Следите за обновлениями.
На данный момент программисты Linux Rust отслеживают последнюю версию компилятора Rust. Это довольно необычный подход для ядра, где в названии игры обычно используется старый, проверенный код.
С этим связана растущий интерес к переносу поддержки Rust в версии Linux с долгосрочной поддержкой (LTS), в частности 5.15 и 6.1. Некоторые люди особенно проявляют интерес к ядру Super LTS Linux 6.1. Однако Linux обычно не допускает обратного переноса в LTS Linux. Итак, если вам действительно нужна полнофункциональная поддержка Rust в старом ядре LTS, вам придется так или иначе заплатить за нее.
Еще одно общее правило, которое разработчики Rust решили попытаться «нарушить», — это правило против дублирования драйверов. Обычно никто не хочет, чтобы кто-то тратил время на изобретение велосипеда, но некоторые сопровождающие открыты для идеи экспериментировать с Rust, начиная с простого драйвера, с которым они уже знакомы.
Тем не менее, другие выразили заинтересованность в написании драйверов Rust, но необходимых абстракций нет, и слияние нарушит правило «нет кода без ожидаемого пользователя в дереве». Итак, Охеда и его веселая команда разработчиков Rust запросили исключение для драйверов Rust.
Эти движения — небольшие шаги вперед, но все они имеют решающее значение для того, чтобы сделать Rust равным C как языку программирования Linux. Учитывая высокий интерес, который я увидел в Plumbers, я вполне ожидаю, что Rust в конечном итоге туда доберется.