Шестата верзија на закрпи за кернелот Линукс со поддршка за јазикот Rust

Мигел Оједа, автор на проектот Rust-for-Linux, предложи издавање на v6 компоненти за развој на двигатели на уреди во јазикот Rust за разгледување од развивачите на кернелот на Linux. Ова е седмо издание на закрпи, земајќи ја предвид првата верзија, објавена без број на верзијата. Поддршката за 'рѓа се смета за експериментална, но веќе е вклучена во следната гранка на Linux и е доволно развиена за да започне со работа на создавање апстракциони слоеви преку потсистеми на јадрото, како и пишување двигатели и модули. Развојот е финансиран од Google и ISRG (Internet Security Research Group), која е основач на проектот Let’s Encrypt и промовира HTTPS и развој на технологии за подобрување на безбедноста на Интернет.

Во новата верзија:

  • Комплетот со алатки и варијантата на библиотеката за доделување, ослободени од можното генерирање на „панична“ состојба кога ќе се појават грешки, се ажурирани до изданието на Rust 1.60, што ја стабилизира поддршката за режимот „maybe_uninit_extra“ што се користи во закрпи на јадрото.
  • Додадена е можност за извршување на тестови од документацијата (тестови кои исто така се користат како примери во документацијата), преку конверзија во време на компајлирање на тестовите врзани за API на јадрото во KUnit тестови извршени при вчитување на кернелот.
  • Усвоени се барањата дека тестовите не треба да резултираат со предупредување за Clippy linter, исто како и кодот на Rust кернелот.
  • Се предлага првична имплементација на модулот „нето“ со мрежни функции. Rust кодот има пристап до мрежни структури на кернелот, како што се Именскиот простор (врз основа на структурата на struct net кернелот), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct_in sockadds) и нивните IP6 .
  • Има првична поддршка за асинхрони техники на програмирање (async), имплементирани во форма на модулот kasync. На пример, можете да напишете асинхрон код за манипулирање со TCP приклучоците: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; јамка { нека n = stream.read(&mut buf).wait?; ако n == 0 { return Ok(()); } stream.write_all(&buf[..n]).чекај?; } }
  • Додаден 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 frontend gccrs со имплементацијата на Rust јазичниот компајлер базиран на GCC. Во моментов има двајца програмери со полно работно време кои работат на gccrs.

Потсетете се дека предложените промени овозможуваат користење на Rust како втор јазик за развој на двигатели и модули на јадрото. Поддршката на Rust е претставена како опција што не е стандардно овозможена и не резултира со вклучување на Rust како потребна зависност од изградбата на кернелот. Користењето на Rust за развој на драјвери ќе ви овозможи да креирате побезбедни и подобри драјвери со минимален напор, без проблеми како што се пристап до меморијата по ослободувањето, дереференции на нула покажувач и пречекорувања на баферот.

Безбедното ракување со меморијата е обезбедено во Rust во времето на компајлирање преку проверка на референци, следење на сопственоста на објектот и животниот век на објектот (обем), како и преку проценка на исправноста на пристапот до меморијата за време на извршувањето на кодот. Rust исто така обезбедува заштита од прелевање на цели броеви, бара задолжителна иницијализација на вредностите на променливите пред употреба, подобро се справува со грешките во стандардната библиотека, стандардно го применува концептот на непроменливи референци и променливи, нуди силно статичко пишување за да се минимизираат логичките грешки.

Извор: opennet.ru

Додадете коментар