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
์ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์คํํฉ๋๋ค(์ข ์์ฑ ๋ฌธ์ ๋ก ์ธํด ํ๋ ์ด๊ทธ๋ผ์ด๋์์๋ ์คํ๋์ง ์์ต๋๋ค).