НейроАгент

FAT32 BPB: Полное руководство определений

Полное руководство по FAT32 BPB, охватывающее структуру, значения полей, расчеты и распространенные проблемы. Практические примеры для реализации файловой системы и устранения неполадок.

Вопрос

Как правильно определить 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

Структура 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 ГБ = 1 073 741 824 байт)
    • Байт на сектор (обычно 512)
    • Секторов на кластер (зависит от размера тома и желаемого размера кластера)
  2. Расчет общего количества секторов:

    Всего секторов = Общий размер тома / Байт на сектор
    
  3. Определение секторов на кластер:

    • Для маленьких томов (32 МБ-256 МБ): 1 сектор/кластер
    • Для средних томов (256 МБ-8 ГБ): 8 секторов/кластер
    • Для больших томов (8 ГБ-16 ГБ): 16 секторов/кластер
    • Для очень больших томов (16 ГБ+): 32 сектора/кластера
  4. Расчет количества кластеров:

    Количество кластеров = Всего секторов / Секторов на кластер
    
  5. Расчет размера FAT:

    Размер FAT в байтах = Количество кластеров × 4 байта
    Секторов на FAT = Размер FAT в байтах / Байт на сектор
    
  6. Расчет размера области данных:

    Зарезервированные секторы = 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 с объяснением каждого поля:

assembly
; Загрузочный сектор 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 вместо корневого каталога

Это обычно происходит, когда:

  1. Неправильный кластер корня: Кластер корневого каталога должен указывать на первый кластер данных после области FAT
  2. Неправильный расчет размера FAT: Некорректный размер FAT может сместить область данных
  3. Недостаточно зарезервированных секторов: FAT32 обычно требует больше зарезервированных секторов, чем FAT12

Решение:

  • Рассчитать первый кластер данных: Первый кластер данных = Зарезервированные секторы + (Секторов на FAT × Количество FAT) / Секторов на кластер
  • Убедиться, что BPB_RootCluster указывает на рассчитанный кластер
  • Проверить, что расчет размера FAT учитывает все записи кластеров

Проблема: Том не распознается операционными системами

Распространенные причины:

  • Отсутствует подпись загрузки: Подпись 0xAA55 по смещению 1FE-1FF обязательна
  • Неправильный дескриптор носителя: Обычно должен быть 0xF8 для жестких дисков, 0xF0 для сменных носителей
  • Несоответствие типа файловой системы: Убедитесь, что BPB_FileSystemType имеет значение 'FAT32 ’ с правильным заполнением

Проблема: Несоответствие размера кластера

  • Секторов на кластер должны быть степенью двойки: 1, 2, 4, 8, 16, 32, 64, 128
  • Размер кластера должен соответствовать размеру тома: Слишком маленькие кластеры тратят место на FAT, слишком большие - на файлы

Надежная документация и инструменты

Официальные спецификации

  1. Спецификация EFI FAT32 от Microsoft: Определяет точную структуру и требования для файловых систем FAT32
  2. Документация по FAT с открытым исходным кодом:

Инструменты разработки

  1. Инструменты форматирования FAT32: Используйте существующие инструменты для генерации эталонных структур BPB
  2. Инструменты анализа образов диска:
    • hexedit или xxd для исследования низкоуровневых структур
    • Команда file для определения типа файловой системы
  3. Калькуляторы BPB: Напишите скрипты для расчета параметров BPB на основе спецификаций тома

Проверка и тестирование

  1. Валидация загрузочного сектора: Убедитесь, что загрузочный сектор может быть загружен BIOS
  2. Проверки согласованности FAT: Убедитесь, что записи FAT указывают на допустимые кластеры
  3. Многоплатформенное тестирование: Тестируйте на нескольких операционных системах (Windows, Linux, macOS)

Обучающие ресурсы

  1. Учебники по разработке файловых систем:
    • BrokenThorn.com: Отлично для основ FAT12/FAT16
    • OSDev.org Forum: Активное сообщество для разработки файловых систем
  2. Примеры кода: Многие проекты с открытым исходным кодом предоставляют рабочие реализации BPB

Заключение

Создание правильного BPB FAT32 требует тщательного внимания как к стандартным полям BPB, так и к расширениям, специфичным для FAT32. Ключевые отличия от FAT12 включают использование 32-битных полей FAT, корневого каталога на основе кластеров и других методов расчета критических параметров, таких как секторы на FAT и общее количество секторов.

Чтобы построить правильный BPB FAT32 с нуля:

  1. Рассчитайте общее количество секторов на основе размера вашего тома
  2. Определите подходящее количество секторов на кластер для вашего размера тома
  3. Вычислите размер FAT, используя 32-битное поле (4 байта на запись кластера)
  4. Установите поля, специфичные для FAT32, в ноль, где это требуется
  5. Укажите корневой каталог на правильный первый кластер данных
  6. Включите правильную подпись загрузки и идентификацию файловой системы

Наиболее распространенные проблемы при адаптации BPB FAT12 к FAT32 связаны с неправильными расчетами полей, особенно для размера FAT и расположения корневого каталога. Всегда проверяйте ваши расчеты и тщательно тестируйте с используемыми инструментами.

Для дальнейшей разработки обращайтесь к официальной спецификации FAT32 от Microsoft и используйте активное сообщество разработчиков ОС для устранения неполадок и продвинутых техник реализации файловых систем.

Источники

  1. Wikipedia - BIOS parameter block
  2. Wikipedia - Design of the FAT file system
  3. OSDev Wiki - FAT Filesystem
  4. Eric Lo’s FAT32 Filesystem Overview
  5. NTFS.com - Boot Sector and Bootstrap Modifications
  6. HandWiki - BIOS parameter block
  7. Averstak FAT Boot Sector Documentation
  8. Computer Science Journal - FAT32 Data Structure Review