Восмата версия на пачките за ядрото на 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-компоненти с нива на оптимизация, различни от тези, използвани за кода на езика 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().
  • Добавен е модул delay, позволяващ използването на забавяния (обвивка над msleep()).

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

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

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster