La sesa versio de flikoj por la Linukso-kerno kun subteno por la Rust-lingvo

Miguel Ojeda, verkinto de la Rust-for-Linux-projekto, proponis la liberigon de v6-komponentoj por evoluigado de aparato-ŝoforoj en la Rust-lingvo por konsidero de Linuksaj kernaj programistoj. Ĉi tiu estas la sepa eldono de la flikoj, konsiderante la unuan version, eldonita sen versio numero. Rust-subteno estas konsiderita eksperimenta, sed jam estas inkluzivita en la linukso-sekva branĉo kaj estas sufiĉe evoluigita por komenci laboron pri kreado de abstraktaj tavoloj super kernaj subsistemoj, same kiel skribado de ŝoforoj kaj moduloj. La disvolviĝo estas financita de Google kaj la ISRG (Interreta Sekureco-Esplorgrupo), kiu estas la fondinto de la projekto Let's Encrypt kaj antaŭenigas HTTPS kaj la evoluon de teknologioj por plibonigi la interretan sekurecon.

En la nova versio:

  • La ilaro kaj varianto de la alloc-biblioteko, liberigita de ebla generacio de "paniko" stato kiam okazas eraroj, estis ĝisdatigitaj al la eldono de Rust 1.60, kiu stabiligas subtenon por la "maybe_uninit_extra" reĝimo uzata en kernaj flikoj.
  • Aldonis la kapablon ruli testojn de la dokumentaro (testoj kiuj ankaŭ estas uzataj kiel ekzemploj en la dokumentaro), per kompiltempa konvertiĝo de testoj ligitaj al la kerno API en KUnit-testojn efektivigitajn dum kerno-ŝarĝado.
  • Postuloj estis adoptitaj ke testoj ne devus rezultigi Clippy linter-averton, same kiel Rust-kernkodo.
  • Komenca efektivigo de la "reta" modulo kun retfunkcioj estas proponita. Rust-kodo havas aliron al kernaj retstrukturoj kiel ekzemple Nomspaco (surbaze de la struct net kernelstrukturo), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) kaj iliaj IPv6-ekvivalentoj .
  • Ekzistas komenca subteno por nesinkronaj programaj teknikoj (async), efektivigitaj en la formo de la kasync-modulo. Ekzemple, vi povas skribi nesinkronan kodon por manipuli TCP-ingojn: async fn echo_server (fluo: TcpStream) -> Rezulto { let mut buf = [0u8; 1024]; loop { let n = stream.read (&mut buf). atendi?; if n == 0 { return Ok (()); } stream.write_all(&buf[..n]).atendi?; }}
  • Aldonita net::filtrila modulo por manipuli retajn pakajn filtrilojn. Aldonita ekzemplo rust_netfilter.rs kun filtrila efektivigo en la Rust-lingvo.
  • Aldonita efektivigo de simpla mutex smutex::Mutex, kiu ne postulas alpingli.
  • Aldonita NoWaitLock, kiu neniam atendas seruron, kaj se okupata de alia fadeno, kaŭzas eraron esti raportita kiam oni provas akiri la seruron anstataŭ haltigi la alvokanton.
  • Aldonita RawSpinLock, identigita per raw_spinlock_t en la kerno, por apliki al sekcioj kiuj ne povas esti neaktivaj.
  • Aldonita ARef-tipo por referencoj al objekto al kiu la referenco-kalkulmekanismo estas aplikata (ĉiam-refkalkulita).
  • La backend rustc_codegen_gcc, kiu ebligas al vi uzi la libgccjit-bibliotekon de la projekto GCC kiel kodgeneratoro en rustc por provizi al rustc subtenon por arkitekturoj kaj optimumigoj disponeblaj en GCC, efektivigis la kapablon ekfunkciigi la rustc-kompililon. Kompililreklamo signifas la kapablon uzi GCC-bazitan kodgeneratoron en rustc por konstrui la rustc-kompililon mem. Krome, la lastatempa eldono de GCC 12.1 inkluzivas korektojn al libgccjit necesaj por ke rustc_codegen_gcc funkciu ĝuste. Preparoj estas survoje por provizi la kapablon instali rustc_codegen_gcc uzante la rustup ilo.
  • Oni rimarkas la progreson en la evoluo de la GCC-fadendaj gccrs kun la efektivigo de la Rust-lingva kompililo bazita sur GCC. Nuntempe du plentempaj programistoj laboras pri gccrs.

Memoru, ke la proponitaj ŝanĝoj ebligas uzi Ruston kiel duan lingvon por disvolvi ŝoforojn kaj kernajn modulojn. Rust-subteno estas prezentita kiel opcio, kiu ne estas ebligita defaŭlte kaj ne rezultigas, ke Rust estas inkluzivita kiel postulata konstrua dependeco por la kerno. Uzado de Rust por ŝofor-disvolviĝo permesos al vi krei pli sekurajn kaj pli bonajn ŝoforojn kun minimuma peno, liberaj de problemoj kiel memoraliro post liberigo, nulaj montriloj dereferencoj kaj bufro-tropasoj.

Memorsekureco estas disponigita en Rust ĉe kompiltempo per referenckontrolado, konservante trakon de objektoposedo kaj objektvivdaŭro (amplekso), same kiel tra taksado de la ĝusteco de memoraliro dum kodekzekuto. Rusto ankaŭ provizas protekton kontraŭ entjeraj superfluoj, postulas devigan inicialigon de variaj valoroj antaŭ uzo, pli bone pritraktas erarojn en la norma biblioteko, aplikas la koncepton de neŝanĝeblaj referencoj kaj variabloj defaŭlte, ofertas fortan senmovan tajpadon por minimumigi logikajn erarojn.

fonto: opennet.ru

Aldoni komenton