ื”ื’ืจืกื” ื”ืฉื™ืฉื™ืช ืฉืœ ืชื™ืงื•ื ื™ื ืขื‘ื•ืจ ืœื™ื‘ืช ืœื™ื ื•ืงืก ืขื ืชืžื™ื›ื” ื‘ืฉืคืช Rust

Miguel Ojeda, ืžื—ื‘ืจ ืคืจื•ื™ืงื˜ Rust-for-Linux, ื”ืฆื™ืข ืฉื—ืจื•ืจ ืฉืœ ืจื›ื™ื‘ื™ v6 ืœืคื™ืชื•ื— ืžื ื”ืœื™ ื”ืชืงื ื™ื ื‘ืฉืคืช Rust ืœืฉืงื•ืœ ืขืœ ื™ื“ื™ ืžืคืชื—ื™ ืœื™ื‘ืช ืœื™ื ื•ืงืก. ื–ื•ื”ื™ ื”ืžื”ื“ื•ืจื” ื”ืฉื‘ื™ืขื™ืช ืฉืœ ื”ืชื™ืงื•ื ื™ื, ื‘ื”ืชื—ืฉื‘ ื‘ื’ืจืกื” ื”ืจืืฉื•ื ื”, ืฉืคื•ืจืกืžื” ืœืœื ืžืกืคืจ ื’ืจืกื”. ืชืžื™ื›ืช ื—ืœื•ื“ื” ื ื—ืฉื‘ืช ื ืกื™ื•ื ื™ืช, ืืš ื”ื™ื ื›ื‘ืจ ื›ืœื•ืœื” ื‘ืขื ืฃ ื”-linux-next ื•ืžืคื•ืชื—ืช ืžืกืคื™ืง ื›ื“ื™ ืœื”ืชื—ื™ืœ ื‘ืขื‘ื•ื“ื” ืขืœ ื™ืฆื™ืจืช ืฉื›ื‘ื•ืช ื”ืคืฉื˜ื” ืขืœ ื’ื‘ื™ ืชืช-ืžืขืจื›ื•ืช ืœื™ื‘ื”, ื›ืžื• ื’ื ื›ืชื™ื‘ืช ืžื ื”ืœื™ ื”ืชืงื ื™ื ื•ืžื•ื“ื•ืœื™ื. ื”ืคื™ืชื•ื— ืžืžื•ืžืŸ ืขืœ ื™ื“ื™ ื’ื•ื’ืœ ื•-ISRG (Internet Security Research Group), ื”ืžื™ื™ืกื“ืช ืืช ืคืจื•ื™ืงื˜ Let's Encrypt ื•ืžืงื“ืžืช HTTPS ื•ืคื™ืชื•ื— ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืœืฉื™ืคื•ืจ ืื‘ื˜ื—ืช ื”ืื™ื ื˜ืจื ื˜.

ื‘ื’ืจืกื” ื”ื—ื“ืฉื”:

  • ืขืจื›ืช ื”ื›ืœื™ื ื•ื’ืจืกื” ืฉืœ ืกืคืจื™ื™ืช alloc, ืžืฉื•ื—ืจืจืช ืžื”ื™ื•ื•ืฆืจื•ืช ืืคืฉืจื™ืช ืฉืœ ืžืฆื‘ "ืคืื ื™ืงื”" ื›ืืฉืจ ืžืชืจื—ืฉื•ืช ืฉื’ื™ืื•ืช, ืขื•ื“ื›ื ื• ืœื’ืจืกื” ืฉืœ Rust 1.60, ืืฉืจ ืžื™ื™ืฆื‘ืช ืชืžื™ื›ื” ื‘ืžืฆื‘ "maybe_uninit_extra" ื”ืžืฉืžืฉ ื‘ืชื™ืงื•ื ื™ ืœื™ื‘ื”.
  • ื ื•ืกืคื” ืืช ื”ื™ื›ื•ืœืช ืœื”ืจื™ืฅ ื‘ื“ื™ืงื•ืช ืžื”ืชื™ืขื•ื“ (ื‘ื“ื™ืงื•ืช ื”ืžืฉืžืฉื•ืช ื’ื ื›ื“ื•ื’ืžืื•ืช ื‘ืชื™ืขื•ื“), ื“ืจืš ื”ืžืจื” ื‘ื–ืžืŸ ื”ื™ื“ื•ืจ ืฉืœ ื‘ื“ื™ืงื•ืช ื”ืงืฉื•ืจื•ืช ืœ- API ืฉืœ ื”ืœื™ื‘ื” ืœื‘ื“ื™ืงื•ืช KUnit ืฉื‘ื•ืฆืขื• ื‘ืžื”ืœืš ื˜ืขื™ื ืช ื”ืœื™ื‘ื”.
  • ืื•ืžืฆื• ื“ืจื™ืฉื•ืช ืœืคื™ื”ืŸ ื‘ื“ื™ืงื•ืช ืœื ืฆืจื™ื›ื•ืช ืœื’ืจื•ื ืœืื–ื”ืจืช Clippy linter, ื‘ื“ื™ื•ืง ื›ืžื• ืงื•ื“ ืœื™ื‘ืช Rust.
  • ืžื•ืฆืข ื™ื™ืฉื•ื ืจืืฉื•ื ื™ ืฉืœ ืžื•ื“ื•ืœ "ื ื˜ื•" ืขื ืคื•ื ืงืฆื™ื•ืช ืจืฉืช. ืœืงื•ื“ Rust ื™ืฉ ื’ื™ืฉื” ืœืžื‘ื ื™ ืจืฉืช ืœื™ื‘ื” ื›ื’ื•ืŸ Namespace (ืžื‘ื•ืกืก ืขืœ ืžื‘ื ื” ืœื™ื‘ืช ื”-struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (socket struct), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) ื•ืžืงื‘ื™ืœื•ืชื™ื”ื ืœ-IPv6 .
  • ืงื™ื™ืžืช ืชืžื™ื›ื” ืจืืฉื•ื ื™ืช ื‘ื˜ื›ื ื™ืงื•ืช ืชื›ื ื•ืช ืืกื™ื ื›ืจื•ื ื™ (ืืกื™ื ื›ืจื•ื ื™), ื”ืžื™ื•ืฉืžืช ื‘ืฆื•ืจื” ืฉืœ ืžื•ื“ื•ืœ kasync. ืœื“ื•ื’ืžื”, ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืงื•ื“ ืืกื™ื ื›ืจื•ื ื™ ื›ื“ื™ ืœืชืคืขืœ ืฉืงืขื™ TCP: async fn echo_server(stream: TcpStream) -> ืชื•ืฆืื” { 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.
  • ื ื•ืกืฃ ื™ื™ืฉื•ื ืฉืœ mutex smutex::Mutex ืคืฉื•ื˜, ืฉืื™ื ื• ื“ื•ืจืฉ ื”ืฆืžื“ื”.
  • ื ื•ืกืฃ NoWaitLock, ืฉืœืขื•ืœื ืœื ืžืžืชื™ืŸ ืœื ืขื™ืœื”, ื•ืื ื”ื•ื ืชืคื•ืก ืขืœ ื™ื“ื™ ืฉืจืฉื•ืจ ืื—ืจ, ื’ื•ืจื ืœื“ื™ื•ื•ื— ืขืœ ืฉื’ื™ืื” ื‘ืขืช ื ื™ืกื™ื•ืŸ ืœืจื›ื•ืฉ ืืช ื”ื ืขื™ืœื” ื‘ืžืงื•ื ืœืขืฆื•ืจ ืืช ื”ืžืชืงืฉืจ.
  • ื ื•ืกืฃ RawSpinLock, ื”ืžื–ื•ื”ื” ืขืœ ื™ื“ื™ raw_spinlock_t ื‘ืงืจื ืœ, ื›ื“ื™ ืœื”ื—ื™ืœ ืขืœ ืงื˜ืขื™ื ืฉืื™ื ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืคืขื™ืœื™ื.
  • ื ื•ืกืฃ ืกื•ื’ ARef ืขื‘ื•ืจ ื”ืคื ื™ื•ืช ืœืื•ื‘ื™ื™ืงื˜ ืฉืขืœื™ื• ืžื•ื—ืœ ืžื ื’ื ื•ืŸ ืกืคื™ืจืช ื”ืคื ื™ื•ืช (ืชืžื™ื“ ื ืกืคื•ืจ ืžื—ื“ืฉ).
  • ื”-backend rustc_codegen_gcc, ื”ืžืืคืฉืจ ืœืš ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ืช libgccjit ืžืคืจื•ื™ืงื˜ GCC ื›ืžื—ื•ืœืœ ืงื•ื“ ื‘-rustc ื›ื“ื™ ืœืกืคืง ืœ-rustc ืชืžื™ื›ื” ื‘ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ื•ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ื”ื–ืžื™ื ื•ืช ื‘-GCC, ื”ื˜ืžื™ืข ืืช ื”ื™ื›ื•ืœืช ืœืืชื—ืœ ืืช ืžื”ื“ืจ rustc. ืงื™ื“ื•ื ืžื”ื“ืจ ืคื™ืจื•ืฉื• ื”ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘ืžื—ื•ืœืœ ืงื•ื“ ืžื‘ื•ืกืก GCC ื‘-rustc ื›ื“ื™ ืœื‘ื ื•ืช ืืช ืžื”ื“ืจ rustc ืขืฆืžื•. ื‘ื ื•ืกืฃ, ื”ืžื”ื“ื•ืจื” ื”ืื—ืจื•ื ื” ืฉืœ GCC 12.1 ื›ื•ืœืœืช ืชื™ืงื•ื ื™ื ืœ-libgccjit ื”ื ื—ื•ืฆื™ื ื›ื“ื™ ืฉ-rustc_codegen_gcc ื™ืคืขืœ ื›ื”ืœื›ื”. ืžืชื‘ืฆืขื•ืช ื”ื›ื ื•ืช ื›ื“ื™ ืœืกืคืง ืืช ื”ื™ื›ื•ืœืช ืœื”ืชืงื™ืŸ rustc_codegen_gcc ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช Rustup.
  • ืžืฆื™ื™ื ืช ื”ื”ืชืงื“ืžื•ืช ื‘ืคื™ืชื•ื— ื”-gccrs Frontend GCC ืขื ื™ื™ืฉื•ื ืžื”ื“ืจ ืฉืคืช Rust ื”ืžื‘ื•ืกืก ืขืœ GCC. ื™ืฉ ื›ืจื’ืข ืฉื ื™ ืžืคืชื—ื™ื ื‘ืžืฉืจื” ืžืœืื” ืฉืขื•ื‘ื“ื™ื ืขืœ gccrs.

ื ื–ื›ื™ืจ ื›ื™ ื”ืฉื™ื ื•ื™ื™ื ื”ืžื•ืฆืขื™ื ืžืืคืฉืจื™ื ืœื”ืฉืชืžืฉ ื‘- Rust ื›ืฉืคื” ืฉื ื™ื™ื” ืœืคื™ืชื•ื— ืžื ื”ืœื™ ื”ืชืงื ื™ื ื•ืžื•ื“ื•ืœื™ ืœื™ื‘ื”. ืชืžื™ื›ืช Rust ืžื•ืฆื’ืช ื›ืืคืฉืจื•ืช ืฉืื™ื ื” ืžื•ืคืขืœืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื•ืื™ื ื” ื’ื•ืจืžืช ืœื›ืš ืฉ- Rust ื ื›ืœืœ ื›ืชืœื•ืช ื‘ื ื™ื™ื” ื ื“ืจืฉืช ืขื‘ื•ืจ ื”ืœื™ื‘ื”. ืฉื™ืžื•ืฉ ื‘-Rust ืœืคื™ืชื•ื— ืžื ื”ืœื™ ื”ืชืงื ื™ื ื™ืืคืฉืจ ืœืš ืœื™ืฆื•ืจ ื“ืจื™ื™ื‘ืจื™ื ื‘ื˜ื•ื—ื™ื ื•ื˜ื•ื‘ื™ื ื™ื•ืชืจ ื‘ืžื™ื ื™ืžื•ื ืžืืžืฅ, ืœืœื ื‘ืขื™ื•ืช ื›ื’ื•ืŸ ื’ื™ืฉื” ืœื–ื™ื›ืจื•ืŸ ืœืื—ืจ ืฉื—ืจื•ืจ, ื”ืคื ื™ื•ืช ืžืฆื‘ื™ืขื•ืช ืืคืกื™ื•ืช ื•ื—ืจื™ื’ื•ืช ืžืื’ืจ.

ื‘ื˜ื™ื—ื•ืช ื–ื™ื›ืจื•ืŸ ืžืกื•ืคืงืช ื‘-Rust ื‘ื–ืžืŸ ื”ืงื•ืžืคื™ืœืฆื™ื” ื‘ืืžืฆืขื•ืช ื‘ื“ื™ืงืช ื”ืชื™ื™ื—ืกื•ืช, ืžืขืงื‘ ืื—ืจ ื‘ืขืœื•ืช ืขืœ ืื•ื‘ื™ื™ืงื˜ ื•ืžืฉืš ื—ื™ื™ ืื•ื‘ื™ื™ืงื˜ (ื”ื™ืงืฃ), ื•ื›ืŸ ื‘ืืžืฆืขื•ืช ื”ืขืจื›ื” ืฉืœ ื ื›ื•ื ื•ืช ื”ื’ื™ืฉื” ืœื–ื™ื›ืจื•ืŸ ื‘ืžื”ืœืš ื‘ื™ืฆื•ืข ืงื•ื“. Rust ืžืกืคืงืช ื’ื ื”ื’ื ื” ืžืคื ื™ ื”ืฆืคืช ืžืกืคืจื™ื ืฉืœืžื™ื, ื“ื•ืจืฉืช ืืชื—ื•ืœ ื—ื•ื‘ื” ืฉืœ ืขืจื›ื™ ืžืฉืชื ื™ื ืœืคื ื™ ื”ืฉื™ืžื•ืฉ, ืžื˜ืคืœืช ื‘ืฉื’ื™ืื•ืช ื˜ื•ื‘ ื™ื•ืชืจ ื‘ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช, ืžื™ื™ืฉืžืช ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ื”ืคื ื™ื•ืช ื•ืžืฉืชื ื™ื ื‘ืœืชื™ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืžืฆื™ืขื” ื”ืงืœื“ื” ืกื˜ื˜ื™ืช ื—ื–ืงื” ื›ื“ื™ ืœืžื–ืขืจ ืฉื’ื™ืื•ืช ืœื•ื’ื™ื•ืช.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”