Восьма версія патчів для ядра Linux з підтримкою мови Rust

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

В новой версії:

  • Інструментарій та варіант бібліотеки alloc, позбавлений можливих генерацій стану «panic» при виникненні помилок, оновлені до випуску Rust 1.62. У порівнянні з раніше використовуваною версією в інструментарії Rust стабілізовано підтримку функціональності const_fn_trait_bound, що використовується в патчах до ядра.
  • Код прив'язок виділено в окремий crate-пакет «bindings», що спрощує перескладання у разі внесення змін лише в основний пакет «kernel».
  • Реалізація макросу "concat_idents!" переписана у формі процедурного макросу, не прив'язаного до функціональності concat_idents та допускає застосування посилань на локальні змінні.
  • Переписаний макрос "static_assert!", що дозволило використовувати "core::assert!()" у будь-якому контексті замість констант.
  • Макрос "build_error!" адаптований для роботи під час виставлення для модулів режиму «RUST_BUILD_ASSERT_{WARN,ALLOW}».
  • Доданий окремий файл із налаштуваннями «kernel/configs/rust.config».
  • Оброблювані в макропідстановках файли *.i перейменовані в *.rsi.
  • Припинено підтримку складання Rust-компонентів з рівнями оптимізації, відмінними від застосовуваних для коду мовою Сі.
  • Додано модуль fs, що надає обв'язки для роботи з файловими системами. Запропоновано приклад простої файлової системи, написаної мовою Rust.
  • Додано модуль workqueue для роботи з системними чергами (надає обв'язки над структурами ядра work_struct та workqueue_struct).
  • Продовжено розвиток модуля kasync із реалізацією методів асинхронного програмування (async). Доданий приклад працюючого лише на рівні ядра TCP-сервера, написаного на Rust.
  • Додана можливість обробки переривань мовою Rust за допомогою типажів [Threaded] Handler та типів [Threaded] Registration`.
  • Доданий процедурний макрос «#[vtable]», що спрощує роботу з таблицями покажчиків на функції, як-от структура file_operations.
  • Додано реалізацію двонаправлених зв'язкових списків «unsafe_list::List».
  • Додано початкову підтримку RCU (Read-copy-update) та тип Guard для перевірки прив'язки блокування на читання до поточного потоку.
  • Додано функцію Task::spawn() для створення та автоматичного запуску потоків ядра. Також додано метод Task::wake_up().
  • Додано модуль delay, що дозволяє використовувати затримки (обгортка над msleep()).

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

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

Джерело: opennet.ru

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