1 /**
2  * @file MBR.h
3  * @author fslongjin (longjin@RinGoTek.cn)
4  * @brief MBR分区表
5  * @version 0.1
6  * @date 2022-04-19
7  *
8  * @copyright Copyright (c) 2022
9  *
10  */
11 #pragma once
12 #include <common/glib.h>
13 #include <common/blk_types.h>
14 
15 #define MBR_MAX_AHCI_CTRL_NUM 4  // 系统支持的最大的ahci控制器数量
16 #define MBR_MAX_AHCI_PORT_NUM 32 // 系统支持的每个ahci控制器对应的MBR磁盘数量(对应ahci磁盘号)
17 
18 /**
19  * @brief MBR硬盘分区表项的结构
20  *
21  */
22 struct MBR_disk_partition_table_entry_t
23 {
24     uint8_t flags;                // 引导标志符,标记此分区为活动分区
25     uint8_t starting_head;        // 起始磁头号
26     uint16_t starting_sector : 6, // 起始扇区号
27         starting_cylinder : 10;   // 起始柱面号
28     uint8_t type;                 // 分区类型ID
29     uint8_t ending_head;          // 结束磁头号
30 
31     uint16_t ending_sector : 6, // 结束扇区号
32         ending_cylinder : 10;   // 结束柱面号
33 
34     uint32_t starting_LBA;  // 起始逻辑扇区
35     uint32_t total_sectors; // 分区占用的磁盘扇区数
36 
37 } __attribute__((packed));
38 
39 /**
40  * @brief MBR磁盘分区表结构体
41  *
42  */
43 struct MBR_disk_partition_table_t
44 {
45     uint8_t reserved[446];
46     struct MBR_disk_partition_table_entry_t DPTE[4]; // 磁盘分区表项
47     uint16_t BS_TrailSig;
48 } __attribute__((packed));
49 
50 extern struct MBR_disk_partition_table_t MBR_partition_tables[MBR_MAX_AHCI_CTRL_NUM][MBR_MAX_AHCI_PORT_NUM]; // 导出全局的MBR磁盘分区表
51 
52 /**
53  * @brief 读取磁盘的分区表
54  *
55  * @param ahci_ctrl_num ahci控制器编号
56  * @param ahci_port_num ahci端口编号
57  * @param buf 输出缓冲区(512字节)
58  */
59 int MBR_read_partition_table(struct blk_gendisk* gd, void *buf);