Rust-for-Linux ááá±á¬áá»ááºááá¯áá±ážáá¬ážáá° Miguel Ojeda ááẠLinux kernel developer áá»á¬ážá¡ááœáẠRust language ááœáẠdevice drivers áá»á¬ážáááºáá®ážáááºá¡ááœáẠááááá¡á áááºá¡ááá¯ááºážááœá±ážáá»ááºááŸá¯ááᯠá¡ááá¯ááŒá¯áá²á·áááºá áá¶áá»á±ážáááºááŒááºáž áá¶á·ááá¯ážááŸá¯ááᯠá ááºážáááºáááºáᯠáá°ááá±á¬áºáááºáž linux-next áá¬áááœá²ááœáẠáá«áááºááẠááá±á¬áá°áá¬ážááŒá®ážááŒá áºáááºá áá®ááœááºááŸá¯ááᯠGoogle ááŸáá·áº ISRG (Internet Security Research Group) á០áááºáá¯á¶ááœá±áá¶á·ááá¯ážáá¬ážááŒá®áž Let's Encrypt ááá±á¬áá»ááºááᯠáááºáá±á¬ááºáá°ááŒá áºááŒá®áž HTTPS ááŸáá·áº á¡ááºáá¬áááºáá¯á¶ááŒá¯á¶áá±ážááᯠááŒáŸáá·áºáááºááẠáááºážááá¬áá»á¬áž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠá¡á¬ážáá±ážáááºá
á¡ááá¯ááŒá¯áá¬ážáá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠáááá¯ááºáá¬áá»á¬ážááŸáá·áº kernel module áá»á¬ážáááºáá®ážáááºá¡ááœáẠáá¯ááááá¬áá¬á áá¬ážá¡ááŒá ẠRust ááá¯á¡áá¯á¶ážááŒá¯ááẠááŒá áºááá¯ááºááŒá±á¬ááºáž áááááá«á Rust áá¶á·ááá¯ážááŸá¯ááᯠáá¯á¶áá±á¡á¬ážááŒáá·áº ááœáá·áºááá¬ážáá±á¬ ááœá±ážáá»ááºááŸá¯áá áºáá¯á¡áá±ááŒáá·áº áááºááŒáá¬ážááŒá®áž kernel á¡ááœáẠááá¯á¡ááºáá±á¬ áááºáá±á¬ááºááŸá¯ááŸá®ááá¯ááŸá¯áá áºáá¯á¡ááŒá ẠRust áá«áááºááŒááºážááᯠáááŒá áºáá±á«áºá á±áá«á áá¬ááºáá±á¬ááºážááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠRust ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº ááá·áºá¡á¬áž ááœááºáááºážááŒá®ážáá±á¬áẠááŸááºáá¬ááºáááºáá±á¬ááºááœáá·áºá null pointer dereferences ááŸáá·áº buffer overruns áá²á·ááá¯á·áá±á¬ ááŒá¿áá¬áá»á¬ážá០áááºážáá±ážááŒá®áž á¡áááºážáááºáᬠá¡á¬ážá áá¯ááºáá¯ááºááŒááºážááŒáá·áº ááá¯ááá¯áá±ážáááºážááŒá®áž ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áá¬ááºáá±á¬ááºážáá»á¬ážááᯠáááºáá®ážááá¯ááºáááºááŒá áºáááºá
ááá¯ážáá¬ážá á áºáá±ážááŒááºážá á¡áá¬ááá¹áá¯ááá¯ááºááá¯ááºááŸá¯ááá¯ááŒá±áá¬áá¶ááŒááºážááŸáá·áº á¡áá¬ááá¹áá¯áááºáááºáž (scope) ááá¯á·ááᯠá á¯á ááºážáá»áááºááœáẠRust ááœáẠMemory áá±ážáááºážáá±ážááᯠáá¶á·ááá¯ážáá±ážááá·áºá¡ááŒáẠáá¯ááºáá¯ááºáá±á¬ááºáá±á ááºá¡ááœááºáž áááºááá¯áá®áááºáá±á¬ááºááŸá¯á ááŸááºáááºááŸá¯ááᯠá¡áá²ááŒááºááŒááºážááŸáááá·áº áá±ážáá«áááºá Rust ááẠááááºážááŒáá·áºááŒáá·áºáá»áŸá¶ááŸá¯áá»á¬ážááᯠá¡áá¬á¡ááœááºáá±ážáááºá á¡áá¯á¶ážáááŒá¯áá® ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬áááºááá¯ážáá»á¬ážááᯠáááŒá áºááá±á áááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºá á á¶áá áºáá»á áºááá¯ááºááœáẠááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ á¡ááŸá¬ážáá»á¬ážááᯠááá¯ááºááœááºáááºá áá¯á¶áá±á¡á¬ážááŒáá·áº áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ ááá¯ážáá¬ážáá»ááºáá»á¬ážááŸáá·áº ááááºážááŸááºáá»á¬ážá ááá±á¬ááá¬ážááᯠáá»áá·áºáá¯á¶ážáááºá áá¯áá¹ááá¡ááŸá¬ážáá»á¬ážááᯠá¡áááºážáá¯á¶ážááŒá áºá á±ááẠááá¯ááºáá¯á¶áá±á¬á¡ááŒáááºá á¬ááá¯ááºááŒááºážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
áá¬áá±ážááŸá¯áá¬ážááŸááºážá¡áá áºááẠáá¬áá±ážááŸá¯á áááááŸáá·áº áá¯ááááá¬ážááŸááºážáá»á¬ážááᯠááœá±ážááœá±ážáá±á ááºá¡ááœááºáž ááŒá¯áá¯ááºáá²á·áá±á¬ ááŸááºáá»ááºáá»á¬ážááᯠáááºáááºáááºááŸá¬ážáá±ážáá«áááºá áááá¬áááºááŸá¬ážáá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬áž-
- ááá¯ážáá¬ážááŸá¯á á¯á ááºážááŸá¯á¡ááŒá ẠRust 1.57 ááááºááŒáááºáá±á¬áá¯ááºáá±ááŸá¯ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž Rust 2021 áá¬áá¬á áá¬ážááááºááŒáááºáá±á¬áá¯ááºáá±ááŸá¯ááá·áºááºááᯠáá±ážáá±á¬ááºáá¬ážáááºá ááááºá áá¬áá±ážááŸá¯áá»á¬ážááᯠRust á beta áá¬áááœá²ááŸáá·áºáá»áááºáááºáá¬ážááŒá®áž á¡áá»áá¯á·áá±á¬áá¬áá¬á áá¬ážá¡ááºá¹áá«áááºáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯áá²á·áááºá ááááºáááŒáááºá¡ááŒá ẠáááºááŸááºáá¬ážáááºá Rust 2021 áááºááŸááºáá»ááºááá¯á· áá°ážááŒá±á¬ááºážááŒááºážááẠconst_fn_transmuteá const_panicá const_unavailable_unchecked ááŸáá·áº core_panic ááŸáá·áº try_reserve áá²á·ááá¯á·áá±á¬ áá¬áá±ážááŸá¯áá»á¬ážááœáẠááááºáááŒáááºáá±á¬ á¡ááºá¹áá«áááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá០ááŸá±á¬ááºááŒááºááá¯ááºá á±áá«áááºá
- áá¬áá±ážááŸá¯áá»á¬ážááœáẠáá«áááºáá±á¬ Rust á á¬ááŒáá·áºááá¯ááºá ááœá²áá±áá¯á¶ážá áœá²ááŸá¯áá¬ážááŸááºáž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠáááºáááºáá¯ááºáá±á¬ááºáá±ááŒá®áž á¡ááŸá¬ážá¡ááœááºážáá»á¬áž áá±á«áºáá±á«ááºáá¬áá±á¬á¡áá«ááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬áž áá±á«áºáá±á«ááºáá¬áá±á¬á¡áá«ááœáẠâááááºááá·áºááŒááºážâ á¡ááŒá±á¡áá±á ááŒá áºááá¯ááºááŒá±ááŸááá±á¬ âááááºááá·áºááŒááºážâ á¡ááŒá±á¡áá±á ááœááºážáá¶ááŸá¯áá»á¬ážá¡á¬áž áááºááŸá¬ážááẠááŒá¯ááŒááºáá²á·áááºá áá¬ážááŸááºážá¡áá áºááœáẠkernel Rust áá¯ááºááœáẠá¡áá¯á¶ážáááŒá¯ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááááºááẠ"no_rc" ááŸáá·áº "no_sync" ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®áž á á¬ááŒáá·áºááá¯ááºááᯠáá±á¬áºáá»á°áá¬ááŒá áºá á±áááºá kernel á¡ááœáẠááá¯á¡ááºáá±á¬ á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáááºáá á¬ááŒáá·áºááá¯ááºááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážááẠáááºááœááºáá±á¬ áááºáááœá²áááºážáá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬áá»á¬ážááŸáá·áºá¡áá° á¡áá¯ááºáááºáá¯ááºáááºá kernel á¡ááá·áºááœáẠáá¯ááºáá±á¬ááºááẠá á¬ááŒáá·áºááá¯ááºá¡ááœáẠááá¯á¡ááºáá±á¬ âno_fp_fmt_parseâ ááœá±ážáá»ááºááœáá·áºááᯠRust á¡ááŒá±áá¶á á¬ááŒáá·áºááá¯áẠ(core) ááá¯á· ááœáŸá±á·áá¬ážáááºá
- CONFIG_WERROR áá¯ááºááœáẠkernel ááá¯áááºáá±á¬ááºáá±á¬á¡áá« ááŒá áºááá¯ááºáá±á¬ compiler ááááá±ážáá»ááºáá»á¬ážááᯠáááºááŸá¬ážááẠáá¯ááºááᯠááá·áºá ááºáá¬ážáááºá Rust ááœáẠáá¯ááºáááºáá±á¬ááºááá·áºá¡áá«á áááºáá±á¬ááºáž compiler áá±á¬áá«ááŸá¬ááœá±áá±ážáá¯ááºáá»á¬ážááŸáá·áº Clippy linter ááááá±ážáá»ááºáá»á¬ážááᯠááœáá·áºáá¬ážáááºá
- Abstractions áá»á¬ážááẠseqlocks (sequence locks)á power management á¡ááœáẠcallback callsá I/O Memory (readX/writeX)á interrupt ááŸáá·áº thread handlersá GPIOá á ááºáá»á¬ážá áá¬ááºáá±á¬ááºážáá»á¬ážááŸáá·áº á¡áá±á¬ááºá¡áá¬ážáá»á¬ážáᶠáááºáá±á¬ááºááœáá·áºá¡ááœáẠAbstractions áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠá¡ááá¯ááŒá¯áá¬ážáá«áááºá
- áá¬ááºáá±á¬ááºážááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠáááááá¬áá»á¬ážááœáẠáá±áá¬ááœáŸá±á·ááŒá±á¬ááºážááá¯ááºáá±á¬ mutexesá bit iteratorsá ááá¯ážááŸááºážáá±á¬ pointer bindingsá ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ á¡ááŸá¬ážááŸá¬ááœá±ááŒááºážáá»á¬ážááŸáá·áº áá±áá¬áááºá áºáá¬áž-á¡ááŸá®á¡ááá¯áááºážáá±á¬ á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬ážáá«áááºááẠáá»á²á·ááœááºáá¬ážáá«áááºá
- á¡ááá¯ážá¡áá¬ážáá»á¬ážáá±ááœááºáááºá¡ááœáẠáá°áá®áá±á¬á¡áááºá kernel API ááá¯á¡áá¯á¶ážááŒá¯ááá·áº refcount_t áá±á¬ááºáá¶ááá¯á¡ááŒá±áá¶á ááá¯ážááŸááºážáá±á¬ Ref á¡áá»áá¯ážá¡á á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áº ááá·áºááºáá»á¬ážááŒáá·áº ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºáá¯ááºáá±á¬ááºáá«á Standard alloc áá áºáá»á áºááá¯ááºááœáẠáá¶á·ááá¯ážáá±ážáá¬ážááá·áº Arc ááŸáá·áº Rc á¡áá»áá¯ážá¡á á¬ážáá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááᯠáááºááŸá¬ážááá¯ááºááŒá®áž kernel á¡ááá·áºááœáẠáá¯ááºáá±á¬ááºááá·áº áá¯ááºááœáẠááááŸáááá¯ááºáá« (á€á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠááááºáá¬ážááá·áº á á¬ááŒáá·áºááá¯ááºááá¯ááºááá¯ááºá¡ááœáẠááœá±ážáá»ááºá áá¬áá»á¬ážááᯠááŒááºáááºáá¬ážáááº)á
- áá¬áá±ážááŸá¯áá»á¬ážááœáẠRust ááœáẠááŒááºáááºáá±ážáá¬ážáá¬ážáá±á¬ PL061 GPIO áááá¯ááºáá¬áá¬ážááŸááºážáá áºáá¯áá«áááºáááºá áááá¯ááºáá¬á á¡áá°ážá¡ááºá¹áá«áááºááŸá¬ áááºážá á¡áá±á¬ááºá¡áááºáá±á¬áºáá±á¬ááºááœááºááŸá¯ááẠáááºááŸá GPIO áááá¯ááºáá¬ááᯠC áá¬áá¬á áá¬ážááŒáá·áº áááºáá«ááá²áá² áá¯ááºáá±á¬ááºáá±ááŒááºáž ááŒá áºáááºá Rust ááœáẠáááá¯ááºáá¬áá»á¬áž áááºáá®ážááŒááºážááŸáá·áº áááºážááŸá®ážááá¯ááá·áº developer áá»á¬ážá¡ááœááºá Rust ááœáẠáááºááá·áº constructs áá»á¬ážááᯠC áá¯ááºá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áááºááᯠáá¬ážáááºááá¯ááºá á±ááá·áº ááá¯ááºážáá áºáá¯áá»ááºáž ááŸáá¯ááºážááŸááºáá»ááºááᯠááŒááºáááºáá¬ážáá«áááºá
- áááºá Rust áá¯ááºáá±á·á áºááẠlibgccjit á á¬ááŒáá·áºááá¯ááºááᯠá¡áá¯á¶ážááŒá¯á á¡áá»áááºáááá¯ááºáá® (AOT) á á¯á ááºážááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº GCC á¡ááœáẠrustc áá±á¬ááºáá¶á¡ááºááºááẠrustc_codegen_gcc ááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá backend á ááŸááºáááºáá±á¬ ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááŸáá·áºá¡áá°á áááºážááẠGCC ááᯠá¡áá¯á¶ážááŒá¯á kernel ááœááºáá«áááºáá±á¬ Rust áá¯ááºááᯠá á¯áá±á¬ááºážááá¯ááºá á±áááºááŒá áºáááºá
- ARMá Google ááŸáá·áº Microsoft á¡ááŒáẠRed Hat ááẠLinux kernel ááœáẠRust áá¬áá¬á áá¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠá áááºáááºá á¬ážááŒá±á¬ááºáž áá±á¬áºááŒáá²á·áááºá Google ááẠRust for Linux ááá±á¬áá»ááºá¡ááœáẠááá¯ááºááá¯ááºáá¶á·ááá¯ážááŸá¯áá±ážáááºá Rust ááŸá Binder á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááá¹ááá¬ážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡áá áºááᯠáááºáá®ážáá±ááŒá®áž Rust ááœáẠá¡áá»áá¯ážáá»áá¯ážáá±á¬áááá¯ááºáá¬áá»á¬ážááᯠááŒááºáááºáá¯ááºáá±á¬ááºááá¯ááºááŒá±ááᯠá ááºážá á¬ážáá±ááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·ááááááŒáá«á áá¯á·á Microsoft ááẠRust ááœáẠHyper-V á¡ááœáẠdrivers áá»á¬ážááá¯á áááºá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá ARM ááẠARM-based á áá áºáá»á¬ážá¡ááœáẠRust á¡áá±á¬ááºá¡áá¶á·ááᯠááŒáŸáá·áºáááºááẠáá¯ááºáá±á¬ááºáá±áááºá IBM ááẠPowerPC á áá áºáá»á¬ážá¡ááœáẠkernel ááœáẠRust áá¶á·ááá¯ážááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá
source: opennet.ru