Пропозиція щодо обговорення питання додавання в ядро ​​Linux засобів для розробки мовою Rust

Нік Десанье (Нік Дезольньє), що займається в 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, але цей пакет не можна використовувати в модулях ядра.

Джерело: opennet.ru

Додати коментар або відгук