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

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

В новата версия:

  • Инструментариумът и вариантът на библиотеката alloc, освободени от възможно генериране на състояние на „паника“ при възникване на грешки, са актуализирани до изданието на Rust 1.60, което стабилизира поддръжката за режима „maybe_uninit_extra“, използван в пачовете на ядрото.
  • Добавена е възможност за изпълнение на тестове от документацията (тестове, които също се използват като примери в документацията), чрез преобразуване по време на компилиране на тестове, свързани с API на ядрото, в KUnit тестове, изпълнявани по време на зареждане на ядрото.
  • Бяха приети изисквания тестовете да не водят до Clippy linter предупреждение, точно като кода на ядрото на 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]; цикъл { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; }}
  • Добавен модул net::filter за манипулиране на мрежови пакетни филтри. Добавен пример rust_netfilter.rs с реализация на филтър на езика Rust.
  • Добавена реализация на прост mutex smutex::Mutex, който не изисква фиксиране.
  • Добавен NoWaitLock, който никога не чака за заключване и ако е зает от друга нишка, причинява докладване на грешка при опит за придобиване на заключване, вместо да спре повикващия.
  • Добавен е RawSpinLock, идентифициран от raw_spinlock_t в ядрото, за прилагане към секции, които не могат да бъдат неактивни.
  • Добавен тип ARef за препратки към обект, към който се прилага механизмът за преброяване на препратките (винаги повторно преброяване).
  • Бекендът rustc_codegen_gcc, който ви позволява да използвате библиотеката libgccjit от проекта GCC като генератор на код в rustc, за да предоставите на rustc поддръжка за архитектури и оптимизации, налични в GCC, е внедрил възможността за стартиране на rustc компилатора. Промоцията на компилатора означава възможността да се използва GCC-базиран кодов генератор в rustc за изграждане на самия rustc компилатор. В допълнение, скорошната версия на GCC 12.1 включва корекции на libgccjit, необходими за правилната работа на rustc_codegen_gcc. В ход е подготовка за осигуряване на възможност за инсталиране rustc_codegen_gcc с помощта на помощната програма rustup.
  • Отбелязва се напредъкът в разработването на интерфейса на GCC gccrs с внедряването на езиков компилатор на Rust, базиран на GCC. В момента има двама разработчици на пълен работен ден, които работят върху gccrs.

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

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

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

Добавяне на нов коментар