1 #![allow(dead_code)] 2 use alloc::sync::{Arc, Weak}; 3 4 use super::block_device::BlockDevice; 5 6 pub type SectorT = u64; 7 8 pub const BLK_TYPE_AHCI: u64 = 0; 9 pub const DISK_NAME_LEN: usize = 32; // 磁盘名称的最大长度 10 pub const BLK_GF_AHCI: u16 = 1 << 0; // 定义blk_gendisk中的标志位 11 12 /// @brief: 磁盘的分区信息 - (保留了c版本的数据信息) 13 #[derive(Debug)] 14 pub struct Partition { 15 pub start_sector: SectorT, // 该分区的起始扇区 16 pub lba_start: u64, // 起始LBA号 17 pub sectors_num: u64, // 该分区的扇区数 18 disk: Weak<dyn BlockDevice>, // 当前分区所属的磁盘 19 pub partno: u16, // 在磁盘上的分区号 20 } 21 22 /// @brief: 分区信息 - 成员函数 23 impl Partition { 24 /// @brief: 为 disk new 一个分区结构体 25 pub fn new( 26 start_sector: SectorT, 27 lba_start: u64, 28 sectors_num: u64, 29 disk: Weak<dyn BlockDevice>, 30 partno: u16, 31 ) -> Arc<Self> { 32 return Arc::new(Partition { 33 start_sector, 34 lba_start, 35 sectors_num, 36 disk, 37 partno, 38 }); 39 } 40 41 /// @brief 获取当前分区所属的磁盘的Arc指针 42 #[inline] 43 pub fn disk(&self) -> Arc<dyn BlockDevice> { 44 return self.disk.upgrade().unwrap(); 45 } 46 } 47