Мигел Охеда (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
