Linux nukleorako adabakien seigarren bertsioa Rust hizkuntzarako laguntzarekin

Miguel Ojedak, Rust-for-Linux proiektuaren egileak, Rust hizkuntzan gailu kontrolatzaileak garatzeko v6 osagaiak askatzea proposatu zuen Linux kerneleko garatzaileek kontuan izan ditzaten. Adabakien zazpigarren edizioa da hau, lehen bertsioa kontuan hartuta, bertsio-zenbakirik gabe argitaratua. Rust euskarria esperimentaltzat hartzen da, baina dagoeneko linux-next adarrean sartuta dago eta nahiko garatuta dago nukleoaren azpisistemen gainean abstrakzio-geruzak sortzeko lanean hasteko, baita kontrolatzaileak eta moduluak idazten ere. Garapena Googlek eta ISRGk (Internet Security Research Group) finantzatzen dute, Let's Encrypt proiektuaren sortzailea dena eta HTTPS eta Interneten segurtasuna hobetzeko teknologien garapena sustatzen du.

Bertsio berrian:

  • Tresna-kit eta alloc liburutegiaren aldaera bat, akatsak gertatzen direnean "izua" egoera sortzetik libratuta, Rust 1.60 bertsiora eguneratu dira, zeinak nukleoko adabakietan erabiltzen den "maybe_uninit_extra" moduaren euskarria egonkortzen duena.
  • Dokumentaziotik probak exekutatzeko gaitasuna gehitu da (dokumentazioan adibide gisa ere erabiltzen diren probak), nukleoaren APIari loturiko proben konpilazio garaian kernelaren kargatzean exekutatu diren KUnit probetan bihurtzeko.
  • Baldintzak onartu dira probek ez dutela Clippy linter abisurik eragin behar, Rust kernel kodea bezala.
  • Sareko funtzioekin β€œsare” moduluaren hasierako inplementazioa proposatzen da. Rust-ek nukleoaren sare-egituretarako sarbidea du, hala nola Namespace (struct net kernel egituran oinarrituta), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) eta haien IPv6 baliokideak. .
  • Programazio asinkronoko tekniketarako (async) hasierako laguntza dago, kasync modulu moduan inplementatuta. Adibidez, kode asinkronoa idatz dezakezu TCP socketak manipulatzeko: async fn echo_server (stream: TcpStream) -> Emaitza { let mut buf = [0u8; 1024]; begizta { let n = stream.read (&mut buf).itxaron?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).wait?; }}
  • Net::filter modulua gehitu da sareko pakete-iragazkiak manipulatzeko. Rust_netfilter.rs adibidea gehitu da Rust hizkuntzan iragazkiaren ezarpenarekin.
  • Mutex smutex::Mutex sinple baten inplementazioa gehitu da, aingurarik behar ez duena.
  • NoWaitLock gehitu da, inoiz blokeo baten zain geratzen ez dena, eta beste hari batek okupatuta badago, blokeoa eskuratzen saiatzean errore baten berri ematen du deitzailea gelditu beharrean.
  • RawSpinLock gehitu da, nukleoan raw_spinlock_t bidez identifikatua, inaktibo egon ezin diren ataletan aplikatzeko.
  • Erreferentziak zenbatzeko mekanismoa aplikatzen zaion objektu bati erreferentziak egiteko ARef mota gehitu da (beti-refkontatu).
  • Rustc_codegen_gcc backend-ak, GCC proiektuko libgccjit liburutegia rustc-en kode-sorgailu gisa erabiltzeko aukera ematen duena, rustc-i GCCn eskuragarri dauden arkitektura eta optimizazioetarako laguntza eskaintzeko, rustc konpilatzailea abiarazteko gaitasuna inplementatu du. Konpiladorearen sustapenak rustc-en GCCn oinarritutako kode-sorgailu bat erabiltzeko gaitasuna esan nahi du rustc konpilatzailea bera eraikitzeko. Gainera, GCC 12.1 bertsio berrian rustc_codegen_gcc behar bezala funtzionatzeko beharrezkoak diren libgccjit-en konponketak biltzen ditu. Prestaketak egiten ari dira rustc_codegen_gcc rustup utilitatea erabiliz instalatzeko gaitasuna emateko.
  • GCC frontend gccrs-en garapenean izandako aurrerapena nabarmentzen da GCCn oinarritutako Rust hizkuntza-konpiladorearen ezarpenarekin. Gaur egun, lanaldi osoko bi garatzaile daude gccrs-ekin lanean.

Gogoratu proposatutako aldaketek Rust bigarren hizkuntza gisa erabiltzeko aukera ematen dutela kontrolatzaileak eta nukleoaren moduluak garatzeko. Rust-en euskarria lehenespenez gaituta ez dagoen aukera gisa aurkezten da eta ez du eragiten Rust nukleorako beharrezko eraikitze-menpekotasun gisa sartzea. Rust kontrolatzaileak garatzeko erabiltzeak gidari seguruagoak eta hobeak sortzea ahalbidetuko du esfortzu minimoarekin, askatu ondoren memoriarako sarbidea, erakusle nuluen deserreferentziak eta buffer gainditzeak bezalako arazorik gabe.

Memoria segurua den manipulazioa Rust-en eskaintzen da konpilazio garaian erreferentziak egiaztatzen, objektuen jabetzaren eta objektuaren bizitzaren (esparrua) jarraipena eginez, baita kodearen exekuzioan memoriarako sarbidearen zuzentasunaren ebaluazioaren bidez ere. Rust-ek osoko gainezkatzeen aurkako babesa eskaintzen du, erabili aurretik aldagaien balioak derrigorrezko hasieratzea eskatzen du, liburutegi estandarrean akatsak hobeto kudeatzen ditu, erreferentzia eta aldagai aldaezinen kontzeptua lehenespenez aplikatzen du, idazketa estatiko sendoa eskaintzen du akats logikoak minimizatzeko.

Iturria: opennet.ru

Gehitu iruzkin berria