zerocopy
ΠΡΠ΅ΠΉΡ zerocopy (ΠΈΠ· Fuchsia) ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠ΅ΠΉΡΡ ΠΈ ΠΌΠ°ΠΊΡΠΎΡΡ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΠΌΠΈ Π±Π°ΠΉΡΠΎΠ² ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
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/. (Π Playground ΠΎΠ½ Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΠΈΠ·-Π·Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΡΠ΅ΠΉΡΠ°.)