Трето издание на пачовете за ядрото на Linux с поддръжка на езика Rust

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

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

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

В новия вариант на пачовете е продължено отстраняването на забележките, направени по време на обсъждането на първата и втората версия на пачовете. Най-забележителните промени са:

  • Извършен е преход към използването на стабилната версия на компилатора Rust 1.57 и е осигурена привързаност към стабилизираната редакция на езика Rust 2021. По-рано пачовете бяха обвързани с бета-ветка на Rust и използваха някои възможности на езика, които влизат в категорията на нестабилните. Преходът към спецификацията Rust 2021 позволи инициирането на работа по изключването на използването в пачовете на такива нестабилни възможности, като const_fn_transmute, const_panic, const_unreachable_unchecked и core_panic и try_reserve.
  • Продължава развитието на входящата част от пачовете библиотеки Rust alloc, променена за избавяне на функциите за разпределение на паметта от възможни генерации на състояние "panic" при възникване на грешки, като недостатъчна памет. В новата версия са реализирани опциите "no_rc" и "no_sync" за изключване на функционалността, ненужна в Rust-кода за ядрото, което прави библиотеката по-модулна. Продължава работата с основните разработчици на alloc, насочена към пренасяне на необходимите за ядрото промени в основния състав на библиотеката. В основната библиотека Rust (core) е пренесена опцията "no_fp_fmt_parse", необходима за работата на библиотеката на ниво ядро.
  • Извършена е почистване на кода, за да се избавим от възможни предупреждения на компилятора при сглобяване на ядрото в режим CONFIG_WERROR. При сглобяване на кода на езика Rust са включени допълнителни диагностични режими на компилятора и предупреждения на линтера Clippy.
  • Предложени абстракции за употреба в кода на езика Rust, блокировки seqlock (последователни блокировки), callback-призиви за управление на захранването, I/O памет (readX/writeX), обработчици на прекъсвания и потоци, GPIO, достъп до устройства, драйвери и учетни данни.
  • Разширени средства за разработка на драйвери с участието на преместваеми мютекси, битови итератори, опростени обвивки над указатели, подобрена диагностика на сривове и инфраструктура, независима от шина данни.
  • Подобрена работа с ссылки с помощта на опростен тип Ref, базиран на бэкенда refcount_t, използващ едноименния API на ядрото за преброяване на ссылки. Поддръжката на типовете Arc и Rc, предоставяни в стандартната библиотека alloc, е премахната и не е налична в кода, изпълняван на ядрото (за самата библиотека са подготвени опции, които деактивират тези типове).
  • В състава на патчовете е добавен вариант на драйвера PL061 GPIO, преписан на Rust. Особеност на драйвера е, че неговата реализация практически ред по ред повтаря съществуващия драйвер GPIO на езика C. За разработчици, които желаят да се запознаят със създаването на драйвери на Rust, е подготвено редово сравнение, позволяващо да се разбере в какви конструкции на Rust е преобразуван кода на C.
  • В основната кодова база на Rust е приет rustc_codegen_gcc, бэкенд rustc за GCC, реализиращ възможността за предвариална (AOT) компилация с помощта на библиотеката libgccjit. При подходящо развитие на бэкенда, той ще позволи сбор на участващия в ядрото Rust-код с помощта на GCC.
  • Освен компаниите ARM, Google и Microsoft, интерес към използването на езика Rust в ядрото на Linux изрази и компанията Red Hat. Напомняме, че Google пряко осигурява поддръжка на проекта Rust for Linux, развива нова реализация на механизма за междупроцесно взаимодействие Binder на Rust и разглежда възможността за преработка на различни драйвери на Rust. Компанията Microsoft започна реализация на драйвери за Hyper-V на Rust. Компанията ARM работи по подобряване на поддръжката на Rust за системи на база процесори ARM. Компанията IBM реализира поддръжка на Rust в ядрото за системи PowerPC.

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

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