Versi kagenep patch pikeun kernel Linux kalayan dukungan pikeun basa Rust

МигСль ΠžΡ…Π΅Π΄Π° (Miguel Ojeda), Π°Π²Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Rust-for-Linux, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» для рассмотрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ядра Linux выпуск v6 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² устройств Π½Π° языкС Rust. Π­Ρ‚ΠΎ сСдьмая рСдакция ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π΅Π· Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Rust рассматриваСтся ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ, Π½ΠΎ ΡƒΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π²Π΅Ρ‚ΠΊΡƒ linux-next ΠΈ достаточно Ρ€Π°Π·Π²ΠΈΡ‚Π° для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ созданию слоёв абстракции Π½Π°Π΄ подсистСмами ядра, Π° Ρ‚Π°ΠΊΠΆΠ΅ для написания Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° финансируСтся ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Google ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ISRG (Internet Security Research Group), которая являСтся ΡƒΡ‡Ρ€Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Let’s Encrypt ΠΈ способствуСт ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡŽ HTTPS ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ защищённости ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°.

Dina versi anyar:

  • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ alloc, ΠΈΠ·Π±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΉ состояния Β«panicΒ» ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибок, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ‹ Π΄ΠΎ выпуска Rust 1.60, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стабилизирована ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΠ° Β«maybe_uninit_extraΒ», примСняСмого Π² ΠΏΠ°Ρ‚Ρ‡Π°Ρ… ΠΊ ядру.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния тСстов ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (тСсты, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ), Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎ врСмя компиляции тСстов, завязанных Π½Π° API ядра, Π² тСсты KUnit, выполняСмыС Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ядра.
  • ΠŸΡ€ΠΈΠ½ΡΡ‚Ρ‹ трСбования, Π² соотвСтствии с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ тСсты Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ прСдупрСТдСния Π»ΠΈΠ½Ρ‚Π΅Ρ€Π° Clippy, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ΄ для ядра Π½Π° языкС Rust.
  • ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ рСализация модуля Β«netΒ» с сСтСвыми функциями. Для ΠΊΠΎΠ΄Π° Π½Π° языкС Rust прСдоставлСн доступ ΠΊ Ρ‚Π°ΠΊΠΈΡ… сСтСвым структурам ядра, ΠΊΠ°ΠΊ Β«NamespaceΒ» (Π½Π° основС структуры ядра Β«struct netΒ»), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) ΠΈ ΠΈΡ… эквивалСнтам для IPv6.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² асинхронного программирования (async), рСализованная Π² Ρ„ΠΎΡ€ΠΌΠ΅ модуля kasync. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠΎΠ΄ для манипуляции с TCP-сокСтами: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ net::filter для манипуляции с Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌΠΈ сСтСвых ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ rust_netfilter.rs с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π½Π° языкС Rust.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° рСализация простого ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° smutex::Mutex, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π³ΠΎ привязки (pinning).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° NoWaitLock, которая Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ оТиданию освобоТдСния, Π° Π² случаС занятия Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибки ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ вмСсто остановки Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° RawSpinLock отоТдСствлённая с raw_spinlock_t Π² ядрС, примСняСмая ΠΊ сСкциям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² состоянии оТидания.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ‚ΠΈΠΏ ARef для ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ примСняСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ подсчёта ссылок (always-refcounted).
  • Π’ бэкСндС rustc_codegen_gcc, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libgccjit ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GCC Π² качСствС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° Π² rustc для обСспСчСния Π² rustc ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ доступных Π² GCC Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ раскрутки компилятора (bootstrapping) rustc. Под раскруткой компилятора понимаСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Π² rustc Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° Π½Π° основС GCC для сборки самого компилятора rustc. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π½Π΅Π΄Π°Π²Π½ΠΈΠΉ выпуск GCC 12.1 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ исправлСния Π² libgccjit, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ rustc_codegen_gcc. ВСдётся ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ возмоТности установки rustc_codegen_gcc ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ rustup.
  • ΠžΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ΡΡ прогрСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ GCC-фронтэнда gccrs с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ компилятора языка Rust Π½Π° Π±Π°Π·Π΅ GCC. Π’ настоящСС врСмя Π½Π°Π΄ gccrs Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ для Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Π²Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Γ‰mut yΓ©n parobihan anu diusulkeun ngamungkinkeun ngagunakeun Rust salaku basa kadua pikeun ngembangkeun supir sareng modul kernel. Pangrojong karat dibere salaku pilihan anu henteu diaktipkeun sacara standar sareng henteu nyababkeun Karat kalebet salaku katergantungan ngawangun anu diperyogikeun pikeun kernel. Ngagunakeun Rust pikeun ngembangkeun supir bakal ngidinan Anjeun pikeun nyieun drivers aman tur hadΓ© kalawan usaha minimal, bΓ©bas tina masalah kayaning aksΓ©s memori sanggeus freeing, null pointer dereferences, sarta overruns panyangga.

Kasalametan memori disadiakeun dina Rust dina waktos compile ngaliwatan mariksa rujukan, ngalacak kapamilikan obyΓ©k sarta hirupna objΓ©k (wengkuan), kitu ogΓ© ngaliwatan evaluasi correctness aksΓ©s memori salila palaksanaan kode. Karat ogΓ© nyadiakeun panyalindungan ngalawan overflows integer, merlukeun variabel bisa initialized samΓ©mΓ©h pamakΓ©an, handles kasalahan hadΓ© dina perpustakaan baku, nerapkeun konsΓ©p rujukan immutable sarta variabel sacara standar, sarta nawarkeun ketikan statik kuat pikeun ngaleutikan kasalahan logis.

sumber: opennet.ru

Tambahkeun komentar