zerocopy
ΠΡΠ΅ΠΉΡ zerocopy
(Π²ΡΠ΄ Fuchsia) Π½Π°Π΄Π°Ρ ΡΡΠ΅ΠΉΡΠΈ ΡΠ° ΠΌΠ°ΠΊΡΠΎΡΠΈ Π΄Π»Ρ Π±Π΅Π·ΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ²ΠΎΡΠ΅Π½Π½Ρ ΠΌΡΠΆ ΠΏΠΎΡΠ»ΡΠ΄ΠΎΠ²Π½ΠΎΡΡΡΠΌΠΈ Π±Π°ΠΉΡΡΠ² ΡΠ° ΡΠ½ΡΠΈΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ.
use zerocopy::{Immutable, IntoBytes}; #[repr(u32)] #[derive(Debug, Default, Immutable, IntoBytes)] enum RequestType { #[default] In = 0, Out = 1, Flush = 4, } #[repr(C)] #[derive(Debug, Default, Immutable, IntoBytes)] struct VirtioBlockRequest { request_type: RequestType, reserved: u32, sector: u64, } fn main() { let request = VirtioBlockRequest { request_type: RequestType::Flush, sector: 42, ..Default::default() }; assert_eq!( request.as_bytes(), &[4, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0] ); }
Π¦Π΅ Π½Π΅ ΠΏΡΠ΄Ρ ΠΎΠ΄ΠΈΡΡ Π΄Π»Ρ MMIO (ΠΎΡΠΊΡΠ»ΡΠΊΠΈ Π²ΡΠ½ Π½Π΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡ Π½Π΅ΠΏΠΎΡΡΡΠΉΠ½Ρ ΡΠΈΡΠ°Π½Π½Ρ ΡΠ° Π·Π°ΠΏΠΈΡΠΈ), Π°Π»Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΌ Π΄Π»Ρ ΡΠΎΠ±ΠΎΡΠΈ Π·Ρ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ, ΡΠΏΡΠ»ΡΠ½ΠΈΠΌΠΈ Π· ΠΎΠ±Π»Π°Π΄Π½Π°Π½Π½ΡΠΌ, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄, Π· ΠΏΡΡΠΌΠΈΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ Π΄ΠΎ ΠΏΠ°ΠΌβΡΡΡ (DMA), Π°Π±ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΈΠΌΠΈ ΡΠ΅ΡΠ΅Π· Π·ΠΎΠ²Π½ΡΡΠ½ΡΠΉ ΡΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
FromBytes
ΠΌΠΎΠΆΠ½Π° ΡΠ΅Π°Π»ΡΠ·ΡΠ²Π°ΡΠΈ Π΄Π»Ρ ΡΠΈΠΏΡΠ², Π΄Π»Ρ ΡΠΊΠΈΡ Π΄ΡΠΉΡΠ½ΠΈΠΉ Π±ΡΠ΄Ρ-ΡΠΊΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½ Π±Π°ΠΉΡΡΠ², Ρ ΡΠΎΠΌΡ ΠΉΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½Π° Π±Π΅Π·ΠΏΠ΅ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ²ΠΎΡΠΈΡΠΈ Π· Π½Π΅Π½Π°Π΄ΡΠΉΠ½ΠΎΡ ΠΏΠΎΡΠ»ΡΠ΄ΠΎΠ²Π½ΠΎΡΡΡ Π±Π°ΠΉΡΡΠ².- Π‘ΠΏΡΠΎΠ±Π° ΠΎΡΡΠΈΠΌΠ°ΡΠΈ
FromBytes
Π΄Π»Ρ ΡΠΈΡ ΡΠΈΠΏΡΠ² Π½Π΅ Π²Π΄Π°ΡΡΡΡΡ, ΠΎΡΠΊΡΠ»ΡΠΊΠΈRequestType
Π½Π΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡ Π²ΡΡ ΠΌΠΎΠΆΠ»ΠΈΠ²Ρ Π·Π½Π°ΡΠ΅Π½Π½Ρ u32 ΡΠΊ Π΄ΠΈΡΠΊΡΠΈΠΌΡΠ½Π°Π½ΡΠΈ, ΡΠΎΠΌΡ Π½Π΅ Π²ΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π±Π°ΠΉΡΡΠ² Ρ Π΄ΡΠΉΡΠ½ΠΈΠΌΠΈ. zerocopy::byteorder
ΠΌΠ°Ρ ΡΠΈΠΏΠΈ Π΄Π»Ρ ΡΠΈΡΠ»ΠΎΠ²ΠΈΡ ΠΏΡΠΈΠΌΡΡΠΈΠ²ΡΠ² Π· ΡΡΠ°Ρ ΡΠ²Π°Π½Π½ΡΠΌ ΠΏΠΎΡΡΠ΄ΠΊΡ Π±Π°ΠΉΡΡΠ².- ΠΠ°ΠΏΡΡΡΡΡΡ ΠΏΡΠΈΠΊΠ»Π°Π΄ ΡΠ·
cargo run
Ρsrc/bare-metal/useful-crates/zerocopy-example/
. (ΠΡΠ½ Π½Π΅ ΠΏΡΠ°ΡΡΠ²Π°ΡΠΈΠΌΠ΅ Π½Π° Rust Playground ΡΠ΅ΡΠ΅Π· Π·Π°Π»Π΅ΠΆΠ½ΡΡΡΡ Π²ΡΠ΄ ΠΊΡΠ΅ΠΉΡΡ.)