Osma verzija zakrpa za Linux kernel sa podrškom za Rust jezik

Мигель Охеда (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 и развитию технологий для повышения защищённости интернета.

U novoj verziji:

  • Инструментарий и вариант библиотеки 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()).

Predložene promjene omogućavaju korištenje Rusta kao drugog jezika za razvoj drajvera i modula kernela. Podrška za Rust je predstavljena kao opcija koja nije omogućena prema zadanim postavkama i ne dovodi do toga da Rust bude uključen kao obavezna zavisnost izgradnje za kernel. Korištenje Rusta za razvoj drajvera omogućit će vam da kreirate sigurnije i bolje drajvere uz minimalan napor, bez problema kao što su pristup memoriji nakon oslobađanja, nulte reference pokazivača i prekoračenje bafera.

Sigurnost memorije je obezbeđena u Rustu u vreme kompajliranja kroz proveru referenci, praćenje vlasništva nad objektom i životnog veka objekta (opsega), kao i kroz procenu ispravnosti pristupa memoriji tokom izvršavanja koda. Rust također pruža zaštitu od prekoračenja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli po defaultu, nudi snažno statičko kucanje kako bi se minimizirale logičke greške.

izvor: opennet.ru

Dodajte komentar