use std::cell::RefCell; use crate::block_device::{BLOCK_SIZE, BlockDevice}; #[repr(C)] pub struct MemoryDisk { /// Emulating a block device with a segment of RAM, /// which is 64MiB == 4KiB per block * 16384 blocks pub arena: RefCell>, } impl MemoryDisk { pub fn new() -> Self { Self { arena: RefCell::new(vec![0u8; BLOCK_SIZE * 16384]), } } } impl BlockDevice for MemoryDisk { fn read(&self, block_id: usize, buffer: &mut [u8]) { let block_front = block_id * BLOCK_SIZE; let block_back = block_front + BLOCK_SIZE; let arena = self.arena.borrow(); buffer.copy_from_slice(&arena[block_front..block_back]); } fn write(&self, block_id: usize, buffer: &[u8]) { let block_front = block_id * BLOCK_SIZE; let block_back = block_front + BLOCK_SIZE; let mut arena = self.arena.borrow_mut(); arena[block_front..block_back].copy_from_slice(buffer); } }