Линус Торвальдс и Грег Кроа-Хартман поделились своими мнениями о том, как они видят работу на Rust в Linux. Ядро Linux написано на C, но Rust постепенно получает поддержку для использования в качестве системного языка.
В 2020 году разработчики ядра Linux всерьез задумались об использовании Rust для нового встроенного кода. В марте этого года в состав ветки linux-next, на основе которой будет сформирован выпуск ядра Linux 5.13, включили начальный набор компонентов для разработки драйверов устройств на Rust. Отдельно опубликована документация по использованию Rust в ядре Linux и пример модуля ядра с драйвером символьного устройства на Rust. Код добавил мейнтейнер ветки Стивен Ротвелл.
Amazon Web Services (AWS) недавно выпустила Bottlerocket Linux с Rust. Самарта Чандрашекхар, менеджер по продуктам AWS, сказал, что это «помогает обеспечить безопасность потоков и предотвратить ошибки, связанные с памятью, такие как переполнение буфера, которые могут привести к уязвимостям безопасности». На саммите Linux Security Summit 2019 Алекс Гейнор и Джеффри Томас заявляли, что около двух третей уязвимостей ядра Linux связаны с проблемами безопасности памяти.
Между тем Сильвестр Ледру, директор Mozilla ??и разработчик Debian Linux, портировал версию Coreutils на Rust на Linux с помощью LLVM. Coreutils — это основные утилиты оболочки GNU. С их помощью Ледру загрузил Linux и запустил самые популярные пакеты Debian.
Разработчик Linux Нельсон Эльхаге, подводя итоги встречи по Rust, добавил, что сторонники этого языка не «предлагают переписать ядро ??Linux на Rust; они сосредоточены только на движении к тому, что может быть написан новый код».
Однако при обсуждении поддержки Rust возникают следующие опасения: как будет реализовано использование существующих API-интерфейсов в ядре, поддержка архитектуры и совместимость бинарного интерфейса приложения (ABI) между Rust и C.
Торвальдс говорит, что ему интересен этот проект, но он уверен, что его продвигают энтузиасты Rust, и нужно посмотреть, как он «работает на практике». Создатель ядра Linux отметил, что он «открыт для нововведений, учитывая обещанные преимущества безопасности, но также понимает, что иногда обещания не сбываются».
Торвальдс отмечает: «Первая цель для Rust — это драйверы просто потому, что там вы найдете множество различных возможных путей реализации». По его словам, «многие драйверы актуальны только для пары целевых архитектур, поэтому проблема с кодом Rust, не поддерживаемым на некоторых архитектурах, не столь важна».
Кроа-Хартман соглашается, что «драйверы, вероятно, являются первым местом для подобных попыток, поскольку они зависят от функциональности ядра, но от них ничего не зависит».
Торвальдс подчеркивает, что некоторым не по душе идея использования Rust в пользовательском пространстве. Кроа-Хартман добавляет, что «все будет сводиться к тому, насколько хорошо взаимодействие между структурами ядра и правилами времени, написанными на C, может быть отображено в структурах Rust и правилах времени жизни для драйверов» на этом языке.
В обсуждении пользователи согласились с тем, что драйверы были бы хорошим полем для Rust, однако многие из них не видят смысла уходить от С в коде ядра.
В прошлом году Торвальдс уже допускал, что для вещей, «не являющихся центральными для самого ядра», тех же драйверов, могут появиться интерфейсы, в том числе, на Rust. «Я уверен, что это произойдет. Это может быть и не Rust. Но случится так, что у нас будут разные модели для написания подобных вещей, и C не будет единственной», — говорил он.
Позднее Кроа-Хартман подтвердил, что в разрешении использования Rust для написания кода ядра наблюдается прогресс. По его словам, ожидается «несколько интересных взаимодействий с имеющимися у нас объектами C».
В феврале этого года AWS, Huawei, Google, Microsoft и Mozilla создали некоммерческую организацию Rust Foundation, которая займется развитием этого языка программирования. Бюджет на два года работы составит $1 млн.
leventov
Что такое "правила времени"?
AlexBrown
Очевидно, библиотеки (RTL).
Гугл транслейт такой транслейт…
fedorro
«lifetime rules» — видимо правила управления временем жизни переменных и прочего. Не понятно подружится ли код ядра Linux и правила владения\времени жизни из Раста.
lain8dono
Управление временем жизни надо полагать. В rust есть возможность такое указать для некоторых штук.
Например возьмём динамический массив в куче. Потом берём ссылку на один из элементов массива. И мы можем доказать, что ссылка на элемент массива не переживёт сам элемент массива. А самое главное — это проверяется на этапе компиляции. Это важно, поскольку если у нас получится невалидная ссылка, то она в какой-то момент может указывать не только на другой элемент, но и вообще на не связанную с массивом память.
Это лишь простой пример, но это работает для всего в Rust.
leventov
Я знаю про lifetime rules в Rust, но тогда остается загадочной фраза "правилами времени, написанными на C"
lain8dono
Сама концепция lifetime существует вне контекста Rust. Равно как и проблемы, связанные с несоблюдением этих штук. В Rust просто есть возможность проверять это всё на этапе компиляции.
soniq
В расте «правила времени» заложены в основу языка. Си же не накладывает никаких ограничений, так что разработчики ядра линукс изобрели свои методы и правила. Мистер Хартман говорит, что успех раста в ядре линукс в основном зависит от того, как эти два подхода удастся подружить.