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 Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π»Π΅ΠΆΠ½Ρ–ΡΡ‚ΡŒ Π²Ρ–Π΄ ΠΊΡ€Π΅ΠΉΡ‚Ρƒ.)