Rust-for-Linux ááá±á¬áá»ááºááá¯áá±ážáá¬ážáá° Miguel Ojeda ááẠLinux kernel developer áá»á¬ážá០ááá·áºááœááºážá ááºážá á¬ážáááºá¡ááœáẠRust áá¬áá¬á áá¬ážááœáẠá ááºáá á¹á ááºážáááá¯ááºáá¬áá»á¬ážáááºáá®ážáááºá¡ááœáẠv8 á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáá¯ááºáá±ááẠá¡ááá¯ááŒá¯áá²á·áááºá áááºážááẠáá¬ážááŸááºážáá¶áá«ááºááá«áá² áá¯ááºáá±ááá·áº ááááá¬ážááŸááºážááᯠááá·áºááœááºážá ááºážá á¬ážáᬠááŒá¯ááŒááºáá¬ážáá±á¬ áá¬ážááŸááºážááŒá áºáááºá áá¶áá»á±ážáááºááŒááºážááᯠá ááºážáááºáááºáᯠáá°ááá±á¬áºáááºáž linux-next áá¬áááœá²ááœáẠááá·áºááœááºážáá¬ážááŒá®ážááŒá áºáááºá 5.20/6.0 á áá±á¬ááºážáŠážááœááºááŸáááŸá¯ááœáẠáá±á«ááºážá ááºážáá¬ážáááºáᯠááá¯áá¬á kernel subsystems áá»á¬ážáá±á«áºááœáẠabstraction layers áá»á¬ážáááºáá®ážááŒááºážá¡ááŒáẠdrivers áá»á¬ážáá±ážáá¬ážááŒááºážá¡ááœáẠáá¯á¶áá±á¬ááºáá±á¬ááá·áºáá»ááºááẠááŸáá·áº modules áá»á¬ážá áá®ááœááºááŸá¯ááᯠGoogle ááŸáá·áº ISRG (Internet Security Research Group) ááá¯á·á០áááºáá¯á¶ááœá±áá¶á·ááá¯ážáá¬ážááŒá®áž Let's Encrypt ááá±á¬áá»ááºááᯠáááºáá±á¬ááºáá°ááŒá áºááŒá®áž HTTPS ááŸáá·áº á¡ááºáá¬áááºáá¯á¶ááŒá¯á¶áá±ážááᯠááŒáŸáá·áºáááºááẠáááºážááá¬áá»á¬áž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠááŒáŸáá·áºáááºáá±ážáá«áááºá
áá¬ážááŸááºážá¡áá áºááœááº-
- á¡ááŸá¬ážá¡ááœááºážáá»á¬áž áá±á«áºáá±á«ááºáá¬áá±á¬á¡áá«ááœáẠááŒá áºááá¯ááºááŒá±ááŸááá±á¬ "ááááºááá·áºá áá¬" á¡ááŒá±á¡áá±ááᯠáá»áá¯ážáááºááá®áá² Rust 1.62 áá¯ááºáá±ááŸá¯á¡ááœáẠáááááá¬áááºáá¬ááá¬á¡á á¯á¶ááŸáá·áº á¡á á¯á¡áá±ážá á¬ááŒáá·áºááá¯ááºá áá°ááœá²áá áºáá»áá¯ážááᯠá¡ááºááááºáá¯ááºáá¬ážáááºá ááááºá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬áá¬ážááŸááºážááŸáá·áº ááŸáá¯ááºážááŸááºáá«áá Rust toolkit ááẠkernel áá¬áá±ážááŸá¯áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááá·áº const_fn_trait_bound áá¯ááºáá±á¬ááºááá¯ááºá áœááºážá¡ááœáẠáááºááŒáááºá á±áááºá
- á ááºážááŸá±á¬ááºáá¯ááºááᯠáááºááááºáá±á·áá»áº âkernelâ ááœááºáᬠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááŒá¯áá¯ááºáá«á ááŒááºáááºáááºáá±á¬ááºáá¬ááœáẠááá¯ážááŸááºážááœááºáá°á á±ááá·áº áá®ážááŒá¬ážáá±áá¹áá¬á¡áá¯áẠâbindingsâ á¡ááŒá Ạááœá²ááŒá¬ážáá¬ážáááºá
- áááºáááᯠâconcat_idents!â ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá concat_idents áá¯ááºáá±á¬ááºáá»ááºááŸáá·áº áááºá ááºááŸá¯áááŸááá±á¬ áá¯ááºáá¯á¶ážáá¯ááºáááºáž áááºáááá¯áá¯á¶á á¶ááŒáá·áº ááŒááºáááºáá±ážáá¬ážááŒá®áž áá±áááá¯ááºáᬠááááºážááŸááºáá»á¬ážááᯠááá¯ážáá¬ážá¡áá¯á¶ážááŒá¯ááŸá¯ááᯠááœáá·áºááŒá¯áááºá
- ááááºážáá±áá»á¬ážá¡á á¬áž áááºááá·áºá¡ááŒá±á¬ááºážá¡áá¬ááœááºáááᯠ"core::assert!()" ááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáá¬ážáá±á¬ "static_asssert!" áááºáááá¯ááᯠááŒááºáááºáá±ážáá¬ážáá¬ážáá«áááºá
- Macro "build_error!" áá±á¬áºáá»á°ážáá»á¬ážá¡ááœáẠâRUST_BUILD_ASSERT_{WARN, ALLOW}â áá¯ááºááᯠáááºááŸááºáá±á¬á¡áá«ááœáẠá¡áááºááŒá±á¡á±á¬áẠáá¯ááºáá±á¬ááºáá«á
- áááºáááºáá»á¬áž âkernel/configs/rust.configâ ááŒáá·áº áá®ážááŒá¬ážááá¯ááºáá áºáá¯ááᯠáá±á«ááºážááá·áºáá²á·áááºá
- áááºáááá¯á¡á á¬ážááá¯ážááŸá¯áá»á¬ážááœáẠáá¯ááºáá±á¬ááºáá²á·áá±á¬ â*.iâ ááá¯ááºáá»á¬ážááᯠâ*.rsiâ áᯠá¡áááºááŒá±á¬ááºážáá¬ážáááºá
- C áá¯ááºá¡ááœáẠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá¬áá»á¬ážááŸáá·áº ááœá²ááŒá¬ážáá±á¬ ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºáá¯ááºáá±á¬ááºááŸá¯á¡ááá·áºáá»á¬ážááŒáá·áº Rust á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáááºáá±á¬ááºááŒááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯á¡á¬áž áááºááá¯ááºážááá¯ááºáá«ááŒá®á
- ááá¯ááºá áá áºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠáá»áááºáááºááŸá¯áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážááá·áº fs module ááᯠááá·áºááœááºážáá¬ážáááºá Rust ááœáẠáá±ážáá¬ážáá±á¬ ááá¯ážááŸááºážáá±á¬ ááá¯ááºá áá áºá á¥ááá¬áá áºáá¯ááᯠáá±ážáá¬ážáááºá
- á áá áºáááºážá á®áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáááºá¡ááœáẠááœá²ááá·áºáá¬ážáá±á¬ workqueue module (work_struct ááŸáá·áº workqueue_struct kernel áááºáá±á¬ááºáá¯á¶áá»á¬áž) ááᯠáá±á«ááºážá ááºáá¬ážáááºá
- asynchronous programming method (async) ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŒáá·áº kasync module áááá¯ážáááºááŸá¯ááᯠáááºáááºáá¯ááºáá±á¬ááºáá²á·áá«áááºá Rust ááœááºáá±ážáá¬ážáá±á¬ core-level TCP server á á¥ááá¬áá áºáá¯ááᯠáááºááá·áºáá¬ážáááºá
- [Threaded]Handler á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŸáá·áº [Threaded]Registration` á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á Rust áá¬áá¬á áá¬ážááœáẠá¡ááŸá±á¬áá·áºá¡ááŸááºáá»á¬ážááᯠááá¯ááºááœááºááẠá áœááºážáááºááᯠááá·áºááœááºážáá¬ážáááºá
- file_operations ááœá²á·á ááºážáááºáá±á¬ááºáá¯á¶áá²á·ááá¯á·áá±á¬ function pointers ááá¬ážáá»á¬ážááŸáá·áºááá¯ááá¯ááœááºáá°á á±áááºá¡ááœáẠprocedural macro "#[vtable]" ááᯠááá·áºááœááºážáá¬ážáááºá
- "unsafe_list::List" á ááŸá áºááœááºáá»áááºáááºáá¬ážáá±á¬á á¬áááºážáá»á¬ážááᯠááá·áºááœááºážá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
- RCU (Read-copy-update) ááŸáá·áº Read lock ááẠáááºááŸá thread ááŸáá·áº áá»áááºáááºáá¬ážááŒááºáž ááŸááááŸá á á áºáá±ážááẠáááŠáž áá¶á·ááá¯ážááŸá¯ áááºááá·áºáá¬ážáááºá
- Added Task::spawn() function ááẠkernel thread áá»á¬ážááᯠáááºáá®ážááŒá®áž á¡ááá¯á¡áá»á±á¬ááºá áááºáááºá Task::wake_up() method ááá¯áááºáž ááá·áºááœááºážáá¬ážáá«áááºá
- ááŸá±á¬áá·áºááŸá±ážááŸá¯áá»á¬áž (msleep()) ááᯠá¡áá¯á¶ážááŒá¯ááẠááœáá·áºááŒá¯ááá·áº ááŸá±á¬áá·áºááŸá±ážááŸá¯ áá±á¬áºáá»á°ážááᯠááá·áºááœááºážáá¬ážáááºá
á¡ááá¯ááŒá¯áá¬ážáá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠáá¬ááºáá±á¬ááºážááŸáá·áº kernel module áá»á¬ážáááºáá®ážáááºá¡ááœáẠáá¯ááááá¬áá¬á áá¬ážá¡ááŒá ẠRust ááá¯á¡áá¯á¶ážááŒá¯ááẠááŒá áºááá¯ááºáá»á±ááŸááááºá Rust áá¶á·ááá¯ážááŸá¯ááᯠáá¯á¶áá±á¡á¬ážááŒáá·áº ááœáá·áºááá¬ážáá±á¬ ááœá±ážáá»ááºááŸá¯áá áºáá¯á¡áá±ááŒáá·áº áááºááŒáá¬ážááŒá®áž kernel á¡ááœáẠááá¯á¡ááºáá±á¬ áááºáá±á¬ááºááŸá¯ááŸá®ááá¯ááŸá¯áá áºáá¯á¡ááŒá ẠRust áá«áááºááŒááºážááᯠáááŒá áºáá±á«áºá á±áá«á áá¬ááºáá±á¬ááºážááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠRust ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº ááá·áºá¡á¬áž ááœááºáááºážááŒá®ážáá±á¬áẠááŸááºáá¬ááºáááºáá±á¬ááºááœáá·áºá null pointer dereferences ááŸáá·áº buffer overruns áá²á·ááá¯á·áá±á¬ ááŒá¿áá¬áá»á¬ážá០áááºážáá±ážááŒá®áž á¡áááºážáááºáᬠá¡á¬ážá áá¯ááºáá¯ááºááŒááºážááŒáá·áº ááá¯ááá¯áá±ážáááºážááŒá®áž ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áá¬ááºáá±á¬ááºážáá»á¬ážááᯠáááºáá®ážááá¯ááºáááºááŒá áºáááºá
ááá¯ážáá¬ážá
á
áºáá±ážááŒááºážá á¡áá¬ááá¹áá¯ááá¯ááºááá¯ááºááŸá¯ááá¯ááŒá±áá¬áá¶ááŒááºážááŸáá·áº á¡áá¬ááá¹áá¯áááºáááºáž (scope) ááá¯á·ááᯠá
á¯á
ááºážáá»áááºááœáẠRust ááœáẠMemory áá±ážáááºážáá±ážááᯠáá¶á·ááá¯ážáá±ážááá·áºá¡ááŒáẠáá¯ááºáá¯ááºáá±á¬ááºáá±á
ááºá¡ááœááºáž áááºááá¯áá®áááºáá±á¬ááºááŸá¯á ááŸááºáááºááŸá¯ááᯠá¡áá²ááŒááºááŒááºážááŸáááá·áº áá±ážáá«áááºá Rust ááẠááááºážááŒáá·áºááŒáá·áºáá»áŸá¶ááŸá¯áá»á¬ážááᯠá¡áá¬á¡ááœááºáá±ážáááºá á¡áá¯á¶ážáááŒá¯áá® ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬áááºááá¯ážáá»á¬ážááᯠáááŒá
áºááá±á
áááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºá á
á¶áá
áºáá»á
áºááá¯ááºááœáẠááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ á¡ááŸá¬ážáá»á¬ážááᯠááá¯ááºááœááºáááºá áá¯á¶áá±á¡á¬ážááŒáá·áº áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ ááá¯ážáá¬ážáá»ááºáá»á¬ážááŸáá·áº ááááºážááŸááºáá»á¬ážá ááá±á¬ááá¬ážááᯠáá»áá·áºáá¯á¶ážáááºá áá¯áá¹ááá¡ááŸá¬ážáá»á¬ážááᯠá¡áááºážáá¯á¶ážááŒá
áºá
á±ááẠááá¯ááºáá¯á¶áá±á¬á¡ááŒáááºá
á¬ááá¯ááºááŒááºážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
source: opennet.ru