Ang ikawalong bersyon ng mga patch para sa Linux kernel na may suporta para sa Rust na wika

Iminungkahi ni Miguel Ojeda, may-akda ng proyektong Rust-for-Linux, ang pagpapalabas ng mga bahagi ng v8 para sa pagbuo ng mga driver ng device sa wikang Rust para sa pagsasaalang-alang ng mga developer ng Linux kernel. Ito ang binagong bersyon ng mga patch, na isinasaalang-alang ang unang bersyon, na inilathala nang walang numero ng bersyon. Ang suporta sa kalawang ay itinuturing na pang-eksperimento, ngunit kasama na sa linux-next branch, sinasabing isinama sa paglabas ng taglagas na 5.20/6.0, at sapat na para magsimulang magtrabaho sa paggawa ng mga abstraction layer sa mga kernel subsystem, pati na rin sa pagsusulat ng mga driver at mga module. Ang pag-unlad ay pinondohan ng Google at ng ISRG (Internet Security Research Group), na siyang nagtatag ng proyektong Let's Encrypt at nagpo-promote ng HTTPS at ang pagbuo ng mga teknolohiya upang mapabuti ang seguridad sa Internet.

Sa bagong bersyon:

  • Ang toolkit at isang variant ng alloc library, na walang posibleng pagbuo ng "panic" na estado kapag naganap ang mga error, ay na-update para sa pagpapalabas ng Rust 1.62. Kung ikukumpara sa dating ginamit na bersyon, ang Rust toolkit ay nagpatatag ng suporta para sa const_fn_trait_bound functionality na ginagamit sa mga kernel patch.
  • Ang binding code ay pinaghihiwalay sa isang hiwalay na crate package na "bindings", na pinapasimple ang muling pagtatayo kung ang mga pagbabago ay ginawa lamang sa pangunahing pakete na "kernel".
  • Pagpapatupad ng macro "concat_idents!" muling isinulat sa anyo ng isang procedural macro na hindi nakatali sa functionality ng concat_idents at pinapayagan ang paggamit ng mga sanggunian sa mga lokal na variable.
  • Ang macro na "static_assert!" ay muling isinulat, na nagpapahintulot sa paggamit ng "core::assert!()" sa anumang konteksto sa halip na mga constant.
  • Macro "build_error!" inangkop upang gumana kapag ang mode na "RUST_BUILD_ASSERT_{WARN,ALLOW}" ay nakatakda para sa mga module.
  • Nagdagdag ng hiwalay na file na may mga setting na "kernel/configs/rust.config".
  • Ang "*.i" na mga file na naproseso sa mga macro substitution ay pinalitan ng pangalan sa "*.rsi".
  • Ang suporta para sa pagbuo ng mga bahagi ng Rust na may mga antas ng pag-optimize na iba sa mga ginamit para sa C code ay hindi na ipinagpatuloy.
  • Nagdagdag ng module ng fs, na nagbibigay ng mga binding para sa pagtatrabaho sa mga file system. Isang halimbawa ng isang simpleng file system na nakasulat sa Rust ay ibinigay.
  • Nagdagdag ng workqueue module para sa pagtatrabaho sa system queues (nagbibigay ng mga binding sa work_struct at workqueue_struct na mga istruktura ng kernel).
  • Ang pagbuo ng kasync module ay nagpatuloy sa pagpapatupad ng mga asynchronous programming method (async). Nagdagdag ng halimbawa ng isang core-level na TCP server na nakasulat sa Rust.
  • Idinagdag ang kakayahang pangasiwaan ang mga interrupt sa Rust na wika gamit ang mga uri ng [Threaded]Handler at [Threaded]Registration`.
  • Idinagdag ang procedural macro "#[vtable]" upang gawing mas madaling gamitin ang mga talahanayan ng mga function pointer, gaya ng file_operations structure.
  • Idinagdag ang pagpapatupad ng mga naka-link na listahan ng bidirectional na "unsafe_list::List".
  • Nagdagdag ng paunang suporta para sa RCU (Read-copy-update) at Guard type para tingnan kung ang isang read lock ay nakatali sa kasalukuyang thread.
  • Idinagdag na Gawain::spawn() function upang lumikha at awtomatikong simulan ang mga kernel thread. Idinagdag din ang pamamaraang Gawain::wake_up().
  • Nagdagdag ng delay module na nagbibigay-daan sa iyong gumamit ng mga pagkaantala (isang wrapper sa msleep()).

Ginagawang posible ng mga iminungkahing pagbabago na gamitin ang Rust bilang pangalawang wika para sa pagbuo ng mga driver at kernel module. Ang suporta sa kalawang ay ipinakita bilang isang opsyon na hindi pinagana bilang default at hindi nagreresulta sa pagsasama ng Rust bilang isang kinakailangang build dependency para sa kernel. Ang paggamit ng Rust para sa pagpapaunlad ng driver ay magbibigay-daan sa iyo na lumikha ng mas ligtas at mas mahusay na mga driver na may kaunting pagsisikap, libre mula sa mga problema tulad ng pag-access sa memorya pagkatapos ng pagbabakante, mga hindi pagtukoy sa null pointer, at mga buffer overrun.

Ang kaligtasan ng memorya ay ibinibigay sa Rust sa oras ng pag-compile sa pamamagitan ng pagsuri sa sanggunian, pagsubaybay sa pagmamay-ari ng bagay at panghabambuhay ng bagay (saklaw), gayundin sa pamamagitan ng pagsusuri ng kawastuhan ng pag-access sa memorya sa panahon ng pagpapatupad ng code. Nagbibigay din ang kalawang ng proteksyon laban sa mga overflow ng integer, nangangailangan ng mandatoryong pagsisimula ng mga variable na halaga bago gamitin, mas mahusay na pinangangasiwaan ang mga error sa karaniwang library, inilalapat ang konsepto ng hindi nababagong mga sanggunian at mga variable bilang default, nag-aalok ng malakas na static na pag-type upang mabawasan ang mga lohikal na error.

Pinagmulan: opennet.ru

Magdagdag ng komento