Rust хэлний дэмжлэгтэй Линуксийн цөмийн засваруудын зургаа дахь хувилбар

Rust-for-Linux төслийн зохиогч Мигель Ожеда Linux цөмийн хөгжүүлэгчдийн авч үзэхийн тулд Rust хэл дээрх төхөөрөмжийн драйверуудыг хөгжүүлэх v6 бүрэлдэхүүн хэсгүүдийг гаргахыг санал болгов. Энэ бол хувилбарын дугааргүйгээр хэвлэгдсэн эхний хувилбарыг харгалзан засварын долоо дахь хэвлэл юм. Rust дэмжлэг нь туршилтын гэж тооцогддог боловч linux-дараагийн салбарт аль хэдийн орсон бөгөөд цөмийн дэд системүүд дээр хийсвэрлэх давхарга үүсгэх, түүнчлэн драйвер, модулиудыг бичих ажлыг эхлүүлэхэд хангалттай хөгжсөн. Энэхүү бүтээн байгуулалтыг Google болон ISRG (Интернетийн аюулгүй байдлын судалгааны групп) санхүүжүүлдэг бөгөөд энэ нь Let's Encrypt төслийн үүсгэн байгуулагч бөгөөд HTTPS болон интернетийн аюулгүй байдлыг сайжруулах технологийн хөгжлийг дэмждэг.

Шинэ хувилбарт:

  • Алдаа гарах үед "сандрах" төлөвөөс ангижруулсан хэрэглүүрийн хэрэгсэл болон хуваарилах номын сангийн хувилбар нь цөмийн засваруудад хэрэглэгддэг "магадгүй_uninit_extra" горимын дэмжлэгийг тогтворжуулдаг Rust 1.60 хувилбар болгон шинэчлэгдсэн.
  • Цөмийн API-д холбогдсон тестүүдийг цөм ачаалах үед гүйцэтгэсэн KUnit тест болгон хөрвүүлэх замаар баримтжуулалтаас (баримт бичигт жишээ болгон ашигладаг тестүүд) тест ажиллуулах чадварыг нэмсэн.
  • Туршилтууд нь Rust цөмийн кодтой адил Clippy linter анхааруулга өгөх ёсгүй гэсэн шаардлагыг баталсан.
  • Сүлжээний функц бүхий "цэвэр" модулийн анхны хэрэгжилтийг санал болгож байна. Rust код нь Namespace (бүтцийн цэвэр цөмийн бүтцэд суурилсан), SkBuff (struct sk_buff), TcpListener, TcpStream (бүтцийн залгуур), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_inqui) болон тэдгээрийн IPs зэрэг цөмийн сүлжээний бүтцэд хандах боломжтой. .
  • Kasync модулийн хэлбэрээр хэрэгжсэн асинхрон програмчлалын техник (async)-ийн анхны дэмжлэг байдаг. Жишээлбэл, та TCP залгууруудыг удирдахын тулд асинхрон код бичиж болно: async fn echo_server(stream: TcpStream) -> Үр дүн { let mut buf = [0u8; 1024]; давталт { зөвшөөрөх n = урсгал.унших(&mut buf).хүлээж байна уу?; хэрэв n == 0 { буцаана Ok(()); } stream.write_all(&buf[..n]).хүлээх үү?; } }
  • Сүлжээний пакет шүүлтүүрийг удирдахад зориулсан net::filter модулийг нэмсэн. Rust хэл дээрх шүүлтүүрийн хэрэгжилттэй rust_netfilter.rs жишээ нэмсэн.
  • Энгийн mutex smutex::Mutex-ийн хэрэгжилт нэмэгдсэн бөгөөд энэ нь бэхлэх шаардлагагүй.
  • Нэмэгдсэн NoWaitLock, хэзээ ч түгжээ хүлээхгүй, өөр урсгалтай бол залгагчийг зогсоохын оронд түгжээг авах гэж оролдох үед алдаа гарахад хүргэдэг.
  • Сул зогсох боломжгүй хэсгүүдэд хэрэглэхийн тулд цөм дэх raw_spinlock_t-ээр тодорхойлогдсон RawSpinLock-г нэмсэн.
  • Лавлагаа тоолох механизмыг ашигласан объектын лавлагаанд ARef төрлийг нэмсэн (үргэлж дахин тооцдог).
  • GCC төслийн libgccjit номын санг rustc-д код үүсгэгч болгон ашиглах боломжийг олгодог rustc_codegen_gcc backend нь GCC-д байдаг архитектур, оновчлолыг дэмжих rustc-ийг хангахын тулд rustc хөрвүүлэгчийг ачаалах боломжийг хэрэгжүүлсэн. Хөрвүүлэгчийн сурталчилгаа гэдэг нь rustc хөрвүүлэгчийг өөрөө бүтээхийн тулд rustc-д GCC-д суурилсан код үүсгэгчийг ашиглах чадварыг хэлнэ. Нэмж дурдахад, GCC 12.1-ийн саяхан гарсан хувилбар нь rustc_codegen_gcc зөв ажиллахад шаардлагатай libgccjit-ийн засваруудыг багтаасан болно. Rustup хэрэгслийг ашиглан rustc_codegen_gcc-г суулгах боломжийг олгохоор бэлтгэл ажил хийгдэж байна.
  • GCC дээр суурилсан Rust хэлний хөрвүүлэгчийг хэрэгжүүлснээр GCC frontend gccrs-ийг хөгжүүлэх ахиц дэвшлийг тэмдэглэв. Одоогоор gccrs дээр бүтэн цагийн хоёр хөгжүүлэгч ажиллаж байна.

Санал болгож буй өөрчлөлтүүд нь Rust хэлийг драйверууд болон цөмийн модулиудыг хөгжүүлэх хоёр дахь хэл болгон ашиглах боломжтой гэдгийг санаарай. Rust-ийн дэмжлэгийг анхдагчаар идэвхжүүлээгүй сонголт хэлбэрээр танилцуулж байгаа бөгөөд зэв нь цөмийн хувьд шаардлагатай бүтээх хамаарал болгон оруулахад хүргэдэггүй. Драйвер хөгжүүлэхэд Rust-ийг ашигласнаар санах ойд нэвтрэх эрх чөлөөлсний дараа санах ойд нэвтрэх, хоосон заагч хаягжилт, буфер хэт ачаалал гэх мэт асуудлуудаас ангид, хамгийн бага хүчин чармайлтаар илүү аюулгүй, илүү сайн драйверуудыг бий болгох боломжтой болно.

Санах ойн аюулгүй ажиллагааг Rust-д хөрвүүлэх үед лавлагаа шалгах, объектын эзэмшил болон объектын ашиглалтын хугацааг (хамрах хүрээ) хянах, мөн кодыг гүйцэтгэх явцад санах ойд нэвтрэх зөв эсэхийг үнэлэх замаар хангадаг. Rust нь бүхэл тоон хэтрэхээс хамгаалж, ашиглахын өмнө хувьсагчийн утгыг заавал эхлүүлэх шаардлагатай, стандарт номын санд алдааг илүү сайн зохицуулдаг, өөрчлөгддөггүй лавлагаа, хувьсагчийн ойлголтыг анхдагчаар ашигладаг, логик алдааг багасгахын тулд хүчтэй статик бичихийг санал болгодог.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх