cobalt_os/sys/storage/fs/
mod.rs

1use crate::debug;
2
3use self::dev_handle::{BlockDeviceIO, DeviceHandle};
4
5pub mod block_device;
6pub mod block;
7pub mod bitmap;
8pub mod dev_handle;
9pub mod superblock;
10pub mod file_table;
11
12use lazy_static::lazy_static;
13use spin::Mutex;
14
15pub type BlockAddr = u32;
16
17
18// == Partition Structure ==
19// Bootcode: 32MB / 65536 Blocks
20// Superblock: 2 Blocks, 65536..65538
21// Bitmap: 1024 Blocks, 65538..66562
22// Filetable: 1024 Blocks, 
23// Data: 
24
25pub const BLOCK_SIZE: usize = 512; 
26pub const DISK_SIZE: usize = 128 * 1024 * 1024;
27pub const KERNEL_SIZE: usize = (32 << 20) / BLOCK_SIZE; // 32MB For Boot Code
28pub const SUPER_BLOCK_ADDR: BlockAddr = KERNEL_SIZE as BlockAddr;
29pub const SUPER_BLOCK_SIZE: usize = 2;
30pub const BITMAP_ADDR: BlockAddr = SUPER_BLOCK_ADDR + SUPER_BLOCK_SIZE as u32; 
31pub const BITMAP_SIZE: usize = 1024;
32pub const FILETABLE_ADDR: BlockAddr = BITMAP_ADDR + BITMAP_SIZE as u32;
33pub const FILETABLE_SIZE: usize = 1024;
34pub const DATA_ADDR: BlockAddr = FILETABLE_ADDR + FILETABLE_SIZE as u32;
35pub const DATA_SIZE: usize = (DISK_SIZE - DATA_ADDR as usize) - FILETABLE_SIZE;
36
37lazy_static! {
38    pub static ref HANDLE: Mutex<Option<DeviceHandle>> = Mutex::new(None); 
39}
40
41pub fn mount_device(handle: DeviceHandle) {
42    let mut handle = handle;
43    debug!("Mounted Handle With Size Of {} Blocks", handle.sector_count());
44    assert!(handle.sector_count() <= DISK_SIZE as u32);
45    *HANDLE.lock() = Some(handle);
46    superblock::SuperBlock::mount();
47}
48
49pub fn is_mounted() -> bool {
50    return HANDLE.lock().is_some()
51}
52
53pub fn device<'a>() -> &'a Mutex<Option<DeviceHandle>> {
54    return &HANDLE
55}
56
57
58