Toleo la sita la viraka kwa kernel ya Linux na msaada kwa lugha ya Rust

Miguel Ojeda, mwandishi wa mradi wa Rust-for-Linux, alipendekeza kutolewa kwa vipengee vya v6 kwa ajili ya kuendeleza viendesha kifaa katika lugha ya Rust ili kuzingatiwa na watengenezaji wa Linux kernel. Hili ni toleo la saba la viraka, kwa kuzingatia toleo la kwanza, lililochapishwa bila nambari ya toleo. Usaidizi wa kutu unachukuliwa kuwa wa majaribio, lakini tayari umejumuishwa katika tawi linalofuata la linux na umeendelezwa vya kutosha ili kuanza kazi ya kuunda tabaka za uondoaji juu ya mifumo ndogo ya kernel, pamoja na kuandika viendeshaji na moduli. Maendeleo hayo yanafadhiliwa na Google na ISRG (Kikundi cha Utafiti wa Usalama wa Mtandao), ambao ndio waanzilishi wa mradi wa Let's Encrypt na kukuza HTTPS na uundaji wa teknolojia ili kuboresha usalama wa Mtandao.

Katika toleo jipya:

  • Zana ya zana na lahaja ya maktaba ya alloc, iliyoachiliwa kutoka kwa uwezekano wa kutokea kwa hali ya "hofu" makosa yanapotokea, yamesasishwa hadi kutolewa kwa Rust 1.60, ambayo hutamilia usaidizi wa modi ya "labda_uninit_ziada" inayotumika katika viraka vya kernel.
  • Imeongeza uwezo wa kufanya majaribio kutoka kwa hati (majaribio ambayo pia hutumika kama mifano katika uhifadhi), kupitia ubadilishaji wa muda wa majaribio yaliyounganishwa na API ya kernel kuwa majaribio ya KUnit yaliyotekelezwa wakati wa upakiaji wa kernel.
  • Mahitaji yamepitishwa kwamba majaribio yasitokeze onyo la linter ya Clippy, kama vile msimbo wa kutu wa kernel.
  • Utekelezaji wa awali wa moduli ya "wavu" yenye kazi za mtandao inapendekezwa. Msimbo wa kutu unaweza kufikia miundo ya mtandao wa kernel kama vile Namespace (kulingana na muundo wa kernel wavu), SkBuff (muundo sk_buff), TcpListener, TcpStream (soketi ya muundo), Ipv4Addr (muundo wa_addr), SocketAddrV4 ( muundo wa sockaddr_in IP na vifaa vyake) .
  • Kuna usaidizi wa awali wa mbinu za programu zisizolingana (async), zinazotekelezwa kwa njia ya moduli ya kasync. Kwa mfano, unaweza kuandika msimbo usiolingana ili kuchezea soketi za TCP: async fn echo_server(mkondo: TcpStream) -> Matokeo { let mut buf = [0u8; 1024]; kitanzi { let n = stream.read(&mut buf).inasubiri?; ikiwa n == 0 {rudi Ok(()); } mkondo.andika_yote(&buf[..n]).inasubiri?; }}
  • Wavu ulioongezwa:: moduli ya kichujio cha kuchezea vichujio vya pakiti za mtandao. Mfano ulioongezwa rust_netfilter.rs na utekelezaji wa kichujio katika lugha ya Rust.
  • Utekelezaji ulioongezwa wa mutex smutex rahisi::Mutex, ambao hauhitaji kubandikwa.
  • Imeongeza kufuli ya NoWaitLock ambayo haingojei kuachiliwa, na ikiwa imechukuliwa na mazungumzo mengine, husababisha hitilafu kuripotiwa wakati wa kujaribu kupata kufuli badala ya kumzuia anayepiga.
  • Imeongeza RawSpinLock, iliyotambuliwa na raw_spinlock_t kwenye kernel, ili kutumika kwa sehemu ambazo haziwezi kufanya kitu.
  • Imeongeza aina ya ARef kwa marejeleo ya kitu ambacho utaratibu wa kuhesabu marejeleo unatumika (huonyeshwa upya kila wakati).
  • Rustc_codegen_gcc backend, ambayo inakuruhusu kutumia maktaba ya libgccjit kutoka kwa mradi wa GCC kama jenereta ya msimbo katika rustc ili kutoa rustc usaidizi wa usanifu na uboreshaji unaopatikana katika GCC, imetekeleza uwezo wa kuanzisha mkusanyaji wa rustc. Ukuzaji wa mkusanyaji unamaanisha uwezo wa kutumia jenereta ya msimbo yenye msingi wa GCC katika rustc ili kuunda kikusanyaji cha rustc chenyewe. Kwa kuongeza, toleo la hivi majuzi la GCC 12.1 linajumuisha marekebisho ya libgccjit muhimu kwa rustc_codegen_gcc kufanya kazi ipasavyo. Maandalizi yanaendelea ili kutoa uwezo wa kusakinisha rustc_codegen_gcc kwa kutumia matumizi ya rustup.
  • Maendeleo katika uundaji wa GCC frontend gccrs na utekelezaji wa mkusanyiko wa lugha ya Rust kulingana na GCC imebainishwa. Kwa sasa kuna watengenezaji wawili wa muda wote wanaofanya kazi kwenye gccrs.

Kumbuka kwamba mabadiliko yaliyopendekezwa hufanya iwezekane kutumia Rust kama lugha ya pili kwa kukuza viendeshaji na moduli za kernel. Usaidizi wa kutu unawasilishwa kama chaguo ambalo halijawezeshwa kwa chaguo-msingi na halisababishi Rust kujumuishwa kama tegemeo la ujenzi linalohitajika kwa kernel. Kutumia Rust kwa ukuzaji wa viendeshaji kutakuruhusu kuunda viendeshaji salama na bora zaidi kwa juhudi kidogo, bila matatizo kama vile ufikiaji wa kumbukumbu baada ya kukomboa, vielekezo visivyofaa vya vielekezi, na ziada ya bafa.

Utunzaji wa kumbukumbu-salama hutolewa katika Rust wakati wa kukusanya kupitia ukaguzi wa kumbukumbu, kufuatilia umiliki wa kitu na maisha ya kitu (wigo), na pia kupitia tathmini ya usahihi wa ufikiaji wa kumbukumbu wakati wa utekelezaji wa nambari. Kutu pia hutoa ulinzi dhidi ya mafuriko kamili, inahitaji uanzishaji wa lazima wa maadili tofauti kabla ya matumizi, hushughulikia makosa vyema katika maktaba ya kawaida, hutumia dhana ya marejeleo yasiyobadilika na vigeu kwa chaguo-msingi, hutoa uchapaji thabiti wa tuli ili kupunguza makosa ya kimantiki.

Chanzo: opennet.ru

Kuongeza maoni