Rust-for-Linux ááá±á¬áá»ááºááá¯áá±ážáá¬ážáá° Miguel Ojeda ááẠLinux kernel developer áá»á¬ážá០ááá·áºááœááºážá ááºážá á¬ážáááºá¡ááœáẠRust language ááœáẠá ááºáá á¹á ááºážáááá¯ááºáá¬áá»á¬ážáááºáá®ážáááºá¡ááœáẠv6 á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáá¯ááºááœáŸááºáá±ážááẠá¡ááá¯ááŒá¯áá²á·áááºá áááºážááẠáá¬ážááŸááºážáá¶áá«ááºááá«áá² áá¯ááºáá±ááá·áº ááááá¬ážááŸááºážááᯠááá·áºááœááºážá ááºážá á¬ážáᬠááá¹ááááŒá±á¬ááºáá¯ááºáá±ááŸá¯ááŒá áºáááºá áá¶áá»á±ážáááºááŒááºážááᯠá ááºážáááºáááºáᯠáá°ááá±á¬áºáááºáž linux-next áá¬áááœá²ááœáẠááá·áºááœááºážáá¬ážááŒá®ážááŒá áºááŒá®áž kernel subsystems áá»á¬ážáá±á«áºááœáẠabstraction layers áááºáá®ážááŒááºážá¡ááŒáẠdrivers ááŸáá·áº modules áá»á¬ážáá±ážáá¬ážááŒááºážá¡ááœáẠáá¯á¶áá±á¬ááºáá±á¬ áá®ááœááºáá¯ááºáá¯ááºáá¬ážáá«áááºá áá®ááœááºááŸá¯ááᯠGoogle ááŸáá·áº ISRG (Internet Security Research Group) á០áááºáá¯á¶ááœá±áá¶á·ááá¯ážáá¬ážááŒá®áž Let's Encrypt ááá±á¬áá»ááºááᯠáááºáá±á¬ááºáá°ááŒá áºááŒá®áž HTTPS ááŸáá·áº á¡ááºáá¬áááºáá¯á¶ááŒá¯á¶áá±ážááᯠááŒáŸáá·áºáááºááẠáááºážááá¬áá»á¬áž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠá¡á¬ážáá±ážáááºá
áá¬ážááŸááºážá¡áá áºááœááº-
- á¡ááŸá¬ážá¡ááœááºážáá»á¬áž ááŒá áºáá±á«áºáá¬ááá·áºá¡áá« "ááááºááá·áºá áá¬" á¡ááŒá±á¡áá±á០ááœááºááŒá±á¬ááºááá¯ááºááá·áº áááááá¬á¡á á¯á¶ááŸáá·áº ááœá²áá±áá¯á¶ážá áœá²ááá·áº áá áºáá»á áºááá¯ááºá áá°ááœá²áá áºáá»áá¯ážááᯠRust 1.60 áá¯ááºáá±ááŸá¯ááá¯á· á¡ááºááááºáá¯ááºáá¬ážááŒá®áž kernel áá¬áá±ážááŸá¯áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááá·áº "maybe_uninit_extra" áá¯ááºááᯠáááºááŒáááºá á±áá«áááºá
- á á¬áááºážááŒá¯á á¯ááŒááºážá០á ááºážáááºááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºááŸá¯ (á á¬ááœááºá á¬áááºážááœáẠááá°áá¬á¡ááŒá áºáááºáž á¡áá¯á¶ážááŒá¯ááá·áº á ááºážáááºááŸá¯áá»á¬áž) ááᯠkernel API ááŸáá·áº áá»áááºáááºáá¬ážáá±á¬ á ááºážáááºááŸá¯áá»á¬ážááᯠá¡áá»áááºáá¬áááŒá±á¬ááºážáá²ááŒááºážááŸáááá·áº kernel loading áá¯ááºáá±á áẠáá¯ááºáá±á¬ááºáá²á·áá±á¬ KUnit á ááºážáááºááŸá¯áá»á¬ážááá¯á· áá±á«ááºážááá·áºáá²á·áááºá
- á ááºážáááºááŸá¯áá»á¬ážááẠRust kernel áá¯ááºáá²á·ááá¯á· Clippy linter ááááá±ážáá»áẠáááŒá áºáá±á«áºá á±ááẠááá¯á¡ááºáá»ááºáá»á¬ážááᯠáááºáá¶áááŸááá¬ážáááºá
- ááœááºáááºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŒáá·áº ânetâ module á áááŠážá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠá¡ááá¯ááŒá¯áá¬ážáááºá Rust áá¯ááºááẠNamespace (struct net kernel áááºáá±á¬ááºáá¯á¶á¡áá±á«áº á¡ááŒá±áá¶á)á SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) ááŸáá·áº áááºážááá¯á·á IPv6 equi áá²á·ááá¯á·áá±á¬ kernel ááœááºáááºáááºáá±á¬ááºáá¯á¶áá»á¬ážááá¯á· áááºáá±á¬ááºááá¯ááºááẠ.
- kasync module ááá¯á¶á á¶ááŒáá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº á¡ááŒáá¯ááºá¡ááá¯áẠáááá¯ááááºážáááºážáááºážááá¬áá»á¬áž (async) á¡ááœáẠáááŠážáá¶á·ááá¯ážááŸá¯ááŸááá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠTCP sockets áá»á¬ážááᯠááá¯ááºááœááºááẠá¡áá®á¡áá»áŸ áá¯ááºááᯠáá±ážááá¯ááºáááº- async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf) á á±á¬áá·áºáá«?; n == 0 { return Ok(()); } stream.write_all(&buf[..n]).á á±á¬áá·áºáá«áá¬ážá } }
- áá±á«ááºážááá·áºáá¬ážáá±á¬ net::ááœááºááẠáááºááẠá á áºáá¯ááºááŸá¯áá»á¬ážááᯠááŒáá¯ážááá¯ááºáááºá¡ááœáẠá á áºáá¯ááºááá·áº áá±á¬áºáá»á°ážá Rust áá¬áá¬á áá¬ážááœáẠá á áºáá¯ááºááŸá¯ á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááŒáá·áº á¥ááᬠrust_netfilter.rs ááᯠááá·áºáá¬ážáááºá
- áááºááá¯ážáááºáááá¯á¡ááºáá±á¬ ááá¯ážááŸááºážáá±á¬ mutex smutex::Mutex ááᯠááá·áºááœááºážá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
- áá±á¬á·ááá¯áááºáá±á¬á·ááŸáá á±á¬áá·áºáá² NoWaitLock ááᯠáá±á«ááºážááá·áºáá¬ážááŒá®áž á¡ááŒá¬áž thread áá áºáá¯á០ááááºážááá¯ááºáá«á áá±á«áºááá¯áá°á¡á¬áž áááºááá·áºááá·áºá¡á á¬áž áá±á¬á·ááºááá°ááẠááŒáá¯ážáááºážáá±á¬á¡áá«ááœáẠá¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááᯠááŒá áºáá±á«áºá á±áá«áááºá
- idle áá¯ááºááááá±á¬ ááá¹ááá»á¬ážááá¯á· á¡áá¯á¶ážáá»ááẠkernel ááœáẠraw_spinlock_t ááŸáááºááŸááºáá¬ážáá±á¬ RawSpinLock ááᯠááá·áºáá¬ážáááºá
- á¡ááá¯ážá¡áá¬ážáá±ááœááºááŒááºážááá¹ááá¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áº á¡áá¬ááá¹áá¯áá áºáá¯á¡á¬áž ááá¯ážáá¬ážáááºá¡ááœáẠARef á¡áá»áá¯ážá¡á á¬ážááᯠáááºáá±á¬ááºážááá·áºááẠ(á¡ááŒá²-ááŒááºáá±ááœááºáááº)á
- GCC ááŸá áááá¯áá¬áááºáá¬áá»á¬ážááŸáá·áº ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá¡ááœáẠrustc ááŸá rustc ááŸá áá¯ááºáá¯ááºáá¯ááºáá°á¡ááŒá ẠGCC ááá±á¬áá»ááºá០libgccjit á á¬ááŒáá·áºááá¯ááºááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºááŒá¯ááá·áº rustc_codegen_gcc áá±á¬ááºáá¶áá°ááẠGCC ááœáẠrustc compiler ááᯠbootstrapping áá¯ááºááá¯ááºá áœááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá Compiler ááŒáŸáá·áºáááºááŒááºážááá¯áááºááŸá¬ rustc compiler ááá¯ááºááá¯ááºáááºáá±á¬ááºáááºá¡ááœáẠGCC-based code generator ááá¯áá¯á¶ážááá¯ááºáááºá ááá¯á·á¡ááŒááºá áááŒá¬áá±ážáá®á GCC 12.1 ááœáẠrustc_codegen_gcc ááŸááºáááºá áœá¬á¡áá¯ááºáá¯ááºááẠááá¯á¡ááºáá±á¬ libgccjit ááᯠááŒááºáááºááŒááºážáá»á¬áž áá«áááºáááºá rustup utility ááᯠá¡áá¯á¶ážááŒá¯á rustc_codegen_gcc ááᯠááá·áºááœááºážááá¯ááºá á±ááẠááŒááºáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáá±áá«áááºá
- GCC ááá¯á¡ááŒá±áá¶áá¬ážáá±á¬ Rust language compiler ááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŒáá·áº GCC frontend gccrs áááá¯ážáááºááŸá¯ááá¯ááŸááºáá¬ážáá¬ážáááºá áááºááŸáááœáẠgccrs ááœáẠá¡áá»áááºááŒáá·áº developer ááŸá áºáŠážááŸááááºá
á¡ááá¯ááŒá¯áá¬ážáá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠáááá¯ááºáá¬áá»á¬ážááŸáá·áº kernel module áá»á¬ážáááºáá®ážáááºá¡ááœáẠáá¯ááááá¬áá¬á áá¬ážá¡ááŒá ẠRust ááá¯á¡áá¯á¶ážááŒá¯ááẠááŒá áºááá¯ááºááŒá±á¬ááºáž áááááá«á Rust áá¶á·ááá¯ážááŸá¯ááᯠáá¯á¶áá±á¡á¬ážááŒáá·áº ááœáá·áºááá¬ážáá±á¬ ááœá±ážáá»ááºááŸá¯áá áºáá¯á¡áá±ááŒáá·áº áááºááŒáá¬ážááŒá®áž kernel á¡ááœáẠááá¯á¡ááºáá±á¬ áááºáá±á¬ááºááŸá¯ááŸá®ááá¯ááŸá¯áá áºáá¯á¡ááŒá ẠRust áá«áááºááŒááºážááᯠáááŒá áºáá±á«áºá á±áá«á áá¬ááºáá±á¬ááºážááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠRust ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº ááá·áºá¡á¬áž ááœááºáááºážááŒá®ážáá±á¬áẠááŸááºáá¬ááºáááºáá±á¬ááºááœáá·áºá null pointer dereferences ááŸáá·áº buffer overruns áá²á·ááá¯á·áá±á¬ ááŒá¿áá¬áá»á¬ážá០áááºážáá±ážááŒá®áž á¡áááºážáááºáᬠá¡á¬ážá áá¯ááºáá¯ááºááŒááºážááŒáá·áº ááá¯ááá¯áá±ážáááºážááŒá®áž ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áá¬ááºáá±á¬ááºážáá»á¬ážááᯠáááºáá®ážááá¯ááºáááºááŒá áºáááºá
ááá¯ážáá¬ážá
á
áºáá±ážááŒááºážá á¡áá¬ááá¹áá¯ááá¯ááºááá¯ááºááŸá¯ááá¯ááŒá±áá¬áá¶ááŒááºážááŸáá·áº á¡áá¬ááá¹áá¯áááºáááºáž (scope) ááá¯á·ááᯠá
á¯á
ááºážáá»áááºááœáẠRust ááœáẠMemory áá±ážáááºážáá±ážááᯠáá¶á·ááá¯ážáá±ážááá·áºá¡ááŒáẠáá¯ááºáá¯ááºáá±á¬ááºáá±á
ááºá¡ááœááºáž áááºááá¯áá®áááºáá±á¬ááºááŸá¯á ááŸááºáááºááŸá¯ááᯠá¡áá²ááŒááºááŒááºážááŸáááá·áº áá±ážáá«áááºá Rust ááẠááááºážááŒáá·áºááŒáá·áºáá»áŸá¶ááŸá¯áá»á¬ážááᯠá¡áá¬á¡ááœááºáá±ážáááºá á¡áá¯á¶ážáááŒá¯áá® ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬áááºááá¯ážáá»á¬ážááᯠáááŒá
áºááá±á
áááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºá á
á¶áá
áºáá»á
áºááá¯ááºááœáẠááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ á¡ááŸá¬ážáá»á¬ážááᯠááá¯ááºááœááºáááºá áá¯á¶áá±á¡á¬ážááŒáá·áº áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ ááá¯ážáá¬ážáá»ááºáá»á¬ážááŸáá·áº ááááºážááŸááºáá»á¬ážá ááá±á¬ááá¬ážááᯠáá»áá·áºáá¯á¶ážáááºá áá¯áá¹ááá¡ááŸá¬ážáá»á¬ážááᯠá¡áááºážáá¯á¶ážááŒá
áºá
á±ááẠááá¯ááºáá¯á¶áá±á¬á¡ááŒáááºá
á¬ááá¯ááºááŒááºážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
source: opennet.ru