xref: /DragonOS/kernel/src/filesystem/mbr.rs (revision b5b571e02693d91eb6918d3b7561e088c3e7ee81)
1004e86ffSlogin #![allow(dead_code)]
2004e86ffSlogin use core::default::Default;
3004e86ffSlogin 
4004e86ffSlogin /// @brief MBR硬盘分区表项的结构
5004e86ffSlogin #[repr(packed)]
6*b5b571e0SLoGin #[derive(Debug, Clone, Copy, Default)]
7004e86ffSlogin pub struct MbrDiskPartitionTableEntry {
8004e86ffSlogin     pub flags: u8,                     // 引导标志符,标记此分区为活动分区
9004e86ffSlogin     pub starting_head: u8,             // 起始磁头号
10004e86ffSlogin     pub starting_sector_cylinder: u16, // sector : 低6, cylinder : 高10;   起始扇区号 + 起始柱面号
11004e86ffSlogin     pub part_type: u8,                 // 分区类型ID
12004e86ffSlogin     pub ending_head: u8,               // 结束磁头号
13004e86ffSlogin     pub ending_sector_cylingder: u16, // ending_sector : 低6, ending_cylinder : 高10;  结束扇区号 + 结束柱面号
14004e86ffSlogin     pub starting_lba: u32,            // 起始逻辑扇区
15004e86ffSlogin     pub total_sectors: u32,           // 分区占用的磁盘扇区数
16004e86ffSlogin }
17004e86ffSlogin 
18004e86ffSlogin impl MbrDiskPartitionTableEntry {
19004e86ffSlogin     pub fn starting_sector(&self) -> u16 {
20004e86ffSlogin         return self.starting_sector_cylinder & ((1 << 6) - 1) as u16;
21004e86ffSlogin     }
22004e86ffSlogin     pub fn starting_cylinder(&self) -> u16 {
23004e86ffSlogin         return (self.starting_sector_cylinder >> 6) & ((1 << 10) - 1) as u16;
24004e86ffSlogin     }
25004e86ffSlogin     pub fn ending_sector(&self) -> u16 {
26004e86ffSlogin         return self.ending_sector_cylingder & ((1 << 6) - 1) as u16;
27004e86ffSlogin     }
28004e86ffSlogin     pub fn ending_cylinder(&self) -> u16 {
29004e86ffSlogin         return (self.ending_sector_cylingder >> 6) & ((1 << 10) - 1) as u16;
30004e86ffSlogin     }
31004e86ffSlogin }
32004e86ffSlogin 
33004e86ffSlogin /// @brief MBR磁盘分区表结构体
34004e86ffSlogin #[repr(packed)]
35004e86ffSlogin #[derive(Debug, Clone, Copy)]
36004e86ffSlogin pub struct MbrDiskPartionTable {
37004e86ffSlogin     pub reserved: [u8; 446],
38004e86ffSlogin     pub dpte: [MbrDiskPartitionTableEntry; 4], // 磁盘分区表项
39004e86ffSlogin     pub bs_trailsig: u16,
40004e86ffSlogin }
41004e86ffSlogin 
42004e86ffSlogin impl Default for MbrDiskPartionTable {
43004e86ffSlogin     fn default() -> Self {
44004e86ffSlogin         MbrDiskPartionTable {
45004e86ffSlogin             reserved: [0; 446],
46004e86ffSlogin             dpte: [Default::default(); 4],
47004e86ffSlogin             bs_trailsig: Default::default(),
48004e86ffSlogin         }
49004e86ffSlogin     }
50004e86ffSlogin }
51