Keyboard shortcuts

Press ← or β†’ to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 ΠΎΠ½ Π½Π΅ запустится ΠΈΠ·-Π·Π° зависимости ΠΎΡ‚ ΠΊΡ€Π΅ΠΉΡ‚Π°.)