打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
storage知识
/******************************************************************************/
1、磁盘参数结构
typedef struct
{
//设备名
char disk_name[32] ; //磁盘设备的文件名称
eDISK_TYPE disk_type ; //磁盘类型,分为:硬盘、U盘、SD卡
U8 linux_soft_raid_flag ; //磁盘是否是Linux 软raid建立的磁盘
//U8 disk_use_type ; //磁盘使用类型,分为:录像磁盘、未知用途磁盘
U8 gpt_flag ; //磁盘分区是否是GPT分区
//unsigned char        disk_mbr_sector_buf[ SECTOR_SIZE ] ; //磁盘的MBR扇区
int disk_is_9104_format_flag ;

//硬盘状态
U32 disk_socket_idx ; //硬盘的插入位置索引
U32 disk_status ; //磁盘设备的状态, eDISK_STATUS

//物理参数
U64 total_byte_size ; //磁盘的的字节数
U64 total_sectors ; //磁盘的总扇区数
U32 heads_of_disk ; //磁盘的磁头数
U32 sectors_per_cylinder ; //磁盘的每柱面扇区数
U32 cylinders_of_disk ; //磁盘的柱面数(磁道数)
U64 abs_gpt_table_sector_loc ; //gpt分区表开始扇区号

//分区参数
U32 partition_cnt ; //分区的个数,包括扩展分区和广告分区
U32 main_partition_cnt ; //主分区的个数
U32 win98_extend_partition_cnt ; //扩展分区的个数
U32 fat32_part_cnt ; //FAT32分区的个数
U32 logic_partition_id_idx ; //逻辑分区ID索引,索引在linux设备中的ID(/dev/sda*),从5开始
        #######(包含分区信息)##################################################################################################################
tDISK_PART_INFO part_info[ MAX_DISK_PART_NUM ] ; //各分区的参数
} tDISK_INFO ;




/******************************************************************************/
2、磁盘分区参数结构
typedef struct
{
//分区基本参数,在分区完成后有效
char        part_name[32] ; //磁盘分区设备的文件名称
U32 part_status ; //分区状态, ePART_STATUS
        U64 abs_part_start_sector_idx ; //分区起始扇区的绝对扇区号
       //对基础分区和逻辑分区,内容扇区为DBR扇区。
//这个扇区也被作为分区的起始扇区,也就是分区的内容不包括MBR扇区。
//在访问分区的设备文件时,读取的第一个扇区就是这个DBR扇区。
//对扩展分区,分区的起始扇区是第一个逻辑分区的MBR扇区
        U64 abs_part_mbr_sector_idx ; //分区的MBR扇区号,对主分区的扩展分区,扇区号为0
U32 dbr_reserved_sectors ; //分区DBR保留扇区数
U64 part_total_sector_cnt ; //分区从DBR扇区开始的总扇区数
//U64 dbr_part_total_sectors_cnt ;        //DBR扇区中的分区总扇区数
U8 part_type ; //分区的类型,分区表中的ucPartType字段。
U32 partition_id ; //分区ID,/dev/hda2的ID是2

//逻辑分区使用
U32 extend_part_idx ; //主分区中扩展分区的索引,从0开始
U32 fat32_part_idx ; //为磁盘的FAT32类型分区的第几个分区,从0开始
U32 part_use_type ; //分区使用类型:录像分区、广告分区、备份分区
 
        &&&&&&&&(MBR(DPT包含扩展分区表)、DBR表)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//FAT分区表,在DBR扇区写入后有效
//unsigned char part_mbr_sector_buf[ SECTOR_SIZE ] ; //分区的MBR扇区
U8 part_dbr_sector_buf[ SECTOR_SIZE ] ; //分区的DBR扇区
U8 cluster_sectors ; //簇扇区数,32G和以上的分区每簇扇区数为64个。
U32 total_cluster_count ; //总簇数 = 分区的FAT表后的数据区扇区数/簇扇区数+根目录族号
U32 fat32_sector_count ; //FAT表占用的扇区数=簇数*4/512
U64 abs_fat1_sector_idx ; //FAT表1的绝对扇区号
U64 abs_fat2_sector_idx ; //FAT表2的绝对扇区号

//根目录信息,在DBR扇区写入后有效
U32 root_dir_cluster_idx ; //根目录簇的编号号,一般设置为0x02
U32 root_dir_cluster_count ; //根目录簇的个数
U32 root_dir_sector_count ; //根目录的扇区数目
U64 abs_root_dir_sector_idx ; //根目录的绝对扇区号
U32 root_data_cluster_idx ; //根目录数据开始的族号
U64 abs_root_data_sector_idx ; //根目录数据开始的绝对扇区号

U32 idx_file_cluster_move_num ; //索引文件的族偏移地址,从保留族后的扇区开始
} tDISK_PART_INFO ;



/******************************************************************************/
3、MBR分区表(即扩展分区):分区的操作即是写DPR表
MBR:(1)0x000->0x1bd 引导代码  (2)0x1be + 16*4 四个扩展分区表 (3)0x1fe:0x55 , 0x1ff:0xaa
typedef struct
{
unsigned char active_id ; //0x80表示是活跃分区(启动分区),0x00表示不是活跃分区
unsigned char start_head ; //起始磁头号
unsigned char start_sector ; //起始扇区号
unsigned char start_cylinder ;    //起始柱面号
unsigned char part_type ; //分区类型  FAT32,UBIFS,等
unsigned char end_head ; //结束磁头号
unsigned char end_sector ; //结束扇区号
unsigned char end_cylinder ; //结束柱面号
unsigned int  part_start_sector_offset ;//分区开始扇区偏移,从本扇区算起。本扇区为0偏移。
//注意,在扩展分区表中,第2项分区的此字段的含义是下一逻辑分区的偏移,从扩展分区的起始扇区开始。
unsigned int  part_total_sector_cnt ; //分区总扇区数
} __attribute__((packed)) tMBR_ITEM ;



/******************************************************************************/
/// DBR数据表
4、FAT32 分区启动扇区数据结构:格式化的操作即是写FAT32表
typedef struct
{
unsigned char boot_jump[3] ; //起始跳转指令
unsigned char system_id[8] ; //取值“ mkdosfs ”
unsigned short sector_size ; //扇区字节数,取值0x0200
unsigned char cluster_sectors ; //1/2/4/8/16/32/64/128,和分区大小有关
unsigned short reserved_sectors ; //保留扇区数,第一个FAT表之前的扇区数,包括DBR,取值0x0020
unsigned char fat_num ; //FAT表数目,取值0x02
unsigned short dir_entries_fat16 ; //不使用,取值0x0000
unsigned short sectors_fat16 ; //不使用,取值0x0000
unsigned char media_type ; //0xF8,表示硬盘
unsigned short fat_sectors_fat16 ; //不使用,取值0x0000
unsigned short sectors ; //每磁道扇区数,取物理参数的每磁道扇区数
unsigned short heads ; //每磁道磁头数,取0xFF
unsigned int hidden_sectors ; //引导扇区之前的扇区数,取值0
unsigned int total_sectors_fat32 ; //分区从DBR开始的总扇区数
unsigned int fat_sectors_fat32 ; //FAT表占用扇区数,随分区大小而变化
unsigned short extend_flags_fat32 ; //扩展标志,设置为0x00
unsigned short version_fat32 ; //FAT32版本,设置为0x00
unsigned int root_dir_cluster_idx_fat32 ; //根目录族号,一般设置为0x02
unsigned short info_sector_fat32 ; //FSI扇区号,一般设置为1
unsigned short backup_sector_fat32 ; //备份扇区号,一般设置为6
unsigned char reserved2[12] ; //保留,设置为0x00

//msdos_volume_info vi;
unsigned char  drive_number_fat32 ; //设置为0x80
unsigned char  unused_fat32 ; //保留,设置为0x00
unsigned char  ext_boot_sign_fat32 ; //扩展引导标志,设置为0x29
unsigned char  volume_id_fat32[4] ; //随机序号,不同磁盘不同,可以按序号设置
unsigned char  volume_label_fat32[11] ; //设置为0x00,标卷号,现在使用根目录的一个特殊文件来表示标卷号。
unsigned char  fs_type_fat32[8] ; //取值“FAT32”

unsigned char  boot_code[ BOOTCODE_FAT32_SIZE ] ; //启动代码
unsigned short usboot_sign ; //0xAA55
 }__attribute__((packed)) tDOS_BOOT_RECORD ;






由于MBR分区表不支持大于2.2T的分区


GPT分区表的特点?

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。
但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,
之后才是GPT头。?
跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。
传统MBR信息存储于LBA?0,GPT头存储于LBA?1,接下来才是分区表本身。64位Windows操作系统使用16,384字节(或32扇区)
作为GPT分区表,接下来的LBA?34是硬盘上第一个分区的开始。
/*************(GPT硬盘,上为MBR硬盘)*****************************************************************/

5、GPT头,位于1号扇区
typedef struct
{
char gpt_sign[8] ; //0x00---签名("EFI PART", 45 46 49 20 50 41 52 54)
U32 version ; //0x08---版本(在1.0版中,值是 00 00 01 00)
U32 header_size ; //0x0C---分区表头部大小,字节, 通常是92字节,即 5C 00 00 00
U32 header_crc32 ; //0x10---分区表头(第0-91字节)的CRC32校验,在计算时, 把这个字段作为0处理, 需要计算出分区串行的CRC32校验后再计算本字段
U32 reserved ; //0x14---保留字段, 必须全为零
U64 curr_gpt_sector ; //0x18---当前LBA, 这是GPT头部扇区的位置
U64 header_backup_sector ; //0x20---备份LBA, 这是另一个备份分区头部的位置
U64 area_start_sector ; //0x28---第一个可用于分区的LBA, 主分区表最后一个分区+1
U64 area_end_sector ; //0x30---最后一个可用于分区的LBA, 备份分区表的第一个LBA-1
U8 guid[16] ; //0x38---硬盘的GUID(在类UNIX系统中也叫UUID)
U64 part_table_start_sector ; //0x48---分区表项的起始LBA, 在主分区表中是2
U32 part_table_cnt ; //0x50---分区表的数目
U32 part_table_byte_size ; //0x54---一个分区表项的大小, 通常是128Bytes
U32 part_table_crc32 ; //0x58---分区串行的CRC校验
U8 reserved2[ 512 - 92 ] ;     //保留字段, 对于512字节LBA的硬盘即是420个字节
}tGPT_MAIN_TABLE ;




/******************************************************************************/
6、GPT分区表,位于2号扇区
typedef struct
{
U8 part_type_guid[16] ;        ///<分区类型UID
U8 part_unique_guid[16] ;      ///<分区表示唯一ID
U64 first_part_sector ;         ///<起始LBA
U64 last_part_sector ;          ///<终止LBA
U64 part_flag ;                 ///<分区属性, 如60表示只读
U8 part_name[72] ;             ///<分区名
}tGPT_PART_TABLE ;



/******************************************************************************/
7、分区类型
#define EXTENDED         0x05
#define WIN98_EXTENDED   0x0F
#define WIN95_FAT32 0x0B
#define Win95_FAT32_LBA 0x0C
#define LINUX_EXTENDED   0x85
#define LINUX_SWAP   0x82
#define LINUX_PART   0x83
#define LINUX_LVM   0x8E
#define PART_TYPE_UNKNOWN 0x00

#define FAT32_RESERVED_SECTOR 0x20

#define IS_FAT32(i)    (((i) == WIN95_FAT32) || ((i) == Win95_FAT32_LBA) || ((i) == LINUX_PART))
#define IS_EXTENDED(i) (((i) == EXTENDED) || ((i) == WIN98_EXTENDED) || ((i) == LINUX_EXTENDED))


/***************************************************************************************************************************************************************************************************************************/
8.引导代码


//变量
U8 mbr_boot_code[ 0xDA ] =
{
0xFA, 0x33, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C, 0x8B, 0xF4, 0x50, 0x07, 0x50, 0x1F, 0xFB, 0xFC,     //.3........P.P...
0xBF, 0x00, 0x06, 0xB9, 0x00, 0x01, 0xF2, 0xA5, 0xEA, 0x1D, 0x06, 0x00, 0x00, 0xBE, 0xBE, 0x07,     //................
0xB3, 0x04, 0x80, 0x3C, 0x80, 0x74, 0x0E, 0x80, 0x3C, 0x00, 0x75, 0x1C, 0x83, 0xC6, 0x10, 0xFE,     //.....t....u.....
0xCB, 0x75, 0xEF, 0xCD, 0x18, 0x8B, 0x14, 0x8B, 0x4C, 0x02, 0x8B, 0xEE, 0x83, 0xC6, 0x10, 0xFE,     //.u......L.......
0xCB, 0x74, 0x1A, 0x80, 0x3C, 0x00, 0x74, 0xF4, 0xBE, 0x8B, 0x06, 0xAC, 0x3C, 0x00, 0x74, 0x0B,     //.t....t.......t.
0x56, 0xBB, 0x07, 0x00, 0xB4, 0x0E, 0xCD, 0x10, 0x5E, 0xEB, 0xF0, 0xEB, 0xFE, 0xBF, 0x05, 0x00,     //V...............
0xBB, 0x00, 0x7C, 0xB8, 0x01, 0x02, 0x57, 0xCD, 0x13, 0x5F, 0x73, 0x0C, 0x33, 0xC0, 0xCD, 0x13,     //......W...s.3...
0x4F, 0x75, 0xED, 0xBE, 0xA3, 0x06, 0xEB, 0xD3, 0xBE, 0xC2, 0x06, 0xBF, 0xFE, 0x7D, 0x81, 0x3D,     //Ou..............
0x55, 0xAA, 0x75, 0xC7, 0x8B, 0xF5, 0xEA, 0x00, 0x7C, 0x00, 0x00, 0x49, 0x6E, 0x76, 0x61, 0x6C,     //U.u........Inval
0x69, 0x64, 0x20, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x54, 0x61, 0x62,     //id.Partition.Tab
0x6C, 0x65, 0x00, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x69, 0x6E, 0x67,     //le.Error.Loading
0x20, 0x4F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,     //.Operating.Syste
0x6D, 0x00, 0x4D, 0x69, 0x73, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x4F, 0x70, 0x65, 0x72, 0x61, 0x74,     //m.Missing.Operat
0x69, 0x6E, 0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D,                                         //ing.System......
} ;

U8 dbr_boot_jump_code[ 3 ] = { 0xEB, 0x58, 0x90, } ;

U8 dbr_boot_start_code[ 0x81 ] =
{
                                                           0x0E, 0x1F, 0xBE, 0x5B, 0x7C, 0xAC,     //..FAT32.........
0x22, 0xC0, 0x74, 0x0B, 0x56, 0xB4, 0x0E, 0xBB, 0x07, 0x00, 0xCD, 0x10, 0x5E, 0xEB, 0xF0, 0x32,     //..t.V..........2
0xE4, 0xCD, 0x16, 0xCD, 0x19, 0xEB, 0xFE, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6E,     //.......This.is.n
0x6F, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x64, 0x69,     //ot.a.bootable.di
0x73, 0x6B, 0x2E, 0x20, 0x20, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x73, 0x65,     //sk...Please.inse
0x72, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x66, 0x6C,     //rt.a.bootable.fl
0x6F, 0x70, 0x70, 0x79, 0x20, 0x61, 0x6E, 0x64, 0x0D, 0x0A, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20,     //oppy.and..press.
0x61, 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x72, 0x79, 0x20, 0x61,     //any.key.to.try.a
0x67, 0x61, 0x69, 0x6E, 0x20, 0x2E, 0x2E, 0x2E, 0x20, 0x0D, 0x0A,                                   //gain............
} ;

///< 以下GUID变量未使用
U8 Linux_filesystem_data_GUID_1[16] =
{
0xA2,0xA0,0xD0,0xEB,0xE5,0xB9,0x33,0x44,0x87,0xC0,0x68,0xB6,0xB7,0x26,0x99,0xC7,
} ;

U8 Linux_filesystem_data_GUID_2[16] =
{
0xAF,0x3D,0xC6,0x0F,0x83,0x84,0x72,0x47,0x8E,0x79,0x3D,0x69,0xD8,0x47,0x7D,0xE4,
} ;


U8 Linux_RAID_partition_GUID[16] =
{
0x0F,0x88,0x9D,0xA1,0xFC,0x05,0x3B,0x4D,0xA0,0x06,0x74,0x3F,0x0F,0x84,0x91,0x1E,
} ;

U8 Linux_Swap_partition_GUID[16] =
{
0x6D,0xFD,0x57,0x06,0xAB,0xA4,0xC4,0x43,0x84,0xE5,0x09,0x33,0xC8,0x4B,0x4F,0x4F,
} ;

U8 Linux_LVM_partition_GUID[16] =
{
0x79,0xD3,0xD6,0xE6,0x07,0xF5,0xC2,0x44,0xA2,0x3C,0x23,0x8F,0x2A,0x3D,0xF9,0x28,
} ;

U8 Linux_Reserved_GUID[16] =
{
0x39,0x33,0xA6,0x8D,0x07,0x00,0xC0,0x60,0xC4,0x36,0x08,0x3A,0xC8,0x23,0x09,0x08,
} ;


































本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
硬盘数据恢复
U盘打不开,总是显示“驱动器G中的磁盘未被格式化”
UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?
分区助手
磁盘分区分析
MBR+BIOS与GPT+UEFI两种模式区别详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服