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 // struct block_device_request_queue *bd_queue; // 请求队列 22 // struct vfs_superblock_t *bd_superblock; // 执行超级块的指针 23 } 24 25 /// @brief: 分区信息 - 成员函数 26 impl Partition { 27 /// @brief: 为 disk new 一个分区结构体 28 pub fn new( 29 start_sector: SectorT, 30 lba_start: u64, 31 sectors_num: u64, 32 disk: Weak<dyn BlockDevice>, 33 partno: u16, 34 ) -> Arc<Self> { 35 return Arc::new(Partition { 36 start_sector, 37 lba_start, 38 sectors_num, 39 disk, 40 partno, 41 }); 42 } 43 44 /// @brief 获取当前分区所属的磁盘的Arc指针 45 #[inline] 46 pub fn disk(&self) -> Arc<dyn BlockDevice> { 47 return self.disk.upgrade().unwrap(); 48 } 49 } 50