Мигел Охеда (Miguel Ojeda), автор проекта Rust-for-Linux, предложи на вниманието на разработчиците на ядрото на Linux версия v6 на компонентите за разработване на драйвери за устройства на езика Rust. Това е седмото издание на патчовете, базирано на първата версия, публикувана без номер на версия. Поддръжката на Rust се разглежда като експериментална, но вече е включена в клон linux-next и е достатъчно развита за започване на работа по създаването на абстрактни слоеве над подсистемите на ядрото, както и за написването на драйвери и модули. Развитието се финансира от компанията Google и организацията ISRG (Internet Security Research Group), която е основател на проекта Let’s Encrypt и способства за популяризирането на HTTPS и развитието на технологии за увеличаване на сигурността в интернет.
В новата версия:
- Инструментариумът и вариантът на библиотеката alloc, освободен от възможни генерации на естество "panic" при възникване на грешки, са обновени до версия Rust 1.60, в която е стабилизирана поддръжката на режима "maybe_uninit_extra", използван в патчовете за ядрото.
- Добавена е възможността за изпълнение на тестове от документацията (тестове, които същевременно служат като примери в документацията), чрез трансформация по време на компилация на тестове, свързани с API на ядрото, в тестове KUnit, изпълнявани по време на зареждането на ядрото.
- Приети са изисквания, съгласно които тестовете не трябва да водят до извеждане на предупреждение от линтера Clippy, както и кодът за ядрото на езика Rust.
- Предложена е начална реализация на модула "net" с мрежови функции. За кода на езика Rust е предоставен достъп до мрежови структури на ядрото, като "Namespace" (основаваща се на структурата на ядрото "struct net"), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) и техните еквиваленти за IPv6.
- Реализирана е начална поддръжка на методи за асинхронно програмиране (async), внедрени под формата на модул kasync. Например, може да се създаде асинхронно работещ код за манипулиране с TCP-сокети: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Добавен е модул net::filter за манипулиране с филтри на мрежови пакети. Добавен е пример rust_netfilter.rs с реализация на филтър на езика Rust.
- Добавена реализация на простия мютекс smutex::Mutex, който не изисква свързване (pinning).
- Добавена е блокировката NoWaitLock, която никога не води до изчакване за освобождаване и при заетост от друг поток извежда грешка при опит за получаване на блокировката вместо да спира извикващия.
- Добавена е блокировката RawSpinLock, която е идентифицирана с raw_spinlock_t в ядрото, използвана за секции, които не могат да бъдат в състояние на изчакване.
- Добавен е типът ARef за референции към обект, към който се прилага механизмът за преброяване на референции (винаги преброен).
- В бекенда rustc_codegen_gcc, позволяващ използването на библиотеката libgccjit от проекта GCC като генератор на код в rustc за осигуряване на поддръжка на архитектури и оптимизации налични в GCC, е реализирана възможност за стартиране на компилатора (bootstrapping) rustc. Под стартиране на компилатора се разбира използването на генератора на код основан на GCC за изграждане на самия компилатор rustc. Освен това, в последния release на GCC 12.1 са включени поправки в libgccjit, необходими за правилната работа на rustc_codegen_gcc. Подготвя се възможност за инсталиране на rustc_codegen_gcc чрез помощната утилита rustup.
- Отбелязва се напредък в разработката на GCC фронтенда gccrs с реализиране на компилатор на езика Rust на базата на GCC. В момента по gccrs в режим на пълна работа работят двама разработчици.
Напомняме, че предложените промени дават възможност да се използва Rust като втори език за разработка на драйвери и модули на ядрото. Поддръжката на Rust е представена като опция, която не е активна по подразбиране и не води до включването на Rust в задължителните зависимости за изграждане на ядрото. Използването на Rust за разработка на драйвери ще позволи с минимални усилия да се създават безопасни и по-качествени драйвери, освободени от проблеми като достъп до памет след освобождаването ѝ, разименуване на нулеви указатели и излизане извън границите на буфера.
Безопасната работа с паметта се осигурява в Rust по време на компилация чрез проверка на референции, проследяване на собствеността на обекти и отчитане на времето на живот на обектите (област на видимост), както и чрез оценка на коректността на достъпа до паметта по време на изпълнението на кода. Rust също така предлага средства за защита от препълване на цели числа, изисква задължителна инициализация на стойностите на променливите преди използване, по-добре обработва грешките в стандартната библиотека, прилага концепцията за неизменяемост (immutable) на референции и променливи по подразбиране и предлага силна статична типизация за минимизиране на логически грешки.
Източник: opennet.ru
