OSDev Wiki
Advertisement

GUID-таблица разделов (GPT, GUID Partition Table) была разработана в связи с необходимостью преодоления ограничений, накладываемых традиционной таблицей разделов жёсткого диска, не позволяющей создавать разделы размером свыше 2 Тбайт или располагать их на дисках за пределами первых 2 Тбайт их ёмкости. GPT является частью стандарта UEFI, первая версия которого появилась в 2000-м году.

Важнейшим техническим отличием GPT от традиционной таблицы разделов является полный отказ от использования дисковых адресов формата CHS и окончательный переход на адресацию LBA. Кроме того, GPT упрощает разбиение дисков на большое число разделов.

Защитная MBR[]

Файл:Gpt.png

Расположение GPT

Диски, использующие GPT, в нулевом секторе по-прежнему могут содержать обычную главную загрузочную запись (MBR), используемую для загрузки с этого диска операционной системы в том случае, если компьютер не соответствует спецификации UEFI. Если возможность загрузки с таких компьютеров не требуется, вместо обычной («унаследованной» или «традиционной» — legacy, как называет её спецификация UEFI) MBR в нулевом секторе находится защитная MBR, предотвращающая уничтожение информации на диске при попытке использования с ним операционных систем и дисковых утилит, не умеющих работать с GPT.

Оба варианта MBR имеют одинаковый формат, полностью соответствующий традиционной MBR. В защитной MBR, однако, код начального загрузчика не используется, поскольку загрузка с такого диска может выполняться только на компьютерах, удовлетворяющих спецификации UEFI, и осуществляется не так, как на компьютерах без поддержки UEFI (подробнее о процессе загрузки можно прочитать здесь).

Таблица разделов в обоих видах MBR также имеет одинаковый формат. Разница заключается в том, что на дисках, допускающих загрузку на компьютерах без поддержки UEFI, в ней должен быть определён хотя бы один раздел, содержащий загружаемую традиционным загрузчиком ОС; этот раздел должен быть помечен как активный, а процесс загрузки из него ничем не будет отличаться от обычного. Кроме того, в таблице разделов традиционной MBR будет определён раздел с кодом системы, равным EFh, что соответствует файловой системе UEFI. Этот раздел помечается как неактивный, однако именно его будет использовать BIOS компьютера, соответствующего спецификации UEFI, и лишь в случае отсутствия такого раздела будет запущен код традиционного загрузчика.

В таблице разделов защитной MBR определён только один раздел с кодом системы EEh, покрывающий собой весь диск. Поле начала этого раздела в формате CHS задаёт цилиндр 0, головку 0 и сектор 2 (первый сектор соответствует самой MBR), поле начала в формате LBA — сектор 1. Поля конца соответствуют последнему сектору физического диска, а если его ёмкость превосходит предел, допускаемый традиционной таблицей разделов, то они содержат значения FFFFFFh для адреса в формате CHS и FFFFFFFFh для адреса в формате LBA.

Заголовок GPT[]

Первой структурой данных GPT является её заголовок (GPT Header); он размещается в первом секторе диска (LBA = 1). Длина заголовка в будущем может увеличиться, однако он никогда не превысит размер одного физического сектора диска. Для увеличения надёжности хранения данных и устойчивости к сбоям предусмотрена резервная копия заголовка GPT, она хранится в последнем секторе диска. Обе копии заголовка имеют ссылки друг на друга.

Обозначение Смещение Размер Описание
Signature 00h 8 Сигнатура заголовка GPT (строка символов «EFI PART», 5452415020494645h)
Revision 08h 4 Версия формата заголовка; к номеру версии спецификации UEFI она отношения не имеет. Сейчас используется первая версия заголовка, которой соответствует значение 00010000h
HeaderSize 0Ch 4 Размер заголовка GPT в байтах. Он должен превосходить 92 и не должен превышать размер сектора
HeaderCRC32 10h 4 Контрольная сумма заголовка GPT размером HeaderSize байтов. При подсчёте контрольной суммы начальное значение этого поля принимается равным нулю
Reserved 14h 4 Зарезервированное поле; должно содержать нуль
MyLBA 18h 8 LBA этой копии заголовка
AlternateLBA 20h 8 LBA другой копии заголовка
FirstUsableLBA 28h 8 LBA первого блока, с которого могут начинаться разделы этого диска
LastUsableLBA 30h 8 LBA последнего блока, после которого на диске не может быть разделов
DiskGUID 38h 16 Уникальный идентификатор (GUID) этого диска
PartitionEntryLBA 48h 8 LBA начала массива разделов диска
NumberOfPartitionEntries 50h 4 Количество записей в массиве разделов диска
SizeOfPartitionEntry 54h 4 Размер каждой записи массива разделов; должен быть кратен 8
PartitionEntryArrayCRC32 58h 4 Контрольная сумма масива разделов. Подсчёт суммы начинается с начала блока, адрес которого указан полем PartitionEntryLBA, и охватывает NumberOfPartitionEntries * SizeOfPartitionEntry байт, то есть весь массив разделов
Reserved 5Сh Размер сектора - 5Сh Резервная область заголовка, должна содержать нули

Поля FirstUsableLBA и LastUsableLBA определяют область диска, доступную для размещения в ней разделов. За пределами этой области находятся лишь структуры данных UEFI, предназначенные для управления разделами, то есть MBR, заголовок GPT и массив разделов GPT.

Массив разделов[]

Массив разделов начинается непосредственно за блоком заголовка GPT, то есть со второго блока диска (LBA=2). Копия массива находится в конце диска и вплотную примыкает к копии заголовка, то есть кончается предпоследним блоком диска.

Массив разделов состоит из записей одинакового формата, каждая из которых описывает один раздел диска. Первая запись начинается с начала первого сектора массива, последующие вплотную примыкают друг к другу. Размер записей может меняться, однако на одном диске все записи имеют одинаковую длину, указанную в заголовке GPT и кратную 8.

Обозначение Смещение Размер Описание
PartitionTypeGUID 0h 16 GUID типа данного раздела. Определяет файловую систему, используемую для хранения данных в этом разделе
UniquePartitionGUID 10h 16 GUID раздела. Является уникальным идентификатором раздела и создаётся каждый раз, когда создаётся раздел
StartingLBA 20h 8 LBA первого блока данного раздела на диске
EndingLBA 28h 8 LBA последнего блока данного раздела на диске
Attributes 30h 8 Атрибуты раздела
PartitionName 38h 72 Строка в кодировке Unicode, содержащая имя данного раздела
Reserved 80h размер записи - 80h Неиспользуемая часть записи массива разделов

GUID типов разделов[]

Каждая файловая система получает свой GUID, однозначно её идентифицирующий. Стандарт UEFI определяет следующие GUID типов разделов.

Значение GUID Описание
00000000-0000-0000-0000-000000000000 Неиспользуемая запись
C12A7328-F81F-11d2-BA4B-00A0C93EC93B Системный раздел UEFI
024DEE41-33E7-11d3-9D69-0008C781F39F Раздел, содержащий традиционную MBR

Разработчики ОС для своих файловых систем формируют собственные коды GUID.

Атрибуты разделов[]

Каждый раздел имеет поле атрибутов длиной 64 бита. Версия 2.2 спецификации UEFI определяет их следующим образом.

Бит Описание
0 Признак необходимости раздела для функционирования машины. Установкой этого бита владелец/создатель раздела указывает, что без него компьютер может оказаться неработоспособным. В частности, ОС может отказаться загружаться или даже устанавливаться, если этого раздела нет. Удалять или модифицировать такой раздел может только программное обеспечение, точно знающее его назначение и функции, все остальные программы, встретив такой раздел в GPT, не должны каким-либо образом менять его
1 Когда этот бит установлен, BIOS не должна создавать для этого раздела устройство EFI_BLOCK_IO_PROTOCOL. Подробно это описано в спецификации UEFI
2–47 Зарезервировано для нужд UEFI; должны быть равны нулю
48–63 Используются для нужд разработчиков файловых систем. При изменении значений разрядов 0–47 значения этих разрядов должны сохраняться, они изменяются только программным обеспечением соответствующей файловой системы
Advertisement