Как правильно определить BIOS Parameter Block (BPB) для FAT32?
Я искал в интернете полный пример BIOS Parameter Block (BPB) для FAT32, но большинство ресурсов только объясняют, что такое BPB, без предоставления практических примеров. Хотя я успешно создал BPB для FAT12, следуя урокам на BrokenThorn.com, у меня возникают трудности при адаптации его для FAT32.
Я понимаю, что FAT12 и FAT32 имеют много общих полей BPB, но мне нужно уточнить значения, специфичные для FAT32:
- Какое количество секторов на FAT должно быть для FAT32?
- Как определить общее количество секторов на диске FAT32?
- Какие поля, специфичные для FAT32, отличаются от FAT12?
Более общим образом, я хотел бы понять процесс написания правильного BPB для любой файловой системы:
- Как вычислять значения, такие как количество секторов или секторов на FAT?
- Где можно найти надежную документацию или инструменты для определения этих полей?
- Какие стандартные ссылки или спецификации обычно используют разработчики ОС?
Я хочу понять процесс создания правильного BPB с нуля, а не просто копирования значений. Я пытался повторно использовать мой BPB для FAT12 с измененными значениями для FAT32, но при использовании acopy для записи файлов в образ диска, некоторая информация о файлах записывается в область FAT вместо корневого каталога.
Любые рекомендации, работающие примеры или ресурсы будут очень признательны.
Блок параметров BIOS (BPB) для FAT32 требует конкретных значений полей и расширений по сравнению с FAT12, ключевое отличие заключается в том, что FAT32 использует 32-битную структуру FAT и дополнительные поля в Расширенном блоке параметров BIOS (EBPB). Хотя FAT12 и FAT16 имеют много общих полей BPB, FAT32 вводит несколько полей, специфичных для FAT32, и требует разных методов расчета параметров, таких как секторы на FAT и общее количество секторов.
Содержание
- Обзор структуры FAT32 BPB
- Поля и значения, специфичные для FAT32
- Расчет ключевых параметров BPB
- Полный пример BPB FAT32
- Распространенные проблемы и решения
- Надежная документация и инструменты
Обзор структуры FAT32 BPB
Структура BPB FAT32 расширяет исходный формат BPB, добавляя 28 байт информации, специфичной для FAT32, а затем оставшиеся 26 байтов Расширенного блока параметров BIOS (EBPB). Это расширение позволяет FAT32 поддерживать тома гораздо большего размера, чем FAT16.
BPB находится по смещению 0B (11 в десятичной системе) в загрузочном секторе и содержит как стандартные поля (общие с FAT12/FAT16), так и расширения, специфичные для FAT32. Полная структура должна быть правильно инициализирована для корректной работы файловой системы.
Стандартные поля BPB (общие с FAT12/FAT16)
- Байт на сектор: 2 байта по смещению 11, указывающие размер сектора (обычно 512, 1024, 2048 или 4096 байт)
- Секторов на кластер: 1 байт по смещению 13, определяющий, сколько секторов составляет одна единица выделения
- Зарезервированные секторы: 2 байта по смещению 14, указывающие секторы перед FAT (обычно 32 для FAT32)
- Количество FAT: 1 байт по смещению 16 (всегда 2 для FAT32)
- Записи в корневом каталоге: 2 байта по смещению 17 (должны быть 0 для FAT32, так как корневой каталог теперь основан на кластерах)
- Всего секторов: 2 байта по смещению 19 (должны быть 0 для FAT32, так как это поле слишком мало для томов FAT32)
- Дескриптор носителя: 1 байт по смещению 21
- Секторов на FAT: 2 байта по смещению 22 (должны быть 0 для FAT32, так как размер FAT теперь 32-битный)
- Секторов на дорожку: 2 байта по смещению 24
- Количество головок: 2 байта по смещению 26
- Скрытые секторы: 4 байта по смещению 28
- Всего секторов (боль): 4 байта по смещению 32 (используется вместо 2-байтового поля для томов FAT32)
Поля EBPB, специфичные для FAT32
FAT32 EBPB добавляет эти критически важные поля после стандартного BPB:
- Размер FAT (32-битный): 4 байта по смещению 36, содержащие размер одной FAT в секторах
- Расширенные флаги: 2 байта по смещению 40
- Версия ФС: 2 байта по смещению 42 (обычно 0000h для FAT32)
- Кластер корня: 4 байта по смещению 44, указывающий на первый кластер корневого каталога
- Сектор информации ФС: 2 байта по смещению 48 (обычно 1, указывает на сектор FSINFO)
- Резервный загрузочный сектор: 2 байта по смещению 50 (обычно 6, расположение резервного загрузочного сектора)
- Зарезервировано: 12 байтов по смещению 52 (должны быть нулевыми)
- Номер диска: 1 байт по смещению 64
- Флаги Windows NT: 1 байт по смещению 65
- Подпись: 1 байт по смещению 66 (обычно 29h)
- ID тома: 4 байта по смещению 67
- Метка тома: 11 байтов по смещению 71
- Тип файловой системы: 8 байтов по смещению 82 (обычно "FAT32 ")
Поля и значения, специфичные для FAT32
Секторы на FAT
В отличие от FAT12/FAT16, где количество секторов на FAT хранится в 2-байтовом поле, FAT32 использует 4-байтовое поле по смещению 36 в EBPB. Это позволяет FAT32 поддерживать гораздо большие таблицы FAT.
Как рассчитать секторы на FAT:
Секторы на FAT = (Общий размер FAT в байтах) / Байт на сектор
Размер FAT зависит от количества кластеров на томе. Каждая запись FAT в FAT32 занимает 4 байта (32 бита), из которых старшие 4 бита зарезервированы, оставляя 28 бит для номеров кластеров.
Общее количество секторов
FAT32 использует 4-байтовое поле “Всего секторов (боль)” по смещению 32 вместо 2-байтового поля, используемого в FAT12/FAT16. Это позволяет адресовать тома размером до 2 ТБ.
Для определения общего количества секторов:
Всего секторов = (Общий размер тома в байтах) / (Байт на сектор)
Значения полей, специфичных для FAT32
- Записи в корневом каталоге: Должны быть 0 для FAT32 (по смещению 17)
- Секторов на FAT: Должны быть 0 для FAT32 (по смещению 22)
- Всего секторов: Должны быть 0 для FAT32 (по смещению 19)
- Количество FAT: Всегда 2 (по смещению 16)
- Зарезервированные секторы: Обычно 32 для FAT32 (по смещению 14)
Расчет ключевых параметров BPB
Пошаговый процесс расчета
-
Определение параметров тома:
- Общий размер тома (например, 1 ГБ = 1 073 741 824 байт)
- Байт на сектор (обычно 512)
- Секторов на кластер (зависит от размера тома и желаемого размера кластера)
-
Расчет общего количества секторов:
Всего секторов = Общий размер тома / Байт на сектор -
Определение секторов на кластер:
- Для маленьких томов (32 МБ-256 МБ): 1 сектор/кластер
- Для средних томов (256 МБ-8 ГБ): 8 секторов/кластер
- Для больших томов (8 ГБ-16 ГБ): 16 секторов/кластер
- Для очень больших томов (16 ГБ+): 32 сектора/кластера
-
Расчет количества кластеров:
Количество кластеров = Всего секторов / Секторов на кластер -
Расчет размера FAT:
Размер FAT в байтах = Количество кластеров × 4 байта Секторов на FAT = Размер FAT в байтах / Байт на сектор -
Расчет размера области данных:
Зарезервированные секторы = 32 (типично для FAT32) Количество FAT = 2 Секторов в корневом каталоге = 0 (FAT32 использует корневой каталог на основе кластеров) Размер области FAT = Зарезервированные секторы + (Секторов на FAT × Количество FAT) Размер области данных = Всего секторов - Размер области FAT
Пример расчета для тома 1 ГБ
- Общий размер тома: 1 073 741 824 байт
- Байт на сектор: 512
- Секторов на кластер: 16
Всего секторов = 1 073 741 824 / 512 = 2 097 152 сектора
Количество кластеров = 2 097 152 / 16 = 131 072 кластера
Размер FAT в байтах = 131 072 × 4 = 524 288 байт
Секторов на FAT = 524 288 / 512 = 1 024 сектора
Зарезервированные секторы = 32
Размер области FAT = 32 + (1 024 × 2) = 2 080 секторов
Размер области данных = 2 097 152 - 2 080 = 2 095 072 сектора
Полный пример BPB FAT32
Вот правильно структурированный BPB FAT32 с объяснением каждого поля:
; Загрузочный сектор FAT32 с BPB
jmp short BootStart
nop
OEMIdentifier db 'MSDOS5.0' ; 8 байт по смещению 3
BPB_BytesPerSector dw 512 ; 2 байта по смещению 11
BPB_SectorsPerCluster db 16 ; 1 байт по смещению 13
BPB_ReservedSectors dw 32 ; 2 байта по смещению 14
BPB_NumFATs db 2 ; 1 байт по смещению 16
BPB_RootEntries dw 0 ; 2 байта по смещению 17 (должны быть 0 для FAT32)
BPB_TotalSectors dw 0 ; 2 байта по смещению 19 (должны быть 0 для FAT32)
BPB_MediaDescriptor db 0xF8 ; 1 байт по смещению 21
BPB_SectorsPerFAT dw 0 ; 2 байта по смещению 22 (должны быть 0 для FAT32)
BPB_SectorsPerTrack dw 63 ; 2 байта по смещению 24
BPB_NumHeads dw 255 ; 2 байта по смещению 26
BPB_HiddenSectors dd 0 ; 4 байта по смещению 28
BPB_TotalSectorsLarge dd 2097152 ; 4 байта по смещению 32 (всего секторов)
; Поля EBPB, специфичные для FAT32
BPB_FATSize32 dd 1024 ; 4 байта по смещению 36 (секторов на FAT)
BPB_ExtFlags dw 0 ; 2 байта по смещению 40
BPB_FSVersion dw 0 ; 2 байта по смещению 42
BPB_RootCluster dd 2 ; 4 байта по смещению 44 (первый кластер корня)
BPB_FSInfoSector dw 1 ; 2 байта по смещению 48
BPB_BootSectorBackup dw 6 ; 2 байта по смещению 50
BPB_Reserved times 12 db 0 ; 12 байтов по смещению 52
BPB_DriveNumber db 0x80 ; 1 байт по смещению 64
BPB_Reserved1 db 0 ; 1 байт по смещению 65
BPB_BootSignature db 29h ; 1 байт по смещению 66
BPB_VolumeID dd 0x12345678 ; 4 байта по смещению 67
BPB_VolumeLabel db 'NO NAME ' ; 11 байтов по смещению 71
BPB_FileSystemType db 'FAT32 ' ; 8 байтов по смещению 82
; Остальной код загрузки и подпись загрузки по смещению 1FE-1FF
Ключевые объяснения полей:
- BPB_BytesPerSector: 512 (стандартный размер сектора для гибких/жестких дисков)
- BPB_SectorsPerCluster: 16 (16 секторов на кластер = размер кластера 8 КБ)
- BPB_ReservedSectors: 32 (секторы перед FAT, включая загрузочный сектор)
- BPB_NumFATs: 2 (стандартно для файловых систем FAT)
- BPB_RootEntries: 0 (FAT32 не использует корневой каталог фиксированного размера)
- BPB_TotalSectors: 0 (слишком мало для FAT32, используйте BPB_TotalSectorsLarge)
- BPB_SectorsPerFAT: 0 (слишком мало для FAT32, используйте BPB_FATSize32)
- BPB_TotalSectorsLarge: 2 097 152 (том 1 ГБ с секторами по 512 байт)
- BPB_FATSize32: 1 024 (размер таблицы FAT в секторах)
- BPB_RootCluster: 2 (первый кластер корневого каталога, после области FAT и данных)
Распространенные проблемы и решения
Проблема: Файлы записываются в область FAT вместо корневого каталога
Это обычно происходит, когда:
- Неправильный кластер корня: Кластер корневого каталога должен указывать на первый кластер данных после области FAT
- Неправильный расчет размера FAT: Некорректный размер FAT может сместить область данных
- Недостаточно зарезервированных секторов: FAT32 обычно требует больше зарезервированных секторов, чем FAT12
Решение:
- Рассчитать первый кластер данных:
Первый кластер данных = Зарезервированные секторы + (Секторов на FAT × Количество FAT) / Секторов на кластер - Убедиться, что BPB_RootCluster указывает на рассчитанный кластер
- Проверить, что расчет размера FAT учитывает все записи кластеров
Проблема: Том не распознается операционными системами
Распространенные причины:
- Отсутствует подпись загрузки: Подпись 0xAA55 по смещению 1FE-1FF обязательна
- Неправильный дескриптор носителя: Обычно должен быть 0xF8 для жестких дисков, 0xF0 для сменных носителей
- Несоответствие типа файловой системы: Убедитесь, что BPB_FileSystemType имеет значение 'FAT32 ’ с правильным заполнением
Проблема: Несоответствие размера кластера
- Секторов на кластер должны быть степенью двойки: 1, 2, 4, 8, 16, 32, 64, 128
- Размер кластера должен соответствовать размеру тома: Слишком маленькие кластеры тратят место на FAT, слишком большие - на файлы
Надежная документация и инструменты
Официальные спецификации
- Спецификация EFI FAT32 от Microsoft: Определяет точную структуру и требования для файловых систем FAT32
- Документация по FAT с открытым исходным кодом:
- OSDev Wiki FAT Filesystem: Всеобъемлющий технический справочник
- HandWiki BIOS parameter block: Подробная информация о структуре BPB
Инструменты разработки
- Инструменты форматирования FAT32: Используйте существующие инструменты для генерации эталонных структур BPB
- Инструменты анализа образов диска:
hexeditилиxxdдля исследования низкоуровневых структур- Команда
fileдля определения типа файловой системы
- Калькуляторы BPB: Напишите скрипты для расчета параметров BPB на основе спецификаций тома
Проверка и тестирование
- Валидация загрузочного сектора: Убедитесь, что загрузочный сектор может быть загружен BIOS
- Проверки согласованности FAT: Убедитесь, что записи FAT указывают на допустимые кластеры
- Многоплатформенное тестирование: Тестируйте на нескольких операционных системах (Windows, Linux, macOS)
Обучающие ресурсы
- Учебники по разработке файловых систем:
- BrokenThorn.com: Отлично для основ FAT12/FAT16
- OSDev.org Forum: Активное сообщество для разработки файловых систем
- Примеры кода: Многие проекты с открытым исходным кодом предоставляют рабочие реализации BPB
Заключение
Создание правильного BPB FAT32 требует тщательного внимания как к стандартным полям BPB, так и к расширениям, специфичным для FAT32. Ключевые отличия от FAT12 включают использование 32-битных полей FAT, корневого каталога на основе кластеров и других методов расчета критических параметров, таких как секторы на FAT и общее количество секторов.
Чтобы построить правильный BPB FAT32 с нуля:
- Рассчитайте общее количество секторов на основе размера вашего тома
- Определите подходящее количество секторов на кластер для вашего размера тома
- Вычислите размер FAT, используя 32-битное поле (4 байта на запись кластера)
- Установите поля, специфичные для FAT32, в ноль, где это требуется
- Укажите корневой каталог на правильный первый кластер данных
- Включите правильную подпись загрузки и идентификацию файловой системы
Наиболее распространенные проблемы при адаптации BPB FAT12 к FAT32 связаны с неправильными расчетами полей, особенно для размера FAT и расположения корневого каталога. Всегда проверяйте ваши расчеты и тщательно тестируйте с используемыми инструментами.
Для дальнейшей разработки обращайтесь к официальной спецификации FAT32 от Microsoft и используйте активное сообщество разработчиков ОС для устранения неполадок и продвинутых техник реализации файловых систем.
Источники
- Wikipedia - BIOS parameter block
- Wikipedia - Design of the FAT file system
- OSDev Wiki - FAT Filesystem
- Eric Lo’s FAT32 Filesystem Overview
- NTFS.com - Boot Sector and Bootstrap Modifications
- HandWiki - BIOS parameter block
- Averstak FAT Boot Sector Documentation
- Computer Science Journal - FAT32 Data Structure Review