zerocopy
Fuchsiaνμ΄ λ§λ zerocopy
ν¬λ μ΄νΈλ λ°μ΄νΈ μνμ€λ₯Ό λ€λ₯Έ νμ
μΌλ‘ μμ νκ² λ³ννκΈ° μν νΈλ μ λ° λ§€ν¬λ‘λ₯Ό μ 곡ν©λλ€.
use zerocopy::AsBytes; #[repr(u32)] #[derive(AsBytes, Debug, Default)] enum RequestType { #[default] In = 0, Out = 1, Flush = 4, } #[repr(C)] #[derive(AsBytes, Debug, Default)] 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] ); }
μ΄ ν¬λ μ΄νΈλ νλ°μ±(volatile) μ½κΈ° λ° μ°κΈ°λ₯Ό μ¬μ©νμ§ μμΌλ―λ‘ MMIOμ μ ν©νμ§ μμ§λ§, νλμ¨μ΄μ 곡μ λκ±°λ(μ: DMAμμ) μΈμ₯ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ μ‘λλ ꡬ쑰체λ₯Ό λ€λ£¨λ λ°μλ μ μ©ν μ μμ΅λλ€.
- μ΄λ€ νμ
μ΄ κ°λ₯ν λͺ¨λ λ°μ΄νΈ ν¨ν΄λ€μ λν΄ μ¬λ°λ₯Έ κ°μ κ°μ§ λμλ§ , κ·Έ νμ
μ΄
FromBytes
λ₯Ό ꡬνν μ μμ΅λλ€. κ·Έλ κ² ν΄μ μ λ’°ν μ μλ λ°μ΄νΈ μνμ€λ₯Ό μμ νκ² ν΄λΉ νμ μΌλ‘ λ³νν μ μμ΅λλ€. - μ μ½λμμ μ μν νμ
μ λν΄
FromBytes
λ₯Ό ꡬννλ €κ³ νλ©΄ μλ¬κ° λ°μν©λλ€.RequestType
μ κ°λ₯ν λͺ¨λ u32 κ°μ μλ³μλ‘ λ°μλ€μ΄μ§ μκΈ° λλ¬Έμ λλ€. μ¦ λͺ¨λ λ°μ΄νΈ ν¨ν΄μ΄ μ ν¨νRequestType
κ°μ μλλλ€. zerocopy::byteorder
μλ λ°μ΄νΈ μ€λμ λ°λ₯Έ μλ‘ λ€λ₯Έ νν λ°©μμ μ§μνλ μ«μ νμ μ μ 곡ν©λλ€.src/bare-metal/useful-crates/zerocopy-example/
μμcargo run
μ μ¬μ©νμ¬ μμλ₯Ό μ€νν©λλ€(μ’ μμ± λ¬Έμ λ‘ μΈν΄ νλ μ΄κ·ΈλΌμ΄λμμλ μ€νλμ§ μμ΅λλ€).