об автореБишенг, парень, который не выглядит серьезным, но у него много технических интересов, в настоящее время является старшим инженером Python в Ele.me.У него был «неоднозначный» опыт работы с файловой системой. Говорят, что он очень хорошо пишет на C++, но насколько хорошо — неизвестно.
введение
MBR и GPT — это таблицы разделов жесткого диска, а после таблицы разделов жесткого диска — файловые системы, которые мы используем каждый день, такие как NTFS, FAT32, EXT и т. д. Хотя MBR теперь является необычной таблицей разделов жесткого диска, GPT добавила MBR в заголовок структуры GPT, чтобы быть совместимой со старой таблицей разделов жесткого диска. На следующих страницах автор сначала кратко представляет MBR, а затем представляет структуру GPT.
Часть кода структуры размещена в этой статье. Эти структуры извлекаются и изменены автором из шаблона 010Ditor. Эти структуры удобны для программирования. До тех пор, пока указатель буфера данных вынужден преобразовать в указатель структуры, указатель структуры может использоваться для извлечения данных, устраняя проблемы с использованием смещения кода для чтения данных. (Попробуйте использовать выравнивание 1-байтовой структуры, чтобы избежать ненужных неприятностей)
1.MBR
1.1 Состав МБР
В первом секторе жесткого диска хранится таблица MBR, которая состоит из 4 частей, а именно: основной загрузочной записи, области данных, таблицы разделов (включая 4 записи разделов) и метки конца.
Расположение смещения и профили этих 4 частей показаны в таблице ниже:
- Основная загрузочная запись — это загрузочная программа и область данных таблицы разделов жесткого диска, занимающая в общей сложности 446 байт.БИОС считывает и выполняет этот код.Если система повреждена, данные на жестком диске не могут быть прочитаны, и система не может быть запущена.
- Элементы разделов будут подробно описаны позже
- Флаг конца — это конечный бит MBR, если есть ошибка, будет считана ошибка.
Ниже приведен код структуры на C++, bootinst — это основная загрузочная программа и область данных, partitions — 4 элемента раздела, а тип mbr_table будет подробно описан ниже, этот тип занимает 16 байт, а подпись является признаком окончания.
typedef struct {
char bootinst[446]; /* space to hold actual boot code */
mbr_table partitions[4];
unsigned short signature;/* set to 0xAA55 to indicate PC MBR format */
} mbr_head;
Скриншот данных жесткого диска
1.2 Структура записи раздела в MBR
Следующая таблица представляет собой объяснение 16 байтов независимой записи раздела в MBR.
байт памяти | содержание и смысл |
---|---|
1-й байт | Знак загрузки. Значение 80H указывает на активный раздел, а значение 00H указывает на неактивный раздел. Байты 2, 3 и 4 Начальный номер головки, номер сектора и номер цилиндра этого раздела. Среди них: номер головки - 2-й байт, номер сектора - младшие 6 бит 3-го байта, номер цилиндра - 2 старших бита 3-го байта + 8 бит 4-го байта. |
5-й байт | Символ типа раздела. 00H — раздел не используется (то есть не указан); 06H — базовый раздел FAT16; 0BH — базовый раздел FAT32; 05H — расширенный раздел; 07H — раздел NTFS; 0FH — (режим LBA) расширенный. раздел (раздел 83H для Linux и т. д.). |
6-й, 7-й, 8-й байты | Конечный номер головки, номер сектора и номер цилиндра этого раздела. Среди них: номер головки - 6-й байт, номер сектора - младшие 6 бит 7-го байта, номер цилиндра - 2 старших бита 7-го байта + 8-й байт. |
9-й, 10-й, 11-й, 12-й байты | Первый сектор этого раздела. |
13-й, 14-й, 15-й, 16-й байты | Общее количество секторов в этом разделе. |
Арабские числа в следующей структуре относятся к битам, а беззнаковые короткие занимают 2 байта, всего 16 бит.
-
unsigned short begsect : 6 означает первые 6 бит
-
unsigned short begcyl : 10 означает следующие 10 бит
Примечание корректора
Это включает в себя концепцию битового поля C / C ++. В структуре в форме «тип [имя] : битовый размер» (имя необязательно, битовое поле без имени называется безымянным битовым полем), чтобы сообщить компилятору использовать только битовое поле.Размер битов данных хранения члена. Когда два соседних члена структуры оба являются битовыми полями, тип один и тот же, а длина типа (число битов) больше, чем сумма двух битовых полей, большинство компиляторов будут сжимать хранилище. Например, begsect и begcyl в следующей структуре являются битовыми полями, типом является unsigned short, а сумма битовых битов двух битовых полей меньше, чем длина в битах типа unsigned short, поэтому два бита поля будут сжаты в единицу. Хранится в пространстве хранения беззнакового короткого типа, всего они занимают 2 байта.
typedef struct {
unsigned char bootid; /* bootable? 0=no, 128=yes */
unsigned char beghead ; /* beginning head number */
unsigned short begsect : 6; /* beginning sector number */
unsigned short begcyl : 10; /* 10 bit nmbr */
unsigned char systid; /* Operating System type indicator code */
unsigned char endhead ; /* ending head number */
unsigned short endsect : 6; /* ending sector number */
unsigned short endcyl : 10; /* also a 10 bit nmbr */
unsigned int relsect; /* first sector relative to start of disk */
unsigned int numsect; /* number of sectors in partition */
} mbr_table;
Скриншот данных жесткого диска
1.3 Ограничения MBR
MBR хранит данные на 4 разделах, эти разделы называются основными разделами. Раздел использует метод маркировки «цилиндр/головка/сектор», то есть метод маркировки CHS. В предыдущей структуре beghead, begsect и begcyl представляют головку, сектор и цилиндр в начале раздела соответственно, а endhead, endect и endcyl представляют головку, сектор и цилиндр в конце раздела. соответственно. Размер каждого сектора 512Б, общее количество секторов =(,Сейчас), поэтому он может описать не более 8G () области диска.
Примечание корректора
Имея опыт использования раздела MBR, студенты могут задаться вопросом, как можно выразить только 8G?При фактической установке системного раздела, очевидно, простое разделение на несколько сотен разделов G ах. Это связано с тем, что при использовании современных дисков BIOS, чем в режиме 8G LBA, для некоторого превышения обычно устанавливают значение CHS 0xFEFFFF и игнорируют его, напрямую используя относительное значение Offset 0x08-0x0c на 4 байта, а затем внутреннее преобразование. Однако при использовании LBA relsect (32 бита) описывает номер начального сектора, relsect + numsect указывает номер конечного сектора, поскольку 32-битная адресация приводит к тому, что весь размер жесткого диска не может превышать 2 ТБ данных ().
Помимо этой проблемы с 2 ТБ, у MBR есть и другие трудности. Основная сложность — ограничение в 4 первичных раздела. Возможный способ обойти это ограничение — выделить основной раздел в качестве заполнителя (называемого расширенным разделом) для любого количества дополнительных разделов (называемых логическими разделами).
MBR также имеет проблемы с целостностью данных. Это единая структура данных, которая уязвима для неправильного использования и отказа диска. Кроме того, поскольку логические разделы определены в структуре связанного списка, при повреждении одного логического раздела доступ к остальным логическим разделам блокируется.
2.GPT
2.1 Состав ТШП
Давайте сначала вставим общую структуру GPT, чтобы у всех сложилось общее впечатление.
Структурная схема GPT
Данные структуры GPT
2.2 Защита MBR
В заголовке GPT есть защищенная MBR (см. LBA 0: Protective MBR на структурной схеме GPT).Защищенные данные MBR выглядят следующим образом.
Только первая запись раздела защитной MBR имеет значение, а остальные записи раздела пусты.
-
PartitionType (тип раздела) первого элемента раздела, то есть systid (тип раздела) в предыдущей статье — 0xEE.
-
Значение StartSectors (начальный сектор) равно 2, что означает LBA1, который является расположением заголовка структуры GPT. На жестком диске менее 2T SectorsInPartition (общее количество секторов) равно numsect (общему количеству секторов) в предыдущей статье, а значение соответствует размеру всего диска.Поскольку только 4 байта могут представлять только 2 ТБ, значение больше 2 ТБ будет зафиксировано как FFFFFFFFh
Первая запись раздела защищенной MBR записывает весь GPT как данные записи раздела, и ее функция состоит в том, чтобы предотвратить попытки форматирования дисковыми инструментами, которые не могут распознать разделы GPT, поэтому этот сектор называется «защищенной MBR». На самом деле EFI вообще не использует эту таблицу разделов.
2.3 Раздел EFI
Часть EFI можно разделить на 4 области: информационная область EFI (заголовок GPT), таблица разделов, раздел GPT, область резервного копирования.
-
Область информационной области EFI (заголовок GPT): он начинается с LBA1 диска, и обычно занимает только этот единственный сектор. Его роль состоит в том, чтобы определить местоположение и размер таблицы раздела. Заголовок GPT также содержит контрольные суммы для таблицы заголовка и раздела, поэтому ошибки могут быть пойманы во времени
-
Таблица разделов: Область таблицы разделов содержит записи таблицы разделов. Эта область определяется заголовком GPT и обычно занимает на диске сектора LBA2–LBA33. Каждая запись раздела в таблице разделов состоит из начального адреса, конечного адреса, значения типа, имени, флага атрибута и значения GUID. После создания таблицы разделов 128-битный GUID уникален для системы.
-
Раздел GPT: самая большая область, состоящая из секторов, выделенных для раздела. Начальный и конечный адреса этой области определяются заголовком GPT.
-
Область резервного копирования: область резервного копирования расположена в конце диска и содержит резервную копию заголовка GPT и таблицы разделов. Он занимает 33 сектора в конце данных жесткого диска. Последний сектор используется для резервного копирования информационной области EFI (заголовок GPT) сектора LBA1, а оставшиеся 32 сектора используются для резервного копирования таблицы разделов секторов LBA2–LBA33.
Информационная область EFI (заголовок GPT), таблица разделов и область резервного копирования обсуждаются отдельно ниже.
2.3.1 Структура данных информационной области EFI
Относительное байтовое смещение (Hex) | Количество байтов | Описание [Целые числа представлены с прямым порядком байтов] |
---|---|---|
00~07 | 8 | Подпись заголовка GPT «45 46 49 20 50 41 52 54» (код ASCII — «EFI PART») |
08~0В | 4 | Номер версии, на данный момент версия 1.0, его значение "00 00 01 00" |
0C~0F | 4 | Размер заголовка GPT (количество байтов) обычно является «5C 00 00 00» (0x5c), то есть 92 байта. |
10~13 | 4 | Контрольная сумма CRC заголовка GPT (само это поле считается нулевым значением при расчете) |
14~17 | 4 | Зарезервировано, должно быть "00 00 00 00" |
18~1F | 8 | Номер начального сектора информационной области EFI (заголовок GPT) обычно равен «01 00 00 00 00 00 00 00», то есть LBA1. |
20 ~ 27. | 8 | Номер сектора резервного хранилища информационной области EFI (заголовок GPT), то есть номер конечного сектора области EFI. Обычно это последний сектор всего диска. |
28~2F | 8 | Номер начального сектора области раздела GPT, обычно «22 00 00 00 00 00 00 00» (0x22), то есть LBA34. |
30~37 | 8 | Конечный номер сектора области раздела GPT, обычно это 34-й сектор снизу. |
38~47 | 16 | Гидик диска (глобально уникальный идентификатор, синонимичный с UUID) |
48~4F | 8 | Номер начального сектора таблицы разделов, обычно «02 00 00 00 00 00 00 00» (0x02), что соответствует LBA2. |
50~53 | 4 | Общее количество записей в таблице разделов, обычно ограниченное «80 00 00 00» (0x80), что равно 128. |
54~57 | 4 | Количество байтов, занимаемых каждой записью в таблице разделов, обычно ограничено значением «80 00 00 00» (0x80), что составляет 128 байт. |
58~5Б | 4 | Контрольная сумма таблицы разделов CRC |
5C~ | зарезервировано, обычно все заполнено нулями |
Количество записей разделов GPT может быть увеличено в соответствии со свойствами таблицы разделов в GPT. То есть количество таблиц разделов GPT может быть выделено, но общий размер составляет 128 записей раздела. И MBR имеет только 4 записи раздела.
typedef struct {
BYTE SIGNATURE[8];
DWORD Revision;
DWORD Headersize;
DWORD CRC32OfHeader;
DWORD Reserved;
UINT64 CurrentLBA;
UINT64 BackupLBA; //location of the other head copy
UINT64 FirstUsableLBA; //primary partition table last LBA+1
UINT64 LastUsableLBA; //secondary parition table first LBA-1
BYTE DiskGUID[16];
UINT64 PartitionEntries;
DWORD NumOfPartitions;
DWORD SizeOfPartitionEntry;
DWORD CRC32ofPartitionArray;
BYTE reserved[420];
} gpt_head_table;
Данные заголовка GPT
2.3.2 Таблица разделов
Структура ввода раздела
Относительное смещение в байтах (шестнадцатеричное) | количество байтов | Описание [Целые числа представлены с прямым порядком байтов] |
---|---|---|
00~0F | 16 | Тип раздела, представленный GUID |
10~1F | 16 | уникальный идентификатор раздела, представленный GUID |
20~27 | 8 | Начальный сектор раздела, представленный значением LBA. |
28~2F | 8 | Конечный сектор (включительно) раздела, представленный значением LBA, обычно нечетным числом. |
30~37 | 8 | флаги атрибутов для раздела |
38~7F | 72 | Удобочитаемое имя раздела в кодировке UTF-16LE, до 32 символов. |
PartitionStartLBA (начальный сектор) и PartitionEndLBA (конечный сектор раздела) в записи раздела являются 64-битными, что увеличено с MBR24 бит до 64 бит, и добавлена проверка CRC.
typedef struct {
BYTE PartitionTypeGUID[16];
BYTE PartitionGUID[16];
UINT64 PartitionStartLBA;
UINT64 PartitionEndLBA;
UINT64 PartitionProperty;
wchar_t PartitionName[36]; //Unicode
} gpt_paptition_table;
В следующей таблице приведено значение PartitionTypeGUID (GUID типа раздела).
Связанная операционная система | GUID[little endian] | значение |
---|---|---|
None | 00000000-0000-0000-0000-000000000000 | Неиспользованный |
None | 024DEE41-33E7-11D3-9D69-0008C781F39F | Таблица раздела MBR |
None | C12A7328-F81F-11D2-BA4B-00A0C93EC93B | Системный раздел EFI [Системный раздел EFI (ESP)] |
None | 21686148-6449-6E6F-744E-656564454649 | Загрузочный раздел BIOS, соответствующая строка ASCII — «Hah!IdontNeedEFI». |
None | D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 | Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology) |
Windows | E3C9E316-0B5C-4DB8-817D-F92DF00215AE | Зарезервированный раздел Майкрософт |
Windows | EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 | Раздел основных данных |
Windows | DE94BBA4-06D1-4D40-A16A-BFD50179D6AC | Среда восстановления Windows |
Linux | 0FC63DAF-8483-4772-8E79-3D69D8477DE4 | раздел данных. Раньше в Linux использовался тот же GUID, что и в разделе базовых данных Windows. Этот новый GUID был изобретен разработчиками GPT fdisk и GNU Parted на основе традиционного кода раздела Linux «8300». |
Linux | 44479540-F297-41B2-9AF7-D131D5F0458A | Корневой раздел x86 (/) Это изобретение systemd и может использоваться для автоматического монтирования без fstab |
Linux | 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 | Корневой раздел x86-64 (/), который является системным изобретением, можно использовать, когда нет автоматической загрузки fstab |
Linux | 3B8F8425-20E0-4F3B-907F-1A25A76F98E8 | Данные сервера (/srv) Это изобретение SYSTEMD, которое можно использовать для автоматического монтирования, когда нет FSTAB |
Linux | 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 | Раздел HOME (/home) Это изобретение systemd и может использоваться для автоматического монтирования без fstab. |
Linux | 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F | Раздел подкачки (swap) не изобретение systemd, но его можно использовать и для автоматического монтирования без fstab |
Linux | A19D880F-05FC-4D3B-A006-743F0F84911E | RAID-раздел |
Linux | E6D6D379-F507-44C2-A23C-238F2A3DF928 | Разделы диспетчера логических томов (LVM) |
Linux | 8DA63339-0007-60C0-C436-083AC8230908 | резерв |
Microsoft также дополнительно сегментирует атрибуты раздела: младшие 4 байта указывают атрибуты, которые не зависят от типа раздела, а старшие 4 байта представляют свойства, связанные с типом раздела. В настоящее время Microsoft использует следующие свойства:
Bit | объяснять |
---|---|
0 | Системный раздел (средства работы с разделами диска должны оставить этот раздел как есть, без каких-либо изменений) |
1 | Скрытый раздел EFI (невидимый раздел EFI) |
2 | Устаревший флаг загрузочного раздела BIOS |
60 | только чтение |
62 | Спрятать |
63 | Не устанавливайте автоматически, то есть не назначать буквы дисков |
Данные входа в раздел
2.3.3 Резервная копия таблицы разделов, резервная копия заголовка GPT
Резервная таблица разделов и заголовок раздела находятся в конце данных жесткого диска, а данные и структура внутри такие же, как и в таблице разделов и заголовке раздела. является резервной копией заголовка.
2.4 Преимущества GPT
GPT снимает барьер в 2 ТБ за счет увеличения количества разделов и количества битов хранения в начальном и конечном секторах в таблице разделов. GPT не имеет единой структуры данных, такой как MBR, но имеет резервную копию таблицы разделов и CRC, что может эффективно предотвратить повреждение структуры.
инструмент
Инструменты, используемые в этой статье:010Editor Шестнадцатеричный редактор
Недостаточно читать блоги?
Приглашаем всех отсканировать QR-код, чтобы присоединиться к группе обмена, обсудить технические вопросы, связанные с ведением блога, и больше взаимодействовать с блогерами.
По вопросам перепечатки блога, офлайн-мероприятий и сотрудничества обращайтесь по адресуshadowfly_zyl@hotmail.comобщаться