Третя редакція патчів для ядра Linux із підтримкою мови Rust

Мігель Охеда (Miguel Ojeda), автор проекту Rust-for-Linux, запропонував для розгляду розробниками ядра Linux третій варіант компонентів розробки драйверів пристроїв на мові Rust. Підтримка Rust розглядається як експериментальна, але вже узгоджена для включення у гілку linux-next. Розробка фінансується компанією Google та організацією ISRG (Internet Security Research Group), яка є засновником проекту Let's Encrypt та сприяє просуванню HTTPS та розвитку технологій для підвищення захищеності інтернету.

Нагадаємо, що запропоновані зміни дають можливість використовувати Rust як другу мову для розробки драйверів та модулів ядра. Підтримка Rust подається як опція, не активна за замовчуванням і не призводить до включення Rust до обов'язкових складальних залежностей до ядра. Використання Rust для розробки драйверів дозволить з мінімальними зусиллями створювати безпечні та якісніші драйвери, позбавлені таких проблем як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків та вихід за межі буфера.

Безпечна робота з пам'яттю забезпечується в Rust під час компіляції через перевірку посилань, відстеження володіння об'єктами та облік часу життя об'єктів (області видимості), а також оцінку коректності доступу до пам'яті під час виконання коду. Rust також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

У новому варіанті патчів продовжено усунення зауважень, висловлених у процесі обговорення першої та другої версій патчів. Найбільш помітні зміни:

  • Здійснено перехід на використання як еталонний компілятор стабільного випуску Rust 1.57 та забезпечено прив'язку до стабілізованої редакції мови Rust 2021. Раніше патчі були зав'язані на бета-гілку Rust та використовували деякі можливості мови, що входять до категорії нестабільних. Перехід на специфікацію Rust 2021 дозволив ініціювати роботу з уникнення використання в патчах таких нестабільних можливостей, як const_fn_transmute, const_panic, const_unreachable_unchecked і core_panic і try_reserve.
  • Продовжено розвиток входить до складу патчів варіанта Rust-бібліотеки alloc, зміненої для позбавлення функцій розподілу пам'яті від можливих генерацій стану "panic" при виникненні помилок, таких як брак пам'яті. У новій версії реалізовані опції "no_rc" і "no_sync" для відключення функціональності, що не використовується в Rust-коді для ядра, що роблять бібліотеку більш модульною. Продовжується робота з основними розробниками alloc, націлена на перенесення необхідних для ядра зміни до основного складу бібліотеки. До базової бібліотеки Rust (core) перенесено опцію «no_fp_fmt_parse», необхідну для роботи бібліотеки на рівні ядра.
  • Проведено чищення коду для позбавлення від можливих попереджень компілятора під час збирання ядра в режимі CONFIG_WERROR. Під час складання коду на мові Rust включені додаткові діагностичні режими компілятора та попередження літера Clippy.
  • Запропоновано абстракції для використання в коді мовою Rust блокувань seqlock (sequence locks), callback-дзвінків для керування живленням, I/O Memory (readX/writeX), обробників переривань та потоків, GPIO, доступу до пристроїв, драйверів та облікових даних.
  • Розширено засоби для розробки драйверів із задіянням переміщуваних м'ютексів, бітових ітераторів, спрощених обв'язок над покажчиками, покращеної діагностики збоїв та інфраструктури, незалежної від шини даних.
  • Поліпшено роботу з посиланнями за допомогою спрощеного типу Ref, що базується на бекенді refcount_t, що використовує однойменний API ядра для підрахунку посилань. Підтримка типів Arc і Rc, що надаються в штатній бібліотеці alloc, видалена та не доступна в коді, що виконується на рівні ядра (для самої бібліотеки підготовлені опції, що відключають ці типи).
  • До складу патчів додано варіант драйвера PL061 GPIO, переписаний на Rust. Особливістю драйвера і те, що його реалізація практично рядково повторює наявний драйвер GPIO мовою Сі. Для розробників, які бажають познайомитися зі створенням драйверів на Rust, підготовлено построкове порівняння, що дозволяє зрозуміти в які конструкції на Rust перетворено код на Сі.
  • В основну кодову базу Rust прийнято rustc_codegen_gcc, бекенд rustc для GCC, що реалізує можливість попередження (AOT) компіляції з використанням бібліотеки libgccjit. При належному розвитку бекенд він дозволить збирати задіяний в ядрі Rust-код за допомогою GCC.
  • Крім компаній ARM, Google та Microsoft, інтерес до використання мови Rust у ядрі Linux висловила компанія Red Hat. Нагадаємо, що Google безпосередньо забезпечує підтримку проекту Rust for Linux, розвиває нову реалізацію механізму міжпроцесної взаємодії Binder на Rust та розглядає можливість переробки на Rust різних драйверів. Компанія Microsoft розпочала реалізацію драйверів для Hyper-V на Rust. Компанія ARM працює над покращенням підтримки Rust для систем на базі процесорів ARM. Компанія IBM реалізувала підтримку Rust у ядрі для систем PowerPC.

Джерело: opennet.ru

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