Осмата версия на корекции за ядрото на Linux с поддръжка на езика Rust

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

В новата версия:

  • Инструментариумът и вариантът на библиотеката alloc, без възможно генериране на състояние на „паника“ при възникване на грешки, бяха актуализирани за изданието на Rust 1.62. В сравнение с предишната използвана версия, инструментариумът Rust има стабилизирана поддръжка за функционалността const_fn_trait_bound, използвана в пачовете на ядрото.
  • Кодът за обвързване е отделен в отделен пакет „свързване“, което опростява повторното изграждане, ако се правят промени само в основния пакет „ядро“.
  • Внедряване на макроса “concat_idents!” пренаписан под формата на процедурен макрос, който не е обвързан с функционалността concat_idents и позволява използването на препратки към локални променливи.
  • Макросът „static_assert!“ е пренаписан, позволявайки използването на „core::assert!()“ във всеки контекст вместо константи.
  • Макрос "build_error!" адаптирани да работят, когато режимът „RUST_BUILD_ASSERT_{WARN,ALLOW}“ е зададен за модули.
  • Добавен е отделен файл с настройки “kernel/configs/rust.config”.
  • Файловете „*.i“, обработени при замествания на макроси, са преименувани на „*.rsi“.
  • Поддръжката за изграждане на компоненти на Rust с нива на оптимизация, различни от използваните за C код, е преустановена.
  • Добавен 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().
  • Добавен е модул за забавяне, който ви позволява да използвате закъснения (обвивка над msleep()).

Предложените промени правят възможно използването на Rust като втори език за разработване на драйвери и модули на ядрото. Поддръжката на Rust е представена като опция, която не е активирана по подразбиране и не води до включването на Rust като задължителна зависимост за компилация за ядрото. Използването на Rust за разработка на драйвери ще ви позволи да създавате по-безопасни и по-добри драйвери с минимални усилия, без проблеми като достъп до паметта след освобождаване, дерефериране на нулев указател и препълване на буфер.

Безопасното боравене с паметта е осигурено в Rust по време на компилиране чрез проверка на референции, проследяване на собствеността върху обекта и продължителността на живот (обхват) на обекта, както и чрез оценка на коректността на достъпа до паметта по време на изпълнение на кода. Rust също осигурява защита срещу препълване на цели числа, изисква задължителна инициализация на стойностите на променливите преди употреба, обработва грешките по-добре в стандартната библиотека, прилага концепцията за неизменни препратки и променливи по подразбиране, предлага силно статично въвеждане за минимизиране на логическите грешки.

Източник: opennet.ru

Добавяне на нов коментар