This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these messages)
|
Разработчик(и) | Microsoft , SCP , IBM , Compaq , Цифровые исследования , Novell , Caldera |
---|---|
Полное имя | Таблица размещения файлов: FAT12 (12-битная версия), FAT16 (16-битные версии), FAT32 (32-битная версия с использованием 28 бит), exFAT (64-битные версии) |
Введено | 1977 ( автономный диск BASIC-80 ) FAT12: август 1980 (SCP QDOS ) FAT16: август 1984 (IBM PC DOS 3.0) FAT16B: ноябрь 1987 ( Compaq MS-DOS 3.31) FAT32: август 1996 ( Windows 95 OSR2 ) exFAT: ноябрь 2006 ( Windows Embedded CE 6.0 ) |
Идентификаторы разделов | MBR / EBR : FAT12 : ea FAT16 : ea FAT32 : ea exFAT : ea BDP : 0x01 0x04 0x06 0x0E 0x0B 0x0C 0x07 EBD0A0A2-B9E5-443387C0-68B6B72699C7 |
Структуры | |
Содержимое каталога | Стол |
Распределение файлов | Связанный список |
Плохие блоки | Кластерная маркировка |
Пределы | |
Максимальный размер тома | FAT12: 32 МБ (256 МБ для кластеров по 64 КБ ) FAT16: 2 ГБ (4 ГБ для кластеров по 64 КБ ) FAT32: 2 ТБ (16 ТБ для секторов по 4 КБ ) |
Максимальный размер файла | 4 294 967 295 байт (4 ГБ - 1) с FAT16B и FAT32 [1] |
Макс . кол- во файлов | FAT12: 4068 для кластеров по 8 КБ FAT16: 65460 для кластеров по 32 КБ FAT32: 268173300 для кластеров по 32 КБ |
Максимальная длина имени файла | 8.3 имя файла или 255 символов UCS-2 при использовании LFN |
Функции | |
Даты записаны | Дата/время изменения, дата/время создания (только DOS 7.0 и выше), дата доступа (доступно только при включенном ACCDATE ), [2] дата/время удаления (только с DELWATCH 2) |
Диапазон дат | 1980-01-01 по 2099-12-31 ( 2107-12-31 ) |
Разрешение даты | 2 секунды для времени последнего изменения, 10 мс для времени создания, 1 день для даты доступа, 2 секунды для времени удаления |
Вилки | Не изначально |
Атрибуты | Только для чтения, Скрытый, Системный, Том, Каталог, Архив |
Разрешения файловой системы | FAT12/FAT16: права доступа к файлам, каталогам и томам для чтения, записи, выполнения, удаления только с DR-DOS , PalmDOS , Novell DOS , OpenDOS , FlexOS , 4680 OS , 4690 OS , Concurrent DOS , Multiuser DOS , System Manager , REAL/32 (право выполнения только с FlexOS, 4680 OS, 4690 OS; отдельные пароли файлов/каталогов не с FlexOS, 4680 OS, 4690 OS; классы разрешений World/Group/Owner только с загруженной многопользовательской безопасностью) FAT32: частичные, только с DR-DOS, REAL/32 и 4690 OS |
Прозрачное сжатие | FAT12/FAT16: для каждого тома, SuperStor , Stacker , DoubleSpace , DriveSpace FAT32: нет |
Прозрачное шифрование | FAT12/FAT16: только для тома с DR-DOS FAT32: нет |
Файловая система FAT — это файловая система, используемая в операционных системах семейства MS-DOS и Windows 9x . [3] Она продолжает использоваться на мобильных устройствах и встраиваемых системах и, таким образом, является хорошо подходящей файловой системой для обмена данными между компьютерами и устройствами практически любого типа и возраста с 1981 года по настоящее время.
Файловая система FAT состоит из четырех областей:
Область | Размер в секторах | Содержание | Примечания |
---|---|---|---|
Зарезервированные сектора | (количество зарезервированных секторов) | Загрузочный сектор | Первый зарезервированный сектор (логический сектор 0) — это загрузочный сектор (также называемый Volume Boot Record или просто VBR ). Он включает область, называемую BIOS Parameter Block ( BPB ), которая содержит некоторую базовую информацию о файловой системе, в частности, ее тип и указатели на расположение других разделов, и обычно содержит код загрузчика операционной системы. Важная информация из загрузочного сектора доступна через структуру операционной системы, называемую блоком параметров диска ( DPB ) в DOS и OS/2. Общее количество зарезервированных секторов указывается в поле внутри загрузочного сектора и обычно составляет 32 в файловых системах FAT32. [4] Для файловых систем FAT32 зарезервированные сектора включают сектор информации о файловой системе в логическом секторе 1 и резервный загрузочный сектор в логическом секторе 6. В то время как многие другие поставщики продолжали использовать односекторную настройку (только логический сектор 0) для загрузчика, код загрузочного сектора Microsoft расширился и охватывает логические секторы 0 и 2 с момента введения FAT32, причем логический сектор 0 зависит от подпрограмм в логическом секторе 2. Область резервного загрузочного сектора также состоит из трех логических секторов 6, 7 и 8. В некоторых случаях Microsoft также использует сектор 12 области зарезервированных секторов для расширенного загрузчика. |
Сектор информации FS (только FAT32) | |||
Дополнительные зарезервированные сектора (необязательно) | |||
Регион FAT | (количество FAT) * (секторов на FAT) | Таблица размещения файлов №1 | Обычно он содержит две копии таблицы размещения файлов для проверки избыточности, хотя используется редко, даже утилитами восстановления дисков. Это карты области данных, указывающие, какие кластеры используются файлами и каталогами. В FAT12 и FAT16 они следуют сразу за зарезервированными секторами. Обычно дополнительные копии хранятся в тесной синхронизации при записи, а при чтении они используются только при возникновении ошибок в первой FAT. Первые два кластера (кластер 0 и 1) на карте содержат специальные значения. |
Таблица размещения файлов №2 ... (необязательно) | |||
Регион корневого каталога | (количество корневых записей * 32) / (байт на сектор) | Корневой каталог (только FAT12 и FAT16) | Это таблица каталогов , которая хранит информацию о файлах и каталогах, расположенных в корневом каталоге. Она используется только с FAT12 и FAT16 и накладывает на корневой каталог фиксированный максимальный размер, который предварительно выделяется при создании этого тома. FAT32 хранит корневой каталог в области данных вместе с файлами и другими каталогами, позволяя ему расти без такого ограничения. Таким образом, для FAT32 область данных начинается здесь. |
Регион данных | (количество кластеров) * (секторов на кластер) | Область данных (для файлов и каталогов) ... (до конца раздела или диска) | Здесь хранятся фактические данные файлов и каталогов, и они занимают большую часть раздела. FAT32 обычно начинает таблицу корневых каталогов в кластере номер 2: первый кластер области данных. |
FAT использует формат little-endian для всех записей в заголовке (за исключением, где это явно указано, некоторых записей в загрузочных секторах Atari ST) и FAT(s). [5] Можно выделить больше секторов FAT, чем необходимо для количества кластеров. Конец последнего сектора каждой копии FAT может быть неиспользованным, если нет соответствующих кластеров. Общее количество секторов (как указано в загрузочной записи) может быть больше, чем количество секторов, используемых данными (кластеры × секторы на кластер), FAT (количество FAT × секторы на FAT), корневой каталог (n/a для FAT32) и скрытые секторы, включая загрузочный сектор: это приведет к неиспользуемым секторам в конце тома. Если раздел содержит больше секторов, чем общее количество секторов, занятых файловой системой, это также приведет к неиспользуемым секторам в конце раздела, после тома.
На неразделенных устройствах хранения данных , таких как дискеты , загрузочный сектор ( VBR ) является первым сектором (логический сектор 0 с физическим адресом CHS 0/0/1 или адресом LBA 0). Для разделенных устройств хранения данных, таких как жесткие диски, загрузочный сектор является первым сектором раздела, как указано в таблице разделов устройства.
Смещение байта | Длина (байты) | Содержание |
---|---|---|
0x000 | 3 | Инструкция перехода. Если загрузочный сектор имеет действительную подпись, находящуюся в последних двух байтах загрузочного сектора (проверенную большинством загрузчиков, находящихся в системной BIOS или MBR), и этот том загружается, предыдущий загрузчик передаст выполнение в эту точку входа с определенными значениями регистров, а затем инструкция перехода пропустит остальную часть (неисполняемого) заголовка. См. Запись загрузки тома . Начиная с DOS 2.0, допустимые загрузочные диски x86 должны начинаться либо с короткого перехода, за которым следует NOP ( последовательность опстрингов 0xEB 0x?? 0x90 [6] [7] , как это видно с DOS 3.0 [nb 1] —и в DOS 1.1 [8] [9] ), либо с ближнего перехода ( 0xE9 0x?? 0x?? [6] [7] , как это видно на большинстве ( Compaq , TeleVideo ) отформатированных в DOS 2.x дисков, а также на некоторых ( Epson , Olivetti ) дисках DOS 3.1). Для обратной совместимости MS-DOS, PC DOS и DR-DOS также принимают переход ( 0x69 0x?? 0x?? ) [6] [7] [10] на сменных дисках. На жестких дисках DR DOS дополнительно принимает переставленную последовательность JMPS, начинающуюся с NOP ( 0x90 0xEB 0x?? ), [10] тогда как MS-DOS/PC DOS этого не делают. (См. ниже о совместимости с Atari ST.) Наличие одного из этих шаблонов opstring (в сочетании с проверкой на допустимое значение дескриптора носителя по смещению 0x015 ) служит индикатором для DOS 3.3 и выше того, что присутствует какой-то вид BPB (хотя точный размер не должен определяться из цели перехода, поскольку некоторые загрузочные секторы содержат частные данные загрузчика после BPB), в то время как для томов DOS 1.x (и некоторых DOS 3.0) им придется вернуться к методу DOS 1.x, чтобы определить формат через байт носителя в FAT (в логическом секторе 1). |
0x003 | 8 | Имя OEM (дополнено пробелами 0x20 ). Это значение определяет, в какой системе был отформатирован диск. Хотя официально документировано как свободное для использования OEM, MS-DOS/PC DOS (начиная с версии 3.1), Windows 95/98/SE/ME и OS/2 проверяют это поле, чтобы определить, на какие другие части загрузочной записи можно положиться и как их интерпретировать. Поэтому установка метки OEM на произвольные или фиктивные значения может привести к тому, что MS-DOS, PC DOS и OS/2 не будут правильно распознавать том и приводить к повреждению данных при записи. [11] [12] [13] Типичными примерами являются " Некоторые поставщики хранят в этой записи лицензионную информацию или ключи доступа. Volume Tracker в Windows 95/98/SE/ME перезапишет OEM-метку Некоторые загрузчики вносят коррективы или отказываются передавать управление загрузочному сектору в зависимости от определенных значений, обнаруженных здесь (например, смещение NEWLDR 0x018 ). Загрузочное ПЗУ компьютера Wang Professional Computer будет считать диск загрузочным, только если первые четыре символа метки OEM — « Если в FAT32 EBPB сигнатура в секторе со смещением 0x042 равна 0x29 , а обе записи общего количества секторов равны 0, запись файловой системы может служить 64-битной записью общего количества секторов, а запись метки OEM может использоваться как альтернативный тип файловой системы вместо обычной записи со смещением 0x052 . Аналогичным образом, если эта запись установлена в " |
0x00B | варьируется | Блок параметров BIOS (13, 19, 21 или 25 байт), расширенный блок параметров BIOS (32 или 51 байт) или расширенный блок параметров BIOS FAT32 (60 или 79 байт); размер и содержимое различаются в зависимости от операционной системы и версии, см. ниже |
варьируется | варьируется | Загрузочный код, специфичный для файловой системы и операционной системы; часто начинается сразу после [E]BPB, но иногда между концом [E]BPB и началом загрузочного кода хранятся дополнительные «личные» данные загрузчика; поэтому переход по смещению 0x001 не может быть использован для надежного получения точного формата [E]BPB. (В сочетании с DOS 3.31 BPB некоторые загрузчики GPT (например, BootDuet ) используют 0x1FA – 0x1FD для хранения старших 4 байтов скрытых секторов для томов, расположенных за пределами первых 2 32 -1 секторов. Поскольку это место может содержать код или другие данные в других загрузочных секторах, запись в него может быть невозможна, если не все 0x1F9 – 0x1FD содержат ноль.) |
0x1FD | 1 | Номер физического диска (только в загрузочных секторах DOS 3.2 - 3.31). С OS/2 1.0 и DOS 4.0 эта запись переместилась в сектор со смещением 0x024 (по смещению 0x19 в EBPB). Большинство загрузочных секторов Microsoft и IBM с тех пор сохраняют значения 0x00 по смещению 0x1FC и 0x1FD , хотя они не являются частью сигнатуры по адресу 0x1FE . Если это относится к загрузочному тому, улучшенный MBR DR-DOS 7.07 может быть настроен (см. NEWLDR offset 0x014 ) для динамического обновления этой записи до значения DL, предоставленного во время загрузки, или значения, сохраненного в таблице разделов. Это позволяет загружать альтернативные диски, даже если код VBR игнорирует значение DL. |
0x1FE | 2 | Подпись загрузочного сектора ( 0x55 0xAA ). [4] [nb 2] Эта подпись указывает на совместимый с IBM PC загрузочный код и проверяется большинством загрузчиков, находящихся в системной BIOS или MBR, перед передачей выполнения загрузочному коду загрузочного сектора (но, например, не исходным IBM PC ROM-BIOS [16] ). Эта подпись не указывает на конкретную файловую систему или операционную систему. Поскольку эта подпись присутствует не на всех дисках, отформатированных в FAT (например, не на DOS 1.x [8] [9] или не загружаемых с x86 томах FAT), операционные системы не должны полагаться на эту подпись при входе в тома (старые выпуски MS-DOS/PC DOS до 3.3 проверяли эту подпись, но более новые выпуски, а также DR-DOS этого не делают). Инструменты форматирования не должны записывать эту подпись, если записанный загрузочный сектор не содержит по крайней мере заглушку фиктивного загрузчика, совместимого с x86; как минимум, он должен остановить ЦП в бесконечном цикле ( 0xF4 0xEB 0xFD ) или выдать INT 19h и RETF ( 0xCD 0x19 0xCB ). Однако эти строки операций не следует использовать при смещении сектора 0x000 , поскольку DOS проверяет другие коды операций как сигнатуры. Многие дискеты MSX-DOS 2 используют 0xEB 0xFE 0x90 при смещении сектора 0x000 , чтобы поймать ЦП в тесном цикле, сохраняя при этом шаблон кода операции, распознаваемый MS-DOS/PC DOS. Эта подпись должна располагаться по фиксированному смещению сектора 0x1FE для размеров сектора 512 или выше. Если размер физического сектора больше, она может быть повторена в конце физического сектора. Atari ST будет считать диск загрузочным для Atari 68000 , если контрольная сумма по 256 big-endian словам загрузочного сектора равна 0x1234 . [17] [nb 3] Если код загрузчика совместим с IBM, важно убедиться, что контрольная сумма по загрузочному сектору не совпадает с этой контрольной суммой случайно. Если это произойдет, можно использовать изменение неиспользуемого бита (например, до или после области загрузочного кода), чтобы гарантировать, что это условие не выполняется. В редких случаях на образах дисков наблюдалась обратная сигнатура 0xAA 0x55 . Это может быть результатом неправильной реализации в инструменте форматирования на основе неправильной документации, [nb 2], но это также может указывать на перестановку порядка байтов в образе диска, что могло произойти при передаче между платформами с разным порядком байтов . Значения BPB и файловые системы FAT12, FAT16 и FAT32 предназначены только для использования представления little-endian , и нет известных реализаций вариантов, использующих значения big-endian . |
Смещение байта | Длина (байты) | Содержание |
---|---|---|
0x000 | 2 | Инструкция перехода. Оригинальные загрузочные секторы Atari ST начинаются с инструкции 68000 BRA.S ( 0x60 0x?? ). [5] Для совместимости с операционными системами ПК диски, отформатированные Atari ST, начиная с TOS 1.4, начинаются с 0xE9 0x?? . |
0x002 | 6 | Имя OEM (дополненное пробелами 0x20 ), например, " " ( 0x4C 0x6F 0x61 0x64 0x65 0x72 ) на томах, содержащих загрузчик Atari ST. См. меры предосторожности при использовании имени OEM для дисков, отформатированных на ПК, выше. Смещение и длина этой записи отличаются от записи на дисках, отформатированных на ПК.Loader |
0x008 | 3 | Серийный номер диска [5] (по умолчанию: 0x00 0x00 0x00 ), используемый Atari ST для обнаружения смены диска. (Windows 9x Volume Tracker всегда будет сохранять здесь " " на незащищенных от записи дискетах; см. выше.) Это значение необходимо изменить, если содержимое диска было изменено извне, в противном случае Atari ST может не распознать изменение при повторной вставке. Эта запись перекрывает поле OEM Name на дисках, отформатированных для ПК. Для максимальной совместимости может потребоваться сопоставить здесь определенные шаблоны; см. выше.IHC |
0x00B | 19 | Блок параметров BIOS DOS 3.0 ( формат little-endian ) |
0x01E | варьируется | Данные частного загрузочного сектора (смешанный формат с прямым и обратным порядком байтов ) |
варьируется | варьируется | Файловая система и специфичный для операционной системы загрузочный код Atari ST. Не следует делать никаких предположений относительно позиции загрузки кода, который должен быть перемещаемым. Если загрузка операционной системы (TOS.IMG [5] ) не удалась, код может вернуться в BIOS Atari ST с инструкцией 68000 RTS ( код операции 0x4E75 с байтовой последовательностью big-endian 0x4E 0x75 [nb 2] ) и всеми регистрами без изменений. |
0x1FE | 2 | Контрольная сумма. 16-битная контрольная сумма по 256 словам с обратным порядком байтов 512-байтового загрузочного сектора, включая это слово, должна соответствовать магическому значению 0x1234 , чтобы указать исполняемый код загрузочного сектора Atari ST 68000. [17] Эта запись контрольной суммы может использоваться для соответствующего выравнивания контрольной суммы. [примечание 3] Если размер логического сектора больше 512 байт, остаток не включается в контрольную сумму и обычно заполняется нулями. [17] Поскольку некоторые операционные системы ПК ошибочно не принимают дискеты в формате FAT, если сигнатура 0x55 0xAA [nb 2] отсутствует, рекомендуется поместить 0x55 0xAA в это место (и добавить совместимый с IBM загрузчик или заглушку) и использовать неиспользуемое слово в области личных данных или загрузочного кода или серийного номера, чтобы гарантировать, что контрольная сумма 0x1234 [nb 3] не совпадет (если только общий код FAT не будет исполняемым файлом как IBM PC, так и Atari ST одновременно). |
Смещение байта | Длина (байты) | Содержание |
---|---|---|
0x000 | 3 | Фиктивная инструкция перехода (например, 0xEB 0xFE 0x90 ). |
0x003 | 8 | Имя OEM (дополнено пробелами 0x20 ). |
0x00B | 19 | DOS 3.0 БПБ |
0x01E | варьируется (2) | Точка входа кода MSX-DOS 1 для процессоров Z80 в загрузочный код MSX. Это то место, куда машины MSX-DOS 1 переходят при передаче управления загрузочному сектору. Это место перекрывается с форматами BPB, начиная с DOS 3.2, или кодом загрузочного сектора, совместимым с x86, совместимых с загрузочными секторами IBM PC, и приведет к сбою на машине MSX, если не были приняты специальные меры предосторожности, например, не зацикливание ЦП здесь (opstring 0x18 0xFE для JR 0x01E ). |
0x020 | 6 | Подпись тома MSX-DOS 2 " VOL_ID ". |
0x026 | 1 | Флаг восстановления MSX-DOS 2 (по умолчанию: 0x00 . Если сигнатура " " присутствует в смещении сектора 0x020 , этот флаг указывает, содержит ли том удаленные файлы, которые можно восстановить (см. смещение 0x0C в записях каталога).VOL_ID |
0x027 | 4 | Серийный номер диска MSX-DOS 2 (по умолчанию: 0x00000000 ). Если сигнатура " " присутствует в смещении сектора 0x020 , MSX-DOS 2 сохраняет здесь серийный номер тома для обнаружения смены носителя.VOL_ID |
0x02B | 5 | сдержанный |
0x030 | варьируется (2) | Точка входа кода MSX-DOS 2 для процессоров Z80 в загрузочный код MSX. Это то место, куда машины MSX-DOS 2 переходят при передаче управления загрузочному сектору. Это место перекрывается с форматами EBPB, начиная с DOS 4.0 / OS/2 1.2 или кодом загрузочного сектора, совместимым с x86, загрузочных секторов, совместимых с IBM PC, и приведет к сбою на машине MSX, если не были приняты специальные меры предосторожности, такие как захват ЦП в тесном цикле здесь (opstring 0x18 0xFE для JR 0x030 ). |
0x1FE | 2 | Подпись |
Смещение сектора | Смещение BPB | Длина (байты) | Содержание |
---|---|---|---|
0x00B | 0x00 | 2 | Байт на логический сектор; наиболее распространенное значение — 512. Некоторые операционные системы не поддерживают другие размеры секторов. Для простоты и максимальной производительности размер логического сектора часто совпадает с размером физического сектора диска, но может быть больше или меньше в некоторых сценариях. Минимально допустимое значение для незагружаемых томов FAT12/FAT16 с логическими секторами до 65 535 составляет 32 байта, или 64 байта для более чем 65 535 логических секторов. Минимальное практическое значение составляет 128. Некоторые OEM-версии DOS до DOS 3.31 использовали логические размеры секторов до 8192 байт для логических секторных FAT . Atari ST GEMDOS поддерживает логические размеры секторов от 512 до 4096. [17] DR-DOS поддерживает загрузку с томов FAT12/FAT16 с логическими размерами секторов до 32 КБ и реализации INT 13h, поддерживающие физические секторы до 1024 байт/сектор. [nb 4] Минимальный логический размер сектора для стандартных томов FAT32 составляет 512 байт, который можно уменьшить до 128 байт без поддержки сектора информации FS. Дисководы и контроллеры гибких дисков используют физические размеры секторов 128, 256, 512 и 1024 байта (например, PC/AX). Atari Portfolio поддерживает размер сектора 512 для томов размером более 64 КБ, 256 байт для томов размером более 32 КБ и 128 байт для меньших томов. Магнитооптические приводы использовали размеры секторов 512, 1024 и 2048 байт. В 2005 году некоторые жесткие диски Seagate использовали размеры секторов 1024 байта вместо стандартных 512 байт. [18] Жесткие диски Advanced Format используют 4096 байт на сектор ( 4Kn ) с 2010 года, но также смогут эмулировать 512-байтовые секторы ( 512e ) в течение переходного периода. Linux и, соответственно, Android поддерживают гораздо больший размер логического сектора, официально задокументированный на странице Man для утилит файловой системы, как размер до 32 КБ. |
0x00D | 0x02 | 1 | Логических секторов на кластер. Допустимые значения: 1, 2, 4, 8, 16, 32, 64 и 128. Некоторые версии MS-DOS 3.x поддерживали максимальный размер кластера только 4 КБ, тогда как современные MS-DOS/PC DOS и Windows 95 поддерживают максимальный размер кластера 32 КБ. Windows 98/SE/ME также частично поддерживают размер кластера 64 КБ, но некоторые службы FCB недоступны на таких дисках, и различные приложения не работают. Семейство Windows NT и некоторые альтернативные версии DOS, такие как PTS-DOS, полностью поддерживают кластеры 64 КБ. Для большинства операционных систем на базе DOS максимальный размер кластера остается равным 32 КБ (или 64 КБ) даже для размеров сектора более 512 байт. Для логических секторов размером 1 КБ, 2 КБ и 4 КБ Windows NT 4.0 поддерживает размер кластера 128 КБ, тогда как для секторов размером 2 КБ и 4 КБ размер кластера может достигать 256 КБ. Некоторые версии DR-DOS обеспечивают ограниченную поддержку кластеров размером 128 КБ с 512 байтами на сектор, используя значение сектора/кластера, равное 0. MS-DOS/PC DOS зависнет при запуске, если это значение ошибочно указано как 0. [19] : INT 21h AX=53h |
0x00E | 0x03 | 2 | Количество зарезервированных логических секторов. Количество логических секторов перед первым FAT в образе файловой системы. Не менее 1 для этого сектора, обычно 32 для FAT32 (для хранения расширенного загрузочного сектора, сектора информации о ФС и резервных загрузочных секторов). Поскольку тома, отформатированные в DR-DOS 7.0x FAT32, используют загрузочный сектор с одним сектором, сектор информации о ФС и резервный сектор, некоторые тома, отформатированные в DR-DOS, используют здесь значение 4. |
0x010 | 0x05 | 1 | Количество таблиц размещения файлов. Почти всегда 2; RAM-диски могут использовать 1. Большинство версий MS-DOS/PC DOS не поддерживают более 2 FAT. Некоторые операционные системы DOS поддерживают только две FAT в своем встроенном драйвере диска, но поддерживают другие числа FAT для драйверов блочных устройств, загруженных позже. Тома, объявляющие 2 FAT в этой записи, никогда не будут рассматриваться как тома TFAT . Если значение отличается от 2, некоторые операционные системы Microsoft могут попытаться смонтировать том как том TFAT и использовать второй кластер (кластер 1) первого FAT для определения статуса TFAT. |
0x011 | 0x06 | 2 | Максимальное количество записей корневого каталога FAT12 или FAT16. 0 для FAT32, где корневой каталог хранится в обычных кластерах данных; см. смещение 0x02C в FAT32 EBPB. Значение 0 без FAT32 EBPB (без сигнатуры 0x29 или 0x28 по смещению 0x042 ) может также указывать на корневой каталог переменного размера в некоторых нестандартных реализациях FAT12 и FAT16, которые хранят начальный кластер корневого каталога в записи кластера 1 в FAT. [20] Однако это расширение не поддерживается основными операционными системами, [20] поскольку оно может конфликтовать с другими использованиями записи кластера 1 для флагов обслуживания, текущего маркера конца цепочки или расширений TFAT . Это значение должно быть скорректировано так, чтобы записи каталога всегда занимали полные логические сектора, учитывая, что каждая запись каталога занимает 32 байта. MS-DOS/PC DOS требуют, чтобы это значение было кратно 16. Максимальное значение, поддерживаемое на гибких дисках, составляет 240, [6] максимальное значение, поддерживаемое MS-DOS/PC DOS на жестких дисках, составляет 512. [6] DR-DOS поддерживает загрузку с томов FAT12/FAT16, если загрузочный файл находится в первых 2048 записях корневого каталога. |
0x013 | 0x08 | 2 | Всего логических секторов. 0 для FAT32. (Если ноль, использовать 4-байтовое значение по смещению 0x020 ) |
0x015 | 0x0A | 1 | Дескриптор носителя (сравните: FAT ID): [21] [22] [23] [nb 1]
Это значение должно отражать дескриптор носителя, хранящийся (в записи для кластера 0) в первом байте каждой копии FAT. Некоторые операционные системы до DOS 3.2 ( 86-DOS , MS-DOS / PC DOS 1.x и MSX-DOS версии 1.0) полностью игнорируют параметры загрузочного сектора и используют значение дескриптора носителя из первого байта FAT для выбора среди внутренне предопределенных шаблонов параметров. Должно быть больше или равно 0xF0 , начиная с DOS 4.0. [6] На съемных дисках DR-DOS предполагает наличие BPB, если это значение больше или равно 0xF0 , [6] тогда как для фиксированных дисков оно должно быть равно 0xF8 , чтобы предположить наличие BPB. Первоначально эти значения предназначались для использования в качестве битовых флагов; для любого сменного носителя без распознаваемого формата BPB и дескриптора носителя 0xF8 или 0xFA до 0xFF MS-DOS/PC DOS обрабатывает бит 1 как флаг для выбора формата с 9 секторами на дорожку, а не с 8 секторами, а бит 0 — как флаг для указания двухстороннего носителя. [7] Значения с 0x00 по 0xEF и с 0xF1 по 0xF7 зарезервированы и не должны использоваться. |
0x016 | 0x0B | 2 | Логические сектора на таблицу размещения файлов для FAT12/FAT16. FAT32 устанавливает это значение на 0 и использует вместо него 32-битное значение со смещением 0x024 . |
DOS 3.0 БПБ:
Следующие расширения были задокументированы со времен DOS 3.0, однако они уже поддерживались некоторыми выпусками DOS 2.11. [28] MS-DOS 3.10 по-прежнему поддерживала формат DOS 2.0, но могла использовать и формат DOS 3.0.
Смещение сектора | Смещение BPB | Длина (байты) | Содержание |
---|---|---|---|
0x00B | 0x00 | 13 | DOS 2.0 БПБ |
0x018 | 0x0D | 2 | Физические секторы на дорожку для дисков с геометрией INT 13h CHS [4] , например, 15 для дискеты «1,20 МБ» (1200 КБ). Нулевая запись указывает на то, что эта запись зарезервирована, но не используется. |
0x01A | 0x0F | 2 | Количество головок для дисков с геометрией INT 13h CHS, [4] например, 2 для двухсторонней дискеты. Ошибка во всех версиях MS-DOS/PC DOS вплоть до 7.10 приводит к сбою этих операционных систем при использовании геометрии CHS с 256 головками, поэтому почти все BIOS выбирают максимум 255 головок. Нулевая запись указывает на то, что эта запись зарезервирована, но не используется. |
0x01С | 0x11 | 2 | Количество скрытых секторов, предшествующих разделу, содержащему этот том FAT. Это поле всегда должно быть равно нулю на носителях, которые не разбиты на разделы. Эта запись DOS 3.0 несовместима с аналогичной записью по смещению 0x01C в BPB, начиная с DOS 3.31. Его нельзя использовать, если запись логического сектора по смещению 0x013 равна нулю. |
DOS 3.2 БПБ:
Официально MS-DOS 3.20 по-прежнему использовала формат DOS 3.0, но SYS
была FORMAT
адаптирована для поддержки уже на 6 байт длиннее формата (из которого не все записи были использованы).
Смещение сектора | Смещение BPB | Длина (байты) | Содержание |
---|---|---|---|
0x00B | 0x00 | 19 | DOS 3.0 БПБ |
0x01E | 0x13 | 2 | Всего логических секторов, включая скрытые. Эта запись DOS 3.2 несовместима с аналогичной записью по смещению 0x020 в BPB, начиная с DOS 3.31. Его нельзя использовать, если запись логического сектора по смещению 0x013 равна нулю. |
ДОС 3.31 БПБ:
Официально представленный в DOS 3.31 и не используемый в DOS 3.2, некоторые утилиты DOS 3.2 были разработаны так, чтобы знать об этом новом формате. Официальная документация рекомендует доверять этим значениям только в том случае, если запись логических секторов по смещению 0x013 равна нулю.
Смещение сектора | Смещение BPB | Длина (байты) | Содержание |
---|---|---|---|
0x00B | 0x00 | 13 | DOS 2.0 БПБ |
0x018 | 0x0D | 2 | Физические секторы на дорожку для дисков с геометрией INT 13h CHS, [4] например, 18 для дискеты "1,44 МБ" (1440 КБ). Не используется для приводов, которые больше не поддерживают доступ CHS. Идентично записи, доступной с DOS 3.0. Нулевая запись указывает на то, что эта запись зарезервирована, но не используется. Значение 0 может указывать на доступ только LBA, но может вызвать исключение деления на ноль в некоторых загрузчиках, которого можно избежать, сохранив здесь нейтральное значение 1, если никакая геометрия CHS не может быть разумно эмулирована. |
0x01A | 0x0F | 2 | Количество головок для дисков с геометрией INT 13h CHS, [4] например, 2 для двухсторонней дискеты. Не используется для приводов, которые больше не поддерживают доступ CHS. Идентично записи, доступной с DOS 3.0. Ошибка во всех версиях MS-DOS/PC DOS вплоть до 7.10 приводит к сбою этих операционных систем при использовании геометрии CHS с 256 головками, поэтому почти все BIOS выбирают максимум 255 головок. Нулевая запись указывает на то, что эта запись зарезервирована, но не используется. Значение 0 может указывать на доступ только LBA, но может вызвать исключение деления на ноль в некоторых загрузчиках, которого можно избежать, сохранив здесь нейтральное значение 1, если никакая геометрия CHS не может быть разумно эмулирована. |
0x01С | 0x11 | 4 | Количество скрытых секторов, предшествующих разделу, содержащему этот том FAT. Это поле всегда должно быть равно нулю на носителях, которые не разбиты на разделы. [24] [25] [26] Эта запись DOS 3.31 несовместима с аналогичной записью по смещению 0x01C в DOS 3.0-3.3 BPB. По крайней мере, ей можно доверять, если она содержит ноль или если запись логических секторов по смещению 0x013 равна нулю. Если он принадлежит расширенному активному разделу (AAP), выбранному во время загрузки, запись BPB будет динамически обновляться расширенной MBR для отражения значения «относительных секторов» в таблице разделов, хранящейся по смещению 0x1B6 в AAP или NEWLDR MBR, чтобы стало возможным загружать операционную систему с EBR . (Некоторые загрузчики GPT (например, BootDuet ) используют смещения загрузочного сектора 0x1FA–0x1FD для хранения старших 4 байтов 64-битного значения скрытых секторов для томов, расположенных за пределами первых 2 32 −1 секторов.) |
0x020 | 0x15 | 4 | Всего логических секторов (если больше 65535; в противном случае см. смещение 0x013 ). Эта запись DOS 3.31 несовместима с аналогичной записью по смещению 0x01E в DOS 3.2-3.3 BPB. Официально ее следует использовать только в том случае, если запись логических секторов по смещению 0x013 равна нулю, но некоторые операционные системы (некоторые старые версии DR DOS) используют эту запись также для меньших дисков. Для разделенных носителей, если эта запись и запись по адресу 0x013 равны 0 (как это видно на некоторых томах DOS 3.x FAT16), многие операционные системы (включая MS-DOS/PC DOS) вместо этого извлекут значение из соответствующей записи раздела (по смещению 0xC ) в MBR . Если обе эти записи равны 0 на томах, использующих FAT32 EBPB с сигнатурой 0x29 , значения, превышающие предел 4 294 967 295 (2 32 −1) (например, некоторые тома DR-DOS с 32-битными кластерными записями), могут использовать вместо этого 64-битную запись со смещением 0x052 . |
Простая формула переводит заданный номер кластера тома CN
в логический номер сектора LSN
: [24] [25] [26]
SSA=RSC+FN×SF+ceil((32×RDE)/SS)
RSC
FN
SF
RDE
SS
ceil(x)
LSN=SSA+(CN−2)×SC
SC
На неразделенных носителях число скрытых секторов тома равно нулю, и поэтому LSN
и LBA
адреса становятся одинаковыми до тех пор, пока логический размер сектора тома идентичен физическому размеру сектора базового носителя. При этих условиях также просто выполнять преобразование между CHS
адресами и LSNs
также:
LSN=SPT×(HN+(NOS×TN))+SN−1
, где секторы на дорожку SPT
хранятся по смещению 0x018 , а количество сторон по смещению 0x01A . Номер дорожки , номер головки и номер сектора соответствуют цилиндру-головке-сектору : формула дает известное преобразование CHS в LBA .NOS
TN
HN
SN
Дальнейшая структура, используемая FAT12 и FAT16, начиная с OS/2 1.0 и DOS 4.0, также известная как расширенный блок параметров BIOS (EBPB) (байты ниже смещения сектора 0x024 такие же, как для DOS 3.31 BPB):
Смещение сектора | смещение EBPB | Длина (байты) | Содержание |
---|---|---|---|
0x00B | 0x00 | 25 | ДОС 3.31 БПБ |
0x024 | 0x19 | 1 | Номер физического диска ( 0x00 для (первого) съемного носителя, 0x80 для (первого) фиксированного диска согласно INT 13h ). Допустимые значения для возможных физических дисков в зависимости от BIOS: 0x00 - 0x7E и 0x80 - 0xFE . Значения 0x7F и 0xFF зарезервированы для внутренних целей, таких как удаленная загрузка или загрузка ROM, и никогда не должны встречаться на диске. Некоторые загрузчики, такие как загрузчик MS-DOS/PC DOS, используют это значение при загрузке операционной системы, другие вообще игнорируют его или используют номер диска, предоставленный в регистре DL базовым загрузчиком (например, со многими BIOS и MBR). Запись иногда изменяется командой SYS или может быть динамически исправлена предыдущим загрузчиком начальной загрузки, чтобы заставить код загрузочного сектора загрузить операционную систему с физических дисков, отличных от используемых по умолчанию. Подобная запись существовала (только) в загрузочных секторах DOS 3.2 - 3.31 по смещению сектора 0x1FD . Если это относится к загрузочному тому, улучшенный MBR DR-DOS 7.07 может быть настроен (см. NEWLDR offset 0x014 ) для динамического обновления этой записи EBPB до значения DL, предоставленного во время загрузки, или значения, сохраненного в таблице разделов. Это позволяет загружать альтернативные диски, даже если код VBR игнорирует значение DL. |
0x025 | 0x1A | 1 | Сдержанный;
|
0x026 | 0x1Б | 1 | Расширенная загрузочная подпись. (Должна быть 0x29 [24] [25] [26] [21], чтобы указать, что существует EBPB со следующими 3 записями (начиная с OS/2 1.2 и DOS 4.0). Может быть 0x28 на некоторых дисках OS/2 1.0-1.1 и PC DOS 3.4, указывая на более раннюю форму формата EBPB, за которой следует только серийный номер. MS-DOS/PC DOS 4.0 и выше, OS/2 1.2 и выше, а также семейство Windows NT распознают обе подписи соответственно.) |
0x027 | 0x1С | 4 | Идентификатор тома (серийный номер) Обычно серийный номер "xxxx-xxxx" создается путем 16-битного сложения обоих значений DX, возвращаемых INT 21h/AH=2Ah (получить системную дату) [nb 5] и INT 21h/AH=2Ch (получить системное время) [nb 5] для старшего слова и еще одного 16-битного сложения обоих значений CX для младшего слова серийного номера. В качестве альтернативы некоторые дисковые утилиты DR-DOS предоставляют |
0x02B | 0x20 | 11 | Метка тома раздела, дополненная пробелами ( 0x20 ), например, " " Программное обеспечение, изменяющее метку тома каталога в файловой системе, также должно обновлять эту запись, но не все программы это делают. Метка тома раздела обычно отображается в инструментах разбиения на разделы, поскольку она доступна без монтирования тома. Поддерживается с OS/2 1.2 и MS-DOS 4.0 и выше.NO␠NAME␠␠␠␠ Недоступно, если сигнатура по адресу 0x026 установлена на 0x28 . Эта область использовалась загрузочными секторами DOS 3.2–3.3 для хранения частной копии таблицы параметров диска (DPT) вместо использования указателя INT 1Eh для извлечения таблицы ПЗУ, как в более поздних выпусках загрузочного сектора. Повторное использование этого местоположения для в основном косметической метки тома раздела минимизировало проблемы, если некоторые старые системные утилиты все еще пытались исправить прежний DPT. |
0x036 | 0x2Б | 8 | Тип файловой системы, дополненный пробелами ( 0x20 ), например, " ", " ", " "FAT12␠␠␠ FAT16␠␠␠ FAT␠␠␠␠␠ Эта запись предназначена только для отображения и не должна использоваться операционной системой для определения типа файловой системы. Тем не менее, она иногда используется для идентификации сторонним программным обеспечением, поэтому значения не должны отличаться от официально используемых. Поддерживается с OS/2 1.2 и MS-DOS 4.0 и выше. Недоступно, если сигнатура по адресу 0x026 установлена на 0x28 . |
По сути, FAT32 вставляет 28 байт в EBPB, за которыми следуют оставшиеся 26 (или иногда только 7) байт EBPB, как показано выше для FAT12 и FAT16. Операционные системы Microsoft и IBM определяют тип файловой системы FAT, используемой на томе, исключительно по количеству кластеров, а не по используемому формату BPB или указанному типу файловой системы, то есть технически возможно использовать "FAT32 EBPB" также для томов FAT12 и FAT16, а также DOS 4.0 EBPB для небольших томов FAT32. Поскольку было обнаружено, что такие тома создаются операционными системами Windows при некоторых странных условиях, [nb 6] операционные системы должны быть готовы справиться с этими гибридными формами.
Смещение сектора | Смещение FAT32 EBPB | Длина (байты) | Содержание |
---|---|---|---|
0x00B | 0x00 | 25 | ДОС 3.31 БПБ |
0x024 | 0x19 | 4 | Логические сектора в таблице размещения файлов (соответствует старой записи по смещению 0x0B в DOS 2.0 BPB). Байт со смещением 0x026 в этой записи никогда не должен становиться 0x28 или 0x29 , чтобы избежать неправильной интерпретации формата EBPB в операционных системах, не поддерживающих FAT32. К счастью, при нормальных обстоятельствах (размер сектора 512 байт) этого произойти не может, так как файловая система FAT32 имеет не более 0xffffff6 = 268435446 кластеров. Один сектор Fat вмещает 512 / 4 = 128 дескрипторов кластера. Таким образом, потребуется не более ceil(268435446 / 128) = 2097152 = 0x200000 секторов, что делает третий байт числа секторов FAT не более 0x20, что меньше запрещенных значений 0x28 и 0x29. |
0x028 | 0x1D | 2 | Описание диска / флаги зеркалирования (биты 3-0: отсчитываемый от нуля номер активной FAT, если установлен бит 7. [4] Если бит 7 очищен, все FAT зеркалируются как обычно. Другие биты зарезервированы и должны быть равны 0.) Загрузочные секторы DR-DOS 7.07 FAT32 с двойной поддержкой LBA и CHS используют биты 15-8 для хранения флага доступа и части сообщения. Эти биты содержат либо битовую комбинацию 0110:1111b (строчная буква 'o', бит 13 установлен для доступа CHS), либо 0100:1111b (заглавная буква 'O', бит 13 очищен для доступа LBA). Байт также используется для второго символа в потенциальном сообщении об ошибке "No␠IBMBIO␠␠COM" (см. смещение 0x034 ), отображаемом либо в смешанном, либо в верхнем регистре, тем самым указывая, какой тип доступа не удался). Инструменты форматирования или инструменты не-DR SYS-типа могут очистить эти биты, но другие дисковые инструменты должны оставить биты 15-8 без изменений. |
0x02A | 0x1F | 2 | Версия (определяется как 0.0). Старший байт номера версии хранится по смещению 0x02B , а младший байт — по смещению 0x02A . [4] Реализации FAT32 должны отказываться монтировать тома с неизвестными им номерами версий. |
0x02C | 0x21 | 4 | Номер кластера начала корневого каталога, обычно 2 (первый кластер [33] ), если он не содержит плохих секторов. (Реализация FAT32 от Microsoft накладывает искусственное ограничение в 65 535 записей на каталог, в то время как многие сторонние реализации этого не делают.) Значение кластера 0 официально не допускается и никогда не может указывать на допустимый начальный кластер корневого каталога. Некоторые нестандартные реализации FAT32 могут рассматривать его как индикатор для поиска корневого каталога фиксированного размера, где он ожидался бы на томах FAT16; см. смещение 0x011 . |
0x030 | 0x25 | 2 | Логический номер сектора информации файловой системы, обычно 1, т. е. второй из трех загрузочных секторов FAT32. Некоторые реализации FAT32 поддерживают небольшое изменение спецификации Microsoft, делая сектор информации FS необязательным, указывая значение 0xFFFF [19] (или 0x0000 ) в этой записи. Поскольку логический сектор 0 никогда не может быть допустимым сектором информации FS, но секторы информации FS используют ту же сигнатуру, что и во многих загрузочных секторах [ требуется ссылка ] , реализации файловой системы никогда не должны пытаться использовать логический сектор 0 в качестве сектора информации FS и вместо этого предполагать, что эта функция не поддерживается на этом конкретном томе. Без сектора информации FS минимально допустимый размер логического сектора томов FAT32 может быть уменьшен до 128 байт для специальных целей. |
0x032 | 0x27 | 2 | Первый логический номер сектора копии трех загрузочных секторов FAT32, обычно 6. [4] Поскольку тома, отформатированные в DR-DOS 7.0x FAT32, используют загрузочный сектор из одного сектора, некоторые тома, отформатированные в DR-DOS, используют здесь значение 2. Значения 0x0000 [4] (и/или 0xFFFF [19] ) зарезервированы и указывают на отсутствие доступного резервного сектора. |
0x034 | 0x29 | 12 | Зарезервировано (может быть изменено на байт-заполнитель формата 0xF6 [nb 7] как артефакт MS-DOS , должно быть инициализировано в 0 инструментами форматирования, но не должно быть изменено реализациями файловой системы или дисковыми инструментами в дальнейшем.)FDISK Загрузочные секторы DR-DOS 7.07 FAT32 используют эти 12 байт для хранения имени файла " " |
0x040 | 0x35 | 1 | См. 0x024 для FAT12/FAT16 (номер физического диска) exFAT BPB расположены в секторе смещения от 0x040 до 0x077 , перекрывая все оставшиеся записи стандартного FAT32 EBPB, включая эту. Их можно обнаружить по сигнатуре метки OEM " " в секторе смещения 0x003 . В этом случае байты от 0x00B до 0x03F обычно устанавливаются в 0x00 . |
0x041 | 0x36 | 1 | См. 0x025 для FAT12/FAT16 (Используется для различных целей; см. FAT12/FAT16) Может содержать артефакты байта-заполнителя формата 0xF6 [nb 7] после разбиения на разделы с помощью MS-DOS FDISK, но еще не отформатирован. |
0x042 | 0x37 | 1 | См. 0x026 для FAT12/FAT16 (Расширенная загрузочная подпись, 0x29 ) Большинство реализаций файловой системы FAT32 не поддерживают альтернативную сигнатуру 0x28 [15] для обозначения сокращенной формы FAT32 EBPB, за которой следует только серийный номер (и без записей метки тома и типа файловой системы), но поскольку эти 19 в основном неиспользуемых байтов могут служить различным целям в некоторых сценариях, реализации должны принимать 0x28 в качестве альтернативной сигнатуры, а затем возвращаться к использованию метки тома каталога в файловой системе вместо EBPB для совместимости с потенциальными расширениями. |
0x043 | 0x38 | 4 | См. 0x027 для FAT12/FAT16 (идентификатор тома) |
0x047 | 0x3C | 11 | См. 0x02B для FAT12/FAT16 (метка тома) Недоступно, если сигнатура по смещению 0x042 установлена на 0x28 . |
0x052 | 0x47 | 8 | См. 0x036 для FAT12/FAT16 (тип файловой системы, дополненный пробелами ( 0x20 ), например, " ").FAT32␠␠␠ Недоступно, если сигнатура по адресу 0x042 установлена на 0x28 . Если обе записи общего числа логических секторов по смещению 0x020 и 0x013 равны 0 на томах, использующих FAT32 EBPB с сигнатурой 0x29 , тома с более чем 4 294 967 295 (2 32 -1) секторами (например, некоторые тома DR-DOS с 32-битными кластерными записями) могут использовать эту запись как запись общего числа логических секторов 64 бит вместо этого. В этом случае метка OEM по смещению сектора 0x003 может быть извлечена как новый тип файловой системы . |
Версии DOS до 3.2 полностью или частично полагались на байт дескриптора носителя в BPB или байт FAT ID в кластере 0 первой FAT для определения форматов дискет FAT12, даже если присутствует BPB. В зависимости от найденного FAT ID и обнаруженного типа привода они по умолчанию используют один из следующих прототипов BPB вместо использования значений, фактически сохраненных в BPB. [nb 1]
Первоначально FAT ID должен был быть битовым флагом со всеми установленными битами, за исключением очищенного бита 2 для указания формата 80 дорожек (вместо 40 дорожек), очищенного бита 1 для указания формата 9 секторов (вместо 8 секторов) и очищенного бита 0 для указания одностороннего формата (вместо двухстороннего) [7], но эта схема не была принята всеми OEM-производителями и устарела с появлением жестких дисков и форматов высокой плотности. Кроме того, различные 8-дюймовые форматы, поддерживаемые 86-DOS и MS-DOS, не соответствуют этой схеме.
FAT ID (сравните с идентификатором носителя по смещению BPB 0x0A ) [22] [23] | 0xFF | 0xFE | 0xФД | 0xFC | 0xФБ | 0xFA | 0xF9 | 0xF8 | 0xF0 | 0xED | 0xE5 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Размер | 8" | 5,25" | 8" | 8" | 5,25" | 8" | 8" | 5,25" | 5,25" | 5,25" / 3,5" | 5,25" / 3,5" | 5,25" | 3,5" | 3,5" | 5,25" | 5,25" / 3,5" | 3,5" | 3,5" | 3,5" | 5,25" | 8" |
Плотность | ? | ДД 48т/д | СД | ДД | ДД 48т/д | СД | СД | ДД 48т/д | ДД 48т/д | ? | ? | HD 96 точек на дюйм | ДД 135т/д | HD 135 точек на дюйм | QD 96tpi | ? | ДД | HD 135 точек на дюйм | ЭД | QD 96tpi | СД |
Модуляция | ? | МФМ | ФМ | МФМ | МФМ | ФМ | ФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | МФМ | ФМ |
Форматированная емкость (КБ) | ? | 320 | 250 ("старый") [28] [32] | 1200 | 160 | 250 («новый») [28] [32] | 500 | 360 | 180 | 640 | 320 | 1200 | 720 | 1440 | 720 | 360 | 360 | 1440 | 2880 | 720 | 243 / 250 |
Цилиндры (CHS) | 77 | 40 | 77 | 77 | 40 | 77 | 77 | 40 | 40 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 77 |
Физические сектора/дорожки (смещение BPB 0x0D ) | ? | 8 | 26 | 8 | 8 | 26 | 26 | 9 | 9 | 8 | 8 | 15 | 9 | 18 | 9 (8 [31] ) | 9 | 9 | 18 | 36 | 9 (8 [31] ) | 26 |
Количество головок (смещение BPB 0x0F ) | ? | 2 | 1 [28] [32] | 2 [7] [22] [32] (1) | 1 | 1 [7] [28] [32] | 2 [22] | 2 | 1 | 2 | 1 | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 2 | 1 |
Полезная нагрузка байта/физический сектор | ? | 512 | 128 | 1024 | 512 | 128 | 128 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 128 |
Байты / логический сектор (смещение BPB 0x00 ) | ? | 512 | 128 | 1024 | 512 | 128 | 128 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 128 |
Логические сектора/кластер (смещение BPB 0x02 ) | ? | 2 | 4 | 1 | 1 | 4 | 4 | 2 | 1 | 2 | 1 [22] (2? [7] ) | 1 | 2 | 1 | ? | 2 | ? | 1 | 2 | ? | 4 |
Зарезервированные логические сектора (смещение BPB 0x03 ) | ? | 1 | 1 [28] [32] | 1 | 1 | 4 [28] [32] | 4 | 1 | 1 | 1 | 1 | 1 | 1 (2) | 1 | 1 | 1 | 1 | 1 | 1 | ? | 1 |
Количество FAT (смещение BPB 0x05 ) | ? | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
Записи корневого каталога (смещение BPB 0x06 ) | ? | 112 (7 секторов) | 68 (17 секторов) | 192 (6 секторов) | 64 (4 сектора) | 68 (17 секторов) | 68 (17 секторов) | 112 (7 секторов) | 64 (4 сектора) | 112 (7 секторов) | 112 (7 секторов) | 224 (14 секторов) | 112 (7 секторов) | 224 (14 секторов) | ? | 112 (7 секторов) | ? | 224 (14 секторов) | 240 (15 секторов) | ? | 64 (16 секторов) |
Всего логических секторов (смещение BPB 0x08 ) | ? | 640 | 2002 [28] [32] | 1232 [22] [32] (616 [7] ) | 320 | 2002 [7] [28] [32] | 4004 [22] | 720 | 360 | 1280 | 640 | 2400 | 1440 | 2880 | ? | 720 | ? | 2880 | 5760 | ? | 2002 |
Логические сектора / FAT (смещение BPB 0x0B ) | ? | 1 | 6 [28] [32] | 2 | 1 | 6 [28] [32] | 6? [22] | 2 | 2 | 2 | 2 [22] (1? [7] ) | 7 | 3 | 9 (7) | ? | 2 | ? | 9 | 9 | ? | 1 |
Скрытые сектора (смещение BPB 0x11 ) | ? | 0 | 3 [22] (0 [7] ) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ? | 0 |
Общее количество кластеров | ? | 315 | 497 | 1227 | 313 | ? | 997? [22] | 354 | 351 | ? | ? | 2371 | 713 | 2847? | ? | ? | ? | 2847 | 2863 | ? | ? |
Логический порядок секторов | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
Картографирование секторов | ? | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ трек+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ трек+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | ? | сектор+ трек+ | сектор+ трек+ | сектор+ головка+ дорожка+ | сектор+ головка+ дорожка+ | ? | сектор+ трек+ |
Первый физический сектор (CHS) | ? | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ? | ? | 1 | 1 | 1 | ? | 1 | ? | 1 | 1 | ? | 1 |
DRIVER.SYS /F:n | ? | 0 | 3 | 4 | 0 | ? | 3 | 0 | 0 | ? | ? | 1 | 2 | 7 | ? | ? | ? | 7 | 9 | ? | 3 |
Присутствие БПБ | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | Да | Да | Да | ? | ? | ? | Да | Да | ? | ? |
Поддерживать | ? | ДОС 1.1 [32] | ДОС 1.0 [28] [32] | ДОС 2.0 | ДОС 1.0 [32] | ? [28] [32] | ДОС 2.0 | ДОС 2.0 | ДОС 2.0 | ? | ? | ДОС 3.0 | ДОС 3.2 | только DOS 3.2; (DR-DOS) | Sanyo 55x только DS-DOS 2.11 | MS-DOS 3.1 [7] | MSX-DOS | ДОС 3.3 | ДОС 5.0 | только Тэнди 2000 | Только DR-DOS |
Microsoft рекомендует различать два 8-дюймовых формата для FAT ID 0xFE , пытаясь прочитать адресную метку одинарной плотности. Если это приводит к ошибке, носитель должен быть двойной плотности. [23]
В таблице не перечислен ряд несовместимых форматов 8-дюймовых и 5,25-дюймовых дискет FAT12, поддерживаемых 86-DOS , которые различаются либо размером записей каталога (16 байт против 32 байт), либо размером зарезервированной области секторов (несколько целых дорожек против одного логического сектора).
Реализация одностороннего формата FAT12 размером 315 КБ, используемого в MS-DOS для Apricot PC и F1e [34], имела другую структуру загрузочного сектора, чтобы соответствовать несовместимому с IBM BIOS этого компьютера. Инструкция перехода и имя OEM были опущены, а параметры MS-DOS BPB (смещения 0x00B - 0x017 в стандартном загрузочном секторе) были расположены по смещению 0x050 . Portable , F1, PC duo и Xi FD вместо этого поддерживали нестандартный двухсторонний формат FAT12 размером 720 КБ. [34] Различия в структуре загрузочного сектора и идентификаторах носителей сделали эти форматы несовместимыми со многими другими операционными системами. Параметры геометрии для этих форматов следующие:
Более поздние версии Apricot MS-DOS получили возможность читать и записывать диски со стандартным загрузочным сектором в дополнение к тем, что имели Apricot. Эти форматы также поддерживались DOS Plus 2.1e/g для серии Apricot ACT.
Адаптация DOS Plus для BBC Master 512 поддерживала два формата FAT12 на 80-дорожечных, двухсторонних, 5,25-дюймовых дисках с двойной плотностью, которые вообще не использовали обычные загрузочные секторы. Диски данных объемом 800 КБ не имели загрузочного сектора и начинались с одной копии FAT. [35] Первый байт перемещенного FAT в логическом секторе 0 использовался для определения емкости диска. Загрузочные диски объемом 640 КБ начинались с миниатюрной файловой системы ADFS , содержащей загрузчик, за которым следовал один FAT. [35] [36] Кроме того, формат объемом 640 КБ отличался использованием физических номеров секторов CHS, начинающихся с 0 (а не с 1, как обычно), и увеличением секторов в порядке сектор-дорожка-головка (а не сектор-головка-дорожка, как обычно). [36] FAT начиналась в начале следующей дорожки. Эти различия делают эти форматы нераспознаваемыми другими операционными системами. Параметры геометрии для этих форматов являются:
DOS Plus для Master 512 также могла получать доступ к стандартным дискам ПК, отформатированным до 180 КБ или 360 КБ , используя первый байт FAT в логическом секторе 1 для определения емкости.
DEC Rainbow 100 (все варианты) поддерживал один формат FAT12 на 80-дорожечных, односторонних, 5,25-дюймовых дисках с четверной плотностью. Первые две дорожки были зарезервированы для загрузчика, но не содержали MBR или BPB (вместо этого MS-DOS использовала статический BPB в памяти). Загрузочный сектор (дорожка 0, сторона 0, сектор 1) был кодом Z80, начинающимся с DI 0xF3 . Начальная загрузка 8088 была загружена Z80. Дорожка 1, сторона 0, сектор 2 начинается с байта идентификатора носителя/FAT 0xFA . Неотформатированные диски используют вместо этого 0xE5 . Файловая система начинается с дорожки 2, стороны 0, сектора 1. В корневом каталоге есть 2 копии FAT и 96 записей. Кроме того, существует физическое-логическое отображение дорожек для осуществления чередования секторов 2:1. Диски были отформатированы с физическими секторами в порядке нумерации от 1 до 10 на каждой дорожке после зарезервированных дорожек, но логические сектора от 1 до 10 хранились в физических секторах 1, 6, 2, 7, 3, 8, 4, 9, 5, 10. [37]
«Информационный сектор FS» был введен в FAT32 [38] для ускорения времени доступа к некоторым операциям (в частности, получения объема свободного места). Он расположен в логическом секторе, номер которого указан в загрузочной записи FAT32 EBPB в позиции 0x030 (обычно логический сектор 1, сразу после самой загрузочной записи).
Смещение байта | Длина (байты) | Содержание |
---|---|---|
0x000 | 4 | Сигнатура сектора информации FS ( 0x52 0x52 0x61 0x41 = " ")RRaA Пока сектор информации о файловой системе находится в логическом секторе 1, месте, где FAT обычно начинается в файловых системах FAT12 и FAT16 (только с одним зарезервированным сектором), наличие этой сигнатуры гарантирует, что ранние версии DOS никогда не попытаются смонтировать том FAT32, поскольку они ожидают, что значения в кластере 0 и кластере 1 будут соответствовать определенным битовым шаблонам, которым эта сигнатура не соответствует. |
0x004 | 480 | Зарезервировано (значения байтов должны быть установлены на 0x00 во время форматирования, но на них не следует полагаться и они никогда не должны изменяться в дальнейшем) |
0x1E4 | 4 | Сигнатура сектора информации FS ( 0x72 0x72 0x41 0x61 = " ")rrAa |
0x1E8 | 4 | Последнее известное число свободных кластеров данных на томе или 0xFFFFFFFF , если неизвестно. Должно быть установлено на 0xFFFFFFFF во время форматирования и обновлено операционной системой позже. Не следует абсолютно полагаться на правильность во всех сценариях. Перед использованием этого значения операционная система должна проверить его работоспособность, чтобы оно было меньше или равно количеству кластеров тома. |
0x1EC | 4 | Номер последнего известного выделенного кластера данных. Должен быть установлен на 0xFFFFFFFF во время форматирования и обновлен операционной системой позже. С 0xFFFFFFFF система должна начать с кластера 0x00000002 . Не следует полностью полагаться на то, что он будет правильным во всех сценариях. Перед использованием этого значения операционная система должна проверить его на предмет допустимости номера кластера на томе. |
0x1F0 | 12 | Зарезервировано (значения байтов должны быть установлены на 0x00 во время форматирования, но на них не следует полагаться и они никогда не должны изменяться в дальнейшем) |
0x1FC | 4 | Сигнатура сектора информации FS ( 0x00 0x00 0x55 0xAA ) [4] [nb 2] (Все четыре байта должны совпасть, прежде чем содержимое этого сектора можно будет считать имеющим допустимый формат.) |
Данные сектора могут быть устаревшими и не отражать текущее содержимое носителя, поскольку не все операционные системы обновляют или используют этот сектор, и даже если они это делают, содержимое недействительно, если носитель был извлечен без надлежащего размонтирования тома или после сбоя питания. Поэтому операционные системы должны сначала проверить необязательные битовые флаги состояния выключения тома, находящиеся в записи FAT кластера 1 или FAT32 EBPB по смещению 0x041 , и игнорировать данные, хранящиеся в секторе информации FS, если эти битовые флаги указывают на то, что том не был надлежащим образом размонтирован ранее. Это не вызывает никаких проблем, кроме возможного снижения скорости для первого запроса свободного пространства или выделения кластера данных; см. фрагментация.
Если этот сектор присутствует на томе FAT32, минимально допустимый размер логического сектора составляет 512 байт, тогда как в противном случае он был бы 128 байт. Некоторые реализации FAT32 поддерживают небольшое изменение спецификации Microsoft, делая сектор информации FS необязательным, указывая значение 0xFFFF [19] (или 0x0000 ) в записи по смещению 0x030 .
This article may overuse or misuse colour, making it hard to understand for colour-blind users. |
Область данных тома делится на кластеры одинакового размера — небольшие блоки непрерывного пространства. Размеры кластеров различаются в зависимости от типа используемой файловой системы FAT и размера диска; типичные размеры кластеров варьируются от 2 до 32 КБ . [39]
Каждый файл может занимать один или несколько кластеров в зависимости от его размера. Таким образом, файл представлен цепочкой кластеров (называемой односвязным списком ). Эти кластеры не обязательно хранятся рядом друг с другом на поверхности диска, а часто фрагментированы по всей области данных.
Каждая версия файловой системы FAT использует разный размер для записей FAT. Меньшие числа приводят к меньшему FAT, но тратят место в больших разделах, поскольку приходится выделять его в больших кластерах.
Файловая система FAT12 использует 12 бит на запись FAT, таким образом , две записи охватывают 3 байта. Это последовательно little-endian : если эти три байта рассматривать как одно little-endian 24-битное число, 12 младших значащих бит представляют первую запись (например, кластер 0), а 12 старших значащих бит — вторую (например, кластер 1). Другими словами, в то время как младшие восемь бит первого кластера в строке хранятся в первом байте, старшие четыре бита хранятся в младшем полубайте второго байта, тогда как младшие четыре бита последующего кластера в строке хранятся в старшем полубайте второго байта, а его старшие восемь бит — в третьем байте.
Компенсировать | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +А | +Б | +С | +Д | +Э | +Ф |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+0000 | Ф0 | Ф Ф | ФФ | 03 | 40 | 00 | 05 | 60 | 00 | 07 | 80 | 00 | ФФ | А Ф | 00 | 14 |
+0010 | С 0 | 00 | 0D | Э0 | 00 | 0Ф | 00 | 01 | 11 | Ф0 | ФФ | 00 | Ф 0 | ФФ | 15 | 60 |
+0020 | 01 | 19 | 7 0 | ФФ | Ф7 | А Ф | 01 | ФФ | 0 Ж | 00 | 00 | 7 0 | ФФ | 00 | 00 | 00 |
Файловая система FAT16 использует 16 бит на запись FAT, таким образом , одна запись охватывает два байта в порядке байтов от младшего к старшему:
Компенсировать | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +А | +Б | +С | +Д | +Э | +Ф |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+0000 | Ф0 | ФФ | ФФ | ФФ | 03 | 00 | 04 | 00 | 05 | 00 | 06 | 00 | 07 | 00 | 08 | 00 |
+0010 | ФФ | ФФ | 0А | 00 | 14 | 00 | 0С | 00 | 0D | 00 | 0Э | 00 | 0Ф | 00 | 10 | 00 |
+0020 | 11 | 00 | ФФ | ФФ | 00 | 00 | ФФ | ФФ | 15 | 00 | 16 | 00 | 19 | 00 | Ф7 | ФФ |
+0030 | Ф7 | ФФ | 1А | 00 | ФФ | ФФ | 00 | 00 | 00 | 00 | Ф7 | ФФ | 00 | 00 | 00 | 00 |
Файловая система FAT32 использует 32 бита на запись FAT, таким образом, одна запись охватывает четыре байта в порядке little-endian. Четыре верхних бита каждой записи зарезервированы для других целей; они очищаются во время форматирования и не должны изменяться в противном случае. Они должны быть замаскированы перед интерпретацией записи как 28-битного адреса кластера.
Компенсировать | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +А | +Б | +С | +Д | +Э | +Ф |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+0000 | Ф0 | ФФ | ФФ | 0Ф | ФФ | ФФ | ФФ | 0Ф | ФФ | ФФ | ФФ | 0Ф | 04 | 00 | 00 | 00 |
+0010 | 05 | 00 | 00 | 00 | 06 | 00 | 00 | 00 | 07 | 00 | 00 | 00 | 08 | 00 | 00 | 00 |
+0020 | ФФ | ФФ | ФФ | 0Ф | 0А | 00 | 00 | 00 | 14 | 00 | 00 | 00 | 0С | 00 | 00 | 00 |
+0030 | 0D | 00 | 00 | 00 | 0Э | 00 | 00 | 00 | 0Ф | 00 | 00 | 00 | 10 | 00 | 00 | 00 |
+0040 | 11 | 00 | 00 | 00 | ФФ | ФФ | ФФ | 0Ф | 00 | 00 | 00 | 00 | ФФ | ФФ | ФФ | 0Ф |
+0050 | 15 | 00 | 00 | 00 | 16 | 00 | 00 | 00 | 19 | 00 | 00 | 00 | Ф7 | ФФ | ФФ | 0Ф |
+0060 | Ф7 | ФФ | ФФ | 0Ф | 1А | 00 | 00 | 00 | ФФ | ФФ | ФФ | 0Ф | 00 | 00 | 00 | 00 |
+0070 | 00 | 00 | 00 | 00 | Ф7 | ФФ | ФФ | 0Ф | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
Таблица размещения файлов ( FAT ) — это непрерывный ряд секторов, следующих сразу за областью зарезервированных секторов. Она представляет собой список записей, которые сопоставляются с каждым кластером на томе. Каждая запись записывает одну из четырех вещей:
Для самых ранних версий DOS, чтобы распознать файловую систему, система должна была быть загружена с тома, или FAT тома должна начинаться со второго сектора тома (логический сектор 1 с физическим адресом CHS 0/0/2 или адресом LBA 1), то есть сразу после загрузочного сектора. Операционные системы предполагают это жестко зашитое расположение FAT, чтобы найти идентификатор FAT в записи кластера 0 FAT на дискетах DOS 1.0-1.1 FAT, где не найдено допустимого BPB.
Первые две записи в FAT хранят специальные значения:
Первая запись (кластер 0 в FAT) содержит идентификатор FAT со времен MS-DOS 1.20 и PC DOS 1.1 (допустимые значения 0xF0 - 0xFF с зарезервированными 0xF1 - 0xF7 ) в битах 7-0, который также копируется в BPB загрузочного сектора, смещение 0x015 со времен DOS 2.0. Оставшиеся 4 бита (если FAT12), 8 бит (если FAT16) или 20 бит (если FAT32, 4 бита MSB равны нулю) этой записи всегда равны 1. Эти значения были организованы таким образом, чтобы запись также функционировала как маркер конца цепочки "trap-all" для всех кластеров данных, содержащих нулевое значение. Кроме того, для идентификаторов FAT, отличных от 0xFF (и 0x00 ), можно определить правильный порядок полубайтов и байтов, который будет использоваться драйвером файловой системы, однако официально файловая система FAT использует только представление с прямым порядком байтов , и нет известных реализаций вариантов, использующих значения с обратным порядком байтов . 86-DOS 0.42 вплоть до MS-DOS 1.14 использовали жестко заданные профили дисков вместо идентификатора FAT, но использовали этот байт для различения носителей, отформатированных с 32-байтовыми или 16-байтовыми записями каталогов, как это было до 86-DOS 0.42.
Вторая запись (кластер 1 в FAT) номинально хранит маркер конца цепочки кластеров, используемый форматером, но обычно всегда содержит 0xFFF / 0xFFFF / 0x0FFFFFFF , то есть, за исключением битов 31-28 на томах FAT32, эти биты обычно всегда установлены. Однако некоторые операционные системы Microsoft устанавливают эти биты, если том не является томом, содержащим работающую операционную систему (то есть, используйте здесь 0xFFFFFFFF вместо 0x0FFFFFFF ). [40] (В сочетании с альтернативными маркерами конца цепочки младшие биты 2-0 могут стать нулевыми для наименьшего разрешенного маркера конца цепочки 0xFF8 / 0xFFF8 / 0x?FFFFFF8 ; бит 3 также должен быть зарезервирован, учитывая, что кластеры 0xFF0 / 0xFFF0 / 0x?FFFFFF0 и выше официально зарезервированы. Некоторые операционные системы могут не иметь возможности монтировать некоторые тома, если какой-либо из этих битов не установлен, поэтому маркер конца цепочки по умолчанию не следует изменять.) Для DOS 1 и 2 запись была задокументирована как зарезервированная для будущего использования.
Начиная с DOS 7.1 два самых значимых бита этой записи кластера могут содержать два необязательных битовых флага, представляющих текущее состояние тома на FAT16 и FAT32, но не на томах FAT12. Эти битовые флаги поддерживаются не всеми операционными системами, но операционные системы, поддерживающие эту функцию, устанавливают эти биты при завершении работы и очищают самый значимый бит при запуске:
Если бит 15 (на FAT16) или бит 27 (на FAT32) [41] не установлен при монтировании тома, том не был должным образом размонтирован перед выключением или извлечением и, таким образом, находится в неизвестном и, возможно, «грязном» состоянии. [27] На томах FAT32 сектор информации FS может содержать устаревшие данные и, таким образом, не должен использоваться. Затем операционная система обычно запускает SCANDISK или CHKDSK при следующем запуске [nb 9] [41] (но не при вставке съемного носителя), чтобы обеспечить и, возможно, восстановить целостность тома.
Если бит 14 (в FAT16) или бит 26 (в FAT32) [41] очищен, операционная система обнаружила ошибки ввода-вывода диска при запуске, [41] что может быть признаком наличия поврежденных секторов. Операционные системы, знающие об этом расширении, будут интерпретировать это как рекомендацию выполнить сканирование поверхности ( SCANDISK ) при следующей загрузке. [27] [41] (Похожий набор битовых флагов существует в FAT12/FAT16 EBPB по смещению 0x1A или FAT32 EBPB по смещению 0x36 . В то время как запись кластера 1 может быть доступна драйверам файловой системы после того, как они смонтировали том, запись EBPB доступна, даже если том не смонтирован, и, таким образом, ее проще использовать драйверам блочных устройств диска или инструментам разбиения на разделы.)
Если количество FAT в BPB не установлено равным 2, вторая запись кластера в первой FAT (кластер 1) может также отражать статус тома TFAT для операционных систем, поддерживающих TFAT. Если запись кластера 1 в этой FAT содержит значение 0, это может означать, что вторая FAT представляет собой последнее известное допустимое состояние транзакции и должна быть скопирована поверх первой FAT, тогда как первая FAT должна быть скопирована поверх второй FAT, если установлены все биты.
Некоторые нестандартные реализации FAT12/FAT16 используют запись кластера 1 для хранения начального кластера корневого каталога переменного размера (обычно 2 [33] ). Это может произойти, когда количество записей корневого каталога в BPB имеет значение 0 и не найдено ни одного FAT32 EBPB (нет сигнатуры 0x29 или 0x28 по смещению 0x042 ). [20] Однако это расширение не поддерживается основными операционными системами, [20] поскольку оно конфликтует с другими возможными использованиями записи кластера 1. Большинство конфликтов можно исключить, если это расширение разрешено только для FAT12 с кластерами менее 0xFEF и томов FAT16 с кластерами менее 0x3FEF и 2 FAT.
Поскольку эти первые две записи FAT хранят специальные значения, кластеров данных 0 или 1 нет. Первый кластер данных (после корневого каталога, если FAT12/FAT16) — это кластер 2, [33] отмечающий начало области данных.
Значения ввода FAT:
FAT12 | FAT16 | FAT32 | Описание |
---|---|---|---|
0x000 | 0x0000 | 0x?0000000 | Free Cluster; также используется DOS для обозначения родительского каталога, начального кластера в записях ".." подкаталогов корневого каталога на томах FAT12/FAT16. [42] [6] В противном случае, если это значение встречается в цепочках кластеров (например, в записях каталогов нулевой длины или удаленных файлах), реализации файловой системы должны рассматривать это как маркер конца цепочки. [7] |
0x001 | 0x0001 | 0x?0000001 | Зарезервировано для внутренних целей; MS-DOS/PC DOS используют это значение кластера как временный индикатор несвободного кластера при построении цепочек кластеров во время выделения файлов (видно на диске только в случае сбоя или отключения питания в середине этого процесса). [42] [6] Если это значение встречается в цепочках кластеров на диске, реализации файловой системы должны рассматривать его как маркер конца цепочки. |
0x002 - 0xФЕФ | 0x0002 - 0xFFEF (0x0002 - 0x7FFF) | 0x?0000002 - 0x?FFFFFEF | Используется как кластеры данных; значение указывает на следующий кластер. MS-DOS/PC DOS принимает значения до 0xFEF / 0xFFEF / 0x0FFFFFEF (иногда больше; см. ниже), тогда как для Atari GEMDOS на томах FAT16 допускаются только значения до 0x7FFF . |
0xFF0 [число 10] - 0xFF5 (0xFF1 - 0xFF5) | 0xFFF0 - 0xFFF5 | 0x?FFFFFF0 - 0x?FFFFFF5 | Зарезервировано в некоторых контекстах [43] или также используется [24] [25] [26] [4] [44] как кластеры данных в некоторых нестандартных системах. Размеры томов, которые будут использовать эти значения как кластеры данных, следует избегать, но если эти значения встречаются в существующих томах, файловая система должна обрабатывать их как обычные кластеры данных в цепочках кластеров (в идеале применяя дополнительные проверки работоспособности), подобно тому, что делают MS-DOS, PC DOS и DR-DOS [6] и следует избегать выделения их для файлов в противном случае. MS-DOS/PC DOS 3.3 и выше обрабатывает значение 0xFF0 [nb 10] [6] на томах FAT12 (но не на FAT16 или FAT32) как дополнительный маркер конца цепочки, аналогичный 0xFF8 - 0xFFF . [6] Для совместимости с MS-DOS/PC DOS файловые системы должны избегать использования кластера данных 0xFF0 в цепочках кластеров на томах FAT12 (то есть обрабатывать его как зарезервированный кластер, аналогичный 0xFF7 ). (Примечание. Соответствие младшего байта номера кластера значениям идентификатора FAT и дескриптора носителя является причиной того, что эти значения кластера зарезервированы.) |
0xFF6 | 0xFFF6 | 0x?FFFFFF6 | Зарезервировано; не использовать. [24] [25] [26] [4] [21] [44] (Примечание. Соответствует значению заполнителя формата по умолчанию 0xF6 на IBM-совместимых компьютерах.) Не следует создавать тома, которые будут использовать это значение в качестве кластера данных, но если это значение встречается в существующих томах, файловая система должна рассматривать его как обычный кластер данных в цепочках кластеров (в идеале применяя дополнительные проверки работоспособности) и должна избегать выделения его для файлов в противном случае. [7] |
0xFF7 | 0xFFF7 | 0x?FFFFFF7 | Плохой сектор в кластере или зарезервированный кластер (начиная с DOS 2.0). Значения cutover для максимального количества кластеров для файловых систем FAT12 и FAT16 определяются таким образом, что максимально возможные значения кластера данных ( 0xFF5 и 0xFFF5 , [6] соответственно) всегда будут меньше этого значения. [6] Следовательно, это значение обычно не может встречаться в цепочках кластеров, но если оно встречается, его можно рассматривать как обычный кластер данных, поскольку 0xFF7 мог быть нестандартным кластером данных на томах FAT12 до введения маркера плохого кластера в DOS 2.0 или введения FAT16 в DOS 3.0, [7] а 0xFFF7 мог быть нестандартным кластером данных на томах FAT16 до введения FAT32 в DOS 7.10. Теоретически, 0x0FFFFFF7 может быть частью допустимой цепочки кластеров на томах FAT32, но дисковые утилиты должны избегать создания томов FAT32, где это состояние может возникнуть. Файловая система должна избегать выделения этого кластера для файлов. [7] Дисковые утилиты не должны пытаться восстановить «потерянные кластеры», содержащие это значение в FAT, а должны считать их плохими кластерами. |
0xFF8 - 0xFFF (и опционально 0xFF0; [примечание 10] см. примечание) | 0xFFF8 - 0xFFFF | 0x?FFFFFF8 - 0x?FFFFFFFF | Последний кластер в файле (EOC). Реализации файловых систем должны обрабатывать все эти значения как маркер конца цепочки одновременно. [7] Большинство реализаций файловых систем (включая 86-DOS, MS-DOS, PC DOS и DR-DOS) используют 0xFFF [7] / 0xFFFF [7] / 0x0FFFFFFF в качестве маркера конца файла при выделении файлов, но версии Linux до 2.5.40 использовали 0xFF8 / 0xFFF8 / 0x0FFFFFF8 . [45] Версии mkdosfs (dosfstools до 3.0.26) продолжают использовать 0x0FFFFFF8 для корневого каталога на томах FAT32, тогда как некоторые инструменты восстановления и дефрагментации дисков используют другие значения в наборе (например, SCANDISK может использовать вместо этого 0xFF8 / 0xFFF8 / 0x0FFFFFF8 ). В то время как в оригинальной 8-битной реализации FAT в Standalone Disk BASIC от Microsoft использовались различные конечные маркеры ( 0xC0 .. 0xCD ) для указания количества секторов (от 0 до 13), использованных в последнем кластере, занятом файлом, в DOS различные конечные маркеры были перепрофилированы для указания различных типов носителей [7] с текущим используемым конечным маркером, указанным в записи кластера 1, однако эта концепция, по-видимому, не получила широкого распространения на практике — и в той степени, в которой в некоторых сценариях тома могут не распознаваться некоторыми операционными системами, если некоторые из младших битов значения, хранящегося в кластере 1, не установлены. Кроме того, некоторые неисправные реализации файловой системы принимают только 0xFFF / 0xFFFF / 0x?FFFFFFF в качестве допустимого маркера конца цепочки. Реализации файловых систем должны проверять значения кластеров в цепочках кластеров относительно максимально допустимого значения кластера, рассчитанного по фактическому размеру тома, и обрабатывать более высокие значения так, как если бы они также были маркерами конца цепочки. (Низший байт номера кластера концептуально соответствует идентификатору FAT и значениям дескриптора носителя; [7] см. примечание выше для специального использования MS-DOS/PC DOS 0xFF0 [nb 10] на томах FAT12. [6] ) |
FAT32 использует 28 бит для номеров кластеров. Оставшиеся 4 бита в 32-битной записи FAT обычно равны нулю, но зарезервированы и должны оставаться нетронутыми. Стандартный совместимый драйвер файловой системы FAT32 или инструмент обслуживания не должен полагаться на то, что верхние 4 бита равны нулю, и он должен отбросить их перед оценкой номера кластера, чтобы справиться с возможными будущими расширениями, где эти биты могут использоваться для других целей. Они не должны очищаться драйвером файловой системы при выделении новых кластеров, но должны очищаться во время переформатирования.
Таблица корневого каталога в файловых системах FAT12 и FAT16 занимает специальное местоположение области корневого каталога .
За исключением таблицы корневого каталога в файловых системах FAT12 и FAT16, которая занимает специальное местоположение Root Directory Region , все таблицы каталогов хранятся в регионе данных. Фактическое количество записей в каталоге, хранящемся в регионе данных, может увеличиваться путем добавления еще одного кластера в цепочку в FAT.
Таблица каталогов — это особый тип файла, представляющий каталог (также известный как папка). Начиная с 86-DOS 0.42 [ 46] каждый файл или (начиная с MS-DOS 1.40 и PC DOS 2.0) подкаталог, хранящийся в нем, представлен 32-байтовой записью в таблице. Каждая запись записывает имя, расширение, атрибуты ( архив , каталог, скрытый, только для чтения, системный и том), адрес первого кластера данных файла/каталога, размер файла/каталога и дату [46] и (начиная с PC DOS 1.1) также время последнего изменения. Более ранние версии 86-DOS использовали только 16-байтовые записи каталогов, не поддерживая файлы размером более 16 МБ и не поддерживая время последнего изменения. [46]
Сама файловая система FAT не накладывает никаких ограничений на глубину дерева подкаталогов, пока есть свободные кластеры, доступные для размещения подкаталогов, однако внутренняя структура текущего каталога (CDS) в MS-DOS/PC DOS ограничивает абсолютный путь к каталогу 66 символами (включая букву диска, но исключая разделитель байтов NUL), [24] [25] [26] тем самым ограничивая максимальную поддерживаемую глубину подкаталогов 32, что бы ни произошло раньше. Concurrent DOS, Multiuser DOS и DR DOS 3.31 по 6.0 (до включения обновлений 1992-11) не хранят абсолютные пути к рабочим каталогам внутри себя и, следовательно, не показывают это ограничение. [47] То же самое относится к Atari GEMDOS, но Atari Desktop не поддерживает более 8 уровней подкаталогов. Большинство приложений, знающих об этом расширении, поддерживают пути длиной не менее 127 байт. FlexOS, 4680 OS и 4690 OS также поддерживают длину до 127 байт, что позволяет использовать глубину до 60 уровней. [48] PalmDOS, DR DOS 6.0 (начиная с BDOS 7.1) и выше, Novell DOS и OpenDOS поддерживают совместимый с MS-DOS CDS и, следовательно, имеют те же ограничения по длине, что и MS-DOS/PC DOS.
Каждой записи могут предшествовать «поддельные записи» для поддержки длинного имени файла VFAT (LFN); см. подробнее ниже.
Допустимые символы для коротких имен файлов DOS включают следующие:
A
–Z
0
–9
MKDIR
/ MD
и RMDIR
/ RD
в DR-DOS, которые принимают одиночные аргументы и, следовательно, позволяют вводить пробелы.! # $ % & ' ( ) - @ ^ _ ` { } ~
Это исключает следующие символы ASCII :
" * / : < > ? \ |
+ , . ; = [ ]
a
– z
A
– Z
; разрешены в длинных именах файловСимвол 229 ( 0xE5 ) не допускался в качестве первого символа в имени файла в DOS 1 и 2 из-за его использования в качестве свободного маркера записи. Был добавлен специальный случай, чтобы обойти это ограничение в DOS 3.0 и выше.
В GEMDOS от Atari разрешены следующие дополнительные символы, но их следует избегать для совместимости с MS-DOS/PC DOS:
" + , ; < = > [ ] |
Точку с запятой ( ;
) следует избегать в именах файлов в DR DOS 3.31 и выше, PalmDOS, Novell DOS, OpenDOS, Concurrent DOS, Multiuser DOS, System Manager и REAL/32, поскольку она может конфликтовать с синтаксисом указания паролей файлов и каталогов: " ...\DIRSPEC.EXT;DIRPWD\FILESPEC.EXT;FILEPWD
". Операционная система удалит одну [47] (а также две — начиная с DR-DOS 7.02) точки с запятой и ожидающие пароли из имен файлов перед сохранением их на диске. (Командный процессор 4DOS использует точки с запятой для списков включения и требует удвоения точки с запятой для защищенных паролем файлов с любыми командами, поддерживающими подстановочные знаки. [47] )
Символ «at» ( @
) используется для списков файлов многими командами DR-DOS, PalmDOS, Novell DOS, OpenDOS и Multiuser DOS, System Manager и REAL/32, а также 4DOS, и поэтому иногда его может быть сложно использовать в именах файлов. [47]
В многопользовательских DOS и REAL/32 восклицательный знак (!) не является допустимым символом имени файла, поскольку он используется для разделения нескольких команд в одной командной строке. [47]
В ОС IBM 4680 и 4690 в именах файлов не допускаются следующие символы:
? * : . ; , [ ] ! + = < > " - / \ |
Кроме того, следующие специальные символы не допускаются в первом, четвертом, пятом и восьмом символах имени файла, поскольку они конфликтуют с именами файлов сборки командного процессора хоста (HCP) и таблицы входной последовательности:
@ # ( ) { } $ &
Имена файлов DOS находятся в текущем наборе символов OEM : это может иметь неожиданные последствия, если символы, обрабатываемые одним способом для данной кодовой страницы, интерпретируются по-разному для другой кодовой страницы (команда DOS CHCP
) с точки зрения нижнего и верхнего регистра, сортировки или допустимости в качестве символа имени файла.
До того, как Microsoft добавила поддержку длинных имен файлов и временных меток создания/доступа, байты 0x0C – 0x15 записи каталога использовались другими операционными системами для хранения дополнительных метаданных, в частности, операционные системы семейства Digital Research хранили там пароли файлов, права доступа, идентификаторы владельцев и данные об удалении файлов. Хотя новые расширения Microsoft по умолчанию не полностью совместимы с этими расширениями, большинство из них могут сосуществовать в сторонних реализациях FAT (по крайней мере, на томах FAT12 и FAT16).
32-байтовые записи каталогов, как в области корневого каталога, так и в подкаталогах, имеют следующий формат (см. также 8.3 имя_файла ):
Смещение байта | Длина (байты) | Содержание | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 8 | Короткое имя файла (дополненное пробелами) Первый байт может иметь следующие специальные значения:
Версии DOS до 5.0 начинают сканирование таблиц каталогов сверху вниз. Чтобы увеличить шансы на успешное восстановление файлов, DOS 5.0 и выше будут запоминать позицию последней записанной записи каталога и использовать ее в качестве отправной точки для сканирования таблиц каталогов. | ||||||||||||||||||||||||||||||||||||||||||
0x08 | 3 | Короткое расширение файла (дополненное пробелами) | ||||||||||||||||||||||||||||||||||||||||||
0x0B | 1 | Атрибуты файла
В DR DOS 6.0 и выше, включая PalmDOS, Novell DOS и OpenDOS, атрибут тома устанавливается для ожидающих удаления файлов и каталогов в DELWATCH. Сочетание атрибутов 0x0F используется для обозначения длинного имени файла VFAT, начиная с MS-DOS 7.0. Более старые версии DOS могут ошибочно принять это за метку тома каталога, поскольку они берут первую запись с атрибутом тома, установленным как метка тома. Эту проблему можно избежать, если метка тома каталога принудительно применяется как часть процесса форматирования; по этой причине некоторые дисковые инструменты явно записывают фиктивные метки тома каталога " ", когда пользователь не указывает метку тома. [nb 13] Поскольку метки томов обычно не имеют установленного системного атрибута в то же время, можно различать метки томов и записи VFAT LFN. Комбинация атрибутов 0x0F иногда может также встречаться как часть допустимого файла, ожидающего удаления в DELWATCH, однако на томах FAT12 и FAT16 записи VFAT LFN всегда имеют значение кластера в 0x1A, установленное на 0x0000 , а запись длины в 0x1C никогда не бывает 0x00000000 , тогда как запись в 0x1A всегда ненулевая для файлов, ожидающих удаления в DELWATCH. Эта проверка не работает на томах FAT32. | ||||||||||||||||||||||||||||||||||||||||||
0x0C | 1 |
| ||||||||||||||||||||||||||||||||||||||||||
0x0D | 1 |
Двойное использование времени создания мс и символа файла не создает конфликта, поскольку время создания больше не имеет значения для удаленных файлов. | ||||||||||||||||||||||||||||||||||||||||||
0x0E | 2 |
Если здесь биты 15-11 > 23 или биты 10-5 > 59 или биты 4-0 > 29, или когда биты 12-0 по смещению 0x14 содержат битовую карту доступа и это не том FAT32 или том, использующий расширенные атрибуты OS/2, то эта запись фактически содержит хэш пароля, в противном случае можно предположить, что это время создания файла. | ||||||||||||||||||||||||||||||||||||||||||
0x10 | 2 |
Использование даты создания для существующих файлов не конфликтует с последним временем изменения для удаленных файлов, поскольку они никогда не используются одновременно. По той же причине использование размера записи существующих файлов и последнего времени изменения удаленных файлов не конфликтует. Даты создания и размеры записи не могут использоваться одновременно, однако оба они сохраняются только при создании файла и никогда не изменяются впоследствии, тем самым ограничивая конфликт системами FlexOS, 4680 OS и 4690 OS, получающими доступ к файлам, созданным в сторонних операционных системах, а также потенциальными проблемами отображения или сортировки файлов в системах, пытающихся интерпретировать размер записи как время создания. Чтобы избежать конфликта, хранение дат создания должно быть дополнительной функцией операционных систем, поддерживающих его. | ||||||||||||||||||||||||||||||||||||||||||
0x12 | 2 |
Использование идентификаторов владельцев существующих файлов не конфликтует с отметкой даты последнего изменения для удаленных файлов, поскольку они никогда не используются одновременно. [47] Использование отметки даты последнего изменения для удаленных файлов не конфликтует с датой доступа, поскольку даты доступа больше не важны для удаленных файлов. Однако идентификаторы владельцев и даты доступа не могут использоваться одновременно. | ||||||||||||||||||||||||||||||||||||||||||
0x14 | 2 |
Хранение старших двух байтов первого кластера в файле на FAT32 частично конфликтует с битовыми картами прав доступа. | ||||||||||||||||||||||||||||||||||||||||||
0x16 | 2 |
| ||||||||||||||||||||||||||||||||||||||||||
0x18 | 2 |
| ||||||||||||||||||||||||||||||||||||||||||
0x1A | 2 | Начало файла в кластерах в FAT12 и FAT16. Нижние два байта первого кластера в FAT32; верхние два байта хранятся по смещению 0x14 . Записи с флагом метки тома, подкаталогом «..», указывающим на корень FAT12 и FAT16, и пустыми файлами размером 0 должны иметь первый кластер 0. Записи VFAT LFN также имеют эту запись, установленную на 0; на томах FAT12 и FAT16 это может использоваться как часть механизма обнаружения для различения ожидающих удаления файлов в DELWATCH и VFAT LFN; см. выше. | ||||||||||||||||||||||||||||||||||||||||||
0x1С | 4 | Размер файла в байтах. Записи с установленным флагом Volume Label или Subdirectory должны иметь размер 0. Записи VFAT LFN никогда не хранят здесь значение 0x00000000 . Это может использоваться как часть механизма обнаружения для различения файлов, ожидающих удаления в DELWATCH, и VFAT LFN; см. выше. |
Операционные системы IBM 4680 OS и IBM 4690 OS на базе FlexOS поддерживают уникальные атрибуты распределения, хранящиеся в некоторых битах ранее зарезервированных областей в записях каталога: [62]
Некоторые несовместимые расширения, обнаруженные в некоторых операционных системах, включают:
Смещение байта | Длина (байты) | Система | Описание |
---|---|---|---|
0x0C | 2 | ОС RISC | Тип файла, 0x0000 – 0x0FFF |
0x0C | 4 | Петров ДОСФС | Адрес загрузки файла |
0x0E | 2 | АНДОС | Адрес файла в памяти |
0x10 | 4 | Петров ДОСФС | Адрес выполнения файла |
Варианты файловых систем FAT12, FAT16, FAT16B и FAT32 имеют четкие ограничения, основанные на количестве кластеров и количестве секторов на кластер (1, 2, 4, ..., 128). Для типичного значения 512 байт на сектор:
Требования FAT12: 3 сектора в каждой копии FAT на каждые 1024 кластера
Требования FAT16: 1 сектор в каждой копии FAT на каждые 256 кластеров
Требования FAT32: 1 сектор в каждой копии FAT на каждые 128 кластеров
Диапазон FAT12: от 1 до 4084 кластеров: от 1 до 12 секторов на копию FAT
Диапазон FAT16: от 4085 до 65524 кластеров: от 16 до 256 секторов на копию FAT
Диапазон FAT32: от 65525 до 268435444 кластеров: от 512 до 2097152 секторов на копию FAT
Минимум FAT12: 1 сектор на кластер × 1 кластер = 512 байт (0,5 КиБ)
Минимум FAT16: 1 сектор на кластер × 4085 кластеров = 2091520 байт (2042,5 КБ)
Минимум FAT32: 1 сектор на кластер × 65525 кластеров = 33548800 байт (32762,5 КБ)
Максимум FAT12: 64 сектора на кластер × 4084 кластера = 133824512 байт (≈127 МБ)
[Максимум FAT12: 128 секторов на кластер × 4084 кластера = 267694024 байт (≈255 МБ)]
Максимум FAT16: 64 сектора на кластер × 65524 кластера = 2147090432 байт (≈2047 МБ)
[FAT16 максимум: 128 секторов на кластер × 65 524 кластера = 4 294 180 864 байта (≈4 095 МБ)]
FAT32 максимум: 8 секторов на кластер × 268 435 444 кластера = 1 099 511 578 624 байта (≈1 024 ГБ)
FAT32 максимум: 16 секторов на кластер × 268 173 557 кластеров = 2 196 877 778 944 байта (≈2 046 ГБ)
[FAT32 максимум: 32 сектора на кластер × 134 152 181 кластер = 2 197 949 333 504 байта (≈2 047 ГБ)]
[Максимум FAT32: 64 сектора на кластер × 67 092 469 кластеров = 2 198 486 024 192 байта (≈2 047 ГБ)]
[Максимум FAT32: 128 секторов на кластер × 33 550 325 кластеров = 2 198 754 099 200 байт (≈2 047 ГБ)]
Поскольку каждая запись FAT32 занимает 32 бита (4 байта), максимальное количество кластеров (268435444) требует 2097152 секторов FAT для размера сектора 512 байт. 2097152 — это 0x200000 , и для хранения этого значения требуется более двух байтов. Поэтому FAT32 ввела новое 32-битное значение в загрузочном секторе FAT32 сразу после 32-битного значения для общего количества секторов, введенного в варианте FAT16B.
Расширения загрузочной записи, представленные в DOS 4.0, начинаются с магических 40 ( 0x28 ) или 41 ( 0x29 ). Обычно драйверы FAT смотрят только на количество кластеров, чтобы различать FAT12, FAT16 и FAT32: читаемые человеком строки, идентифицирующие вариант FAT в загрузочной записи, игнорируются, поскольку они существуют только для носителей, отформатированных в DOS 4.0 или более поздней версии.
Определить количество записей каталога на кластер просто. Каждая запись занимает 32 байта; это дает 16 записей на сектор для размера сектора 512 байт. Команда DOS 5 RMDIR
/ RD
удаляет начальные записи " .
" (этот каталог) и " ..
" (родительский каталог) в подкаталогах напрямую, поэтому размер сектора 32 на RAM-диске возможен для FAT12, но требует 2 или более секторов на кластер. Загрузочный сектор FAT12 без расширений DOS 4 требует 29 байт перед первым ненужным 32-битным числом скрытых секторов FAT16B, это оставляет три байта для (на неиспользуемом RAM-диске) загрузочного кода и магических 0x55 0xAA в конце всех загрузочных секторов. В Windows NT наименьший поддерживаемый размер сектора составляет 128.
В операционных системах Windows NTFORMAT
параметры команды /A:128K
и /A:256K
соответствуют максимальному размеру кластера 0x80
(128) с размером сектора 1024 и 2048 соответственно. Для общего размера сектора 512 /A:64K
получается 128 секторов на кластер.
В обеих редакциях стандартов ECMA-107 [24] и ISO/IEC 9293 [25] [26] указано максимальное число кластеров, MAX
определяемое по формуле , и зарезервированы числа кластеров до 4086 ( 0xFF6 , FAT12) и более поздние 65526 ( 0xFFF6 , FAT16) для будущей стандартизации.MAX=1+trunc((TS-SSA)/SC)
MAX+1
Спецификация EFI FAT32 от Microsoft [4] гласит, что любая файловая система FAT с менее чем 4085 кластерами является FAT12, в противном случае любая файловая система FAT с менее чем 65 525 кластерами является FAT16, в противном случае это FAT32. Запись для кластера 0 в начале FAT должна быть идентична байту дескриптора носителя, найденному в BPB, тогда как запись для кластера 1 отражает значение конца цепочки, используемое форматером для цепочек кластеров ( 0xFFF , 0xFFFF или 0x0FFFFFFF ). Записи для номеров кластеров 0 и 1 заканчиваются на границе байта даже для FAT12, например, 0xF9FFFF для дескриптора носителя 0xF9 .
Первый кластер данных — 2, [33] и, следовательно, последний кластер MAX
получает номер MAX+1
. Это приводит к номерам кластеров данных 2...4085 ( 0xFF5 ) для FAT12, 2...65525 ( 0xFFF5 ) для FAT16 и 2...268435445 ( 0x0FFFFFF5 ) для FAT32.
Единственными доступными значениями, зарезервированными для будущей стандартизации, являются, таким образом, 0xFF6 (FAT12) и 0xFFF6 (FAT16). Как отмечено ниже, «меньше 4085» также используется для реализаций Linux, [44] или, как это сформулировано в спецификации FAT от Microsoft : [4]
...когда написано <, это не значит <=. Обратите внимание, что числа верны. Первое число для FAT12 — 4085; второе число для FAT16 — 65525. Эти числа и знаки «<» не являются неправильными.
Файловая система FAT не содержит встроенных механизмов, которые предотвращают разбросанность вновь записанных файлов по разделу. [65] На томах, где файлы часто создаются и удаляются или их длина часто меняется, носитель со временем будет становиться все более фрагментированным.
Хотя конструкция файловой системы FAT не вызывает никаких организационных накладных расходов в дисковых структурах или не уменьшает объем свободного дискового пространства при увеличении количества фрагментации , как это происходит при внешней фрагментации , время, необходимое для чтения и записи фрагментированных файлов, увеличится, поскольку операционной системе придется следовать цепочкам кластеров в FAT (при этом части должны быть загружены в память в первую очередь, особенно на больших томах) и считывать соответствующие данные, физически разбросанные по всему носителю, что снижает вероятность того, что драйвер блочного устройства низкого уровня выполнит многосекторный дисковый ввод-вывод или инициирует более крупные передачи DMA, тем самым фактически увеличивая накладные расходы протокола ввода-вывода, а также время перемещения рычага и установки головки внутри дискового накопителя. Кроме того, файловые операции станут медленнее с ростом фрагментации, поскольку операционной системе потребуется все больше времени для поиска файлов или свободных кластеров.
Другие файловые системы, например HPFS или exFAT , используют битовые карты свободного пространства , которые указывают используемые и доступные кластеры, которые затем можно быстро просмотреть, чтобы найти свободные смежные области. Другое решение — это связывание всех свободных кластеров в один или несколько списков (как это делается в файловых системах Unix ). Вместо этого FAT приходится сканировать как массив, чтобы найти свободные кластеры, что может привести к снижению производительности на больших дисках.
Фактически, поиск файлов в больших подкаталогах или вычисление свободного дискового пространства на томах FAT является одной из самых ресурсоемких операций, поскольку требует чтения таблиц каталогов или даже всего FAT линейно. Поскольку общее количество кластеров и размер их записей в FAT все еще были небольшими на томах FAT12 и FAT16, это все еще можно было бы допустить на томах FAT12 и FAT16 большую часть времени, учитывая, что введение более сложных структур дисков также увеличило бы сложность и объем памяти операционных систем реального режима с их минимальными требованиями к общей памяти 128 КБ или меньше (например, с DOS), для которых FAT был изначально разработан и оптимизирован.
С введением FAT32 длительное время поиска и сканирования стало более очевидным, особенно на очень больших томах. Возможным оправданием, предложенным Рэймондом Ченом из Microsoft для ограничения максимального размера разделов FAT32, созданных в Windows, было время, необходимое для выполнения операции " DIR
", которая всегда отображает свободное дисковое пространство в качестве последней строки. [66] Отображение этой строки занимало все больше времени по мере увеличения числа кластеров. Поэтому FAT32 ввел специальный сектор информации о файловой системе, где ранее вычисленный объем свободного пространства сохраняется при циклах питания, так что счетчик свободного пространства необходимо пересчитывать только тогда, когда съемный носитель, отформатированный FAT32, извлекается без предварительного его размонтирования или если система выключается без надлежащего завершения работы операционной системы, проблема, в основном заметная на ПК до ATX -стиля, на простых системах DOS и некоторых потребительских продуктах с батарейным питанием.
Из-за огромных размеров кластеров (16 КБ, 32 КБ, 64 КБ), обусловленных большими разделами FAT, внутренняя фрагментация в виде потери дискового пространства из-за нехватки файлов из-за переполнения кластера (поскольку файлы редко бывают точно кратны размеру кластера) также начинает представлять собой проблему, особенно когда имеется очень много мелких файлов.
Различные оптимизации и настройки для реализации драйверов файловой системы FAT, драйверов блочных устройств и дисковых инструментов были разработаны для преодоления большинства узких мест производительности в изначальной конструкции файловой системы без необходимости изменения компоновки структур на диске. [67] [68] Их можно разделить на онлайновые и офлайновые методы, и они работают, пытаясь в первую очередь избежать фрагментации в файловой системе, развертывая методы для лучшего совладания с существующей фрагментацией и переупорядочивая и оптимизируя структуры на диске. При наличии оптимизаций производительность томов FAT часто может достигать производительности более сложных файловых систем в практических сценариях, в то же время сохраняя преимущество доступности даже на очень маленьких или старых системах.
DOS 3.0 и выше не будут немедленно повторно использовать дисковое пространство удаленных файлов для новых выделений, а вместо этого будут искать ранее неиспользованное пространство, прежде чем начать использовать дисковое пространство ранее удаленных файлов. Это не только помогает поддерживать целостность удаленных файлов как можно дольше, но также ускоряет выделение файлов и избегает фрагментации, поскольку никогда ранее не выделявшееся дисковое пространство всегда нефрагментировано. DOS достигает этого, сохраняя указатель на последний выделенный кластер на каждом смонтированном томе в памяти и начинает поиск свободного пространства с этого места вверх, а не с начала FAT, как это все еще делалось в DOS 2.x. [13] Если достигнут конец FAT, он будет перезапускаться, чтобы продолжить поиск с начала FAT, пока либо не будет найдено свободное место, либо не будет достигнута исходная позиция снова без нахождения свободного места. [13] Эти указатели инициализируются для указания на начало FAT после загрузки, [13] но на томах FAT32 DOS 7.1 и выше попытаются извлечь последнюю позицию из сектора информации FS. Однако этот механизм не работает, если приложение часто удаляет и заново создает временные файлы, поскольку операционная система затем попытается сохранить целостность пустых данных, что в конечном итоге приведет к большей фрагментации. [13] В некоторых версиях DOS для избежания этой проблемы можно использовать специальную функцию API для создания временных файлов.
Кроме того, записи каталога удаленных файлов будут помечены как 0xE5 , начиная с DOS 3.0. [42] DOS 5.0 и выше начнут повторно использовать эти записи только тогда, когда ранее неиспользованные записи каталога будут израсходованы в таблице, и в противном случае системе пришлось бы расширять таблицу самостоятельно. [6]
Начиная с DOS 3.3 операционная система предоставляет средства для повышения производительности файловых операций FASTOPEN
путем отслеживания положения недавно открытых файлов или каталогов в различных формах списков (MS-DOS/PC DOS) или хэш-таблиц (DR-DOS), что может значительно сократить время поиска и открытия файлов. До DOS 5.0 необходимо соблюдать особую осторожность при использовании таких механизмов в сочетании с программным обеспечением для дефрагментации диска, обходящим файловую систему или драйверы диска.
Windows NT заранее выделяет дисковое пространство для файлов в FAT, выбирая большие непрерывные области, но в случае сбоя добавляемые файлы будут отображаться больше, чем они были записаны, с большим количеством случайных данных в конце.
Другие высокоуровневые механизмы могут считывать и обрабатывать более крупные части или всю FAT при запуске или по требованию, когда это необходимо, и динамически создавать в памяти древовидные представления файловых структур тома, отличающиеся от структур на диске. [67] [68] Это может, на томах со многими свободными кластерами, занимать даже меньше памяти, чем образ самой FAT. В частности, на сильно фрагментированных или заполненных томах поиск становится намного быстрее, чем при линейном сканировании по фактической FAT, даже если образ FAT будет храниться в памяти. Кроме того, работая на логически высоком уровне файлов и цепочек кластеров вместо уровня сектора или дорожки, становится возможным избежать некоторой степени фрагментации файла в первую очередь или выполнить локальную дефрагментацию файлов и переупорядочение записей каталога на основе их имен или шаблонов доступа в фоновом режиме.
Некоторые из предполагаемых проблем с фрагментацией файловых систем FAT также являются следствием ограничений производительности базовых драйверов блочных устройств , что становится тем заметнее, чем меньше памяти доступно для буферизации секторов и блокировки/деблокировки дорожек:
В то время как однозадачная DOS имела возможности для многосекторного чтения и блокировки/деблокировки дорожек, операционная система и традиционная архитектура жесткого диска ПК ( только один невыполненный запрос ввода/вывода за раз и никаких передач DMA ) изначально не содержали механизмов, которые могли бы уменьшить фрагментацию путем асинхронной предварительной выборки следующих данных, пока приложение обрабатывало предыдущие фрагменты. Такие функции стали доступны позже. Более поздние версии DOS также обеспечивали встроенную поддержку буферизации секторов с упреждением и поставлялись с динамически загружаемыми программами кэширования диска, работающими на физическом или логическом уровне секторов, часто используя память EMS или XMS и иногда предоставляя адаптивные стратегии кэширования или даже работая в защищенном режиме через DPMS или Cloaking для повышения производительности за счет получения прямого доступа к кэшированным данным в линейной памяти, а не через обычные API DOS.
Кэширование с отложенной записью часто не включалось по умолчанию в программном обеспечении Microsoft (если оно имелось) из-за проблемы потери данных в случае сбоя питания или сбоя, что усугублялось отсутствием аппаратной защиты между приложениями и системой.
Длинные имена файлов VFAT (LFN) хранятся в файловой системе FAT с помощью трюка: добавления дополнительных записей в каталог перед обычной записью файла. Дополнительные записи помечаются атрибутами Volume Label, System, Hidden и Read Only (что приводит к 0x0F ), что является комбинацией, которая не ожидается в среде MS-DOS, и поэтому игнорируется программами MS-DOS и сторонними утилитами. В частности, каталог, содержащий только метки томов, считается пустым и может быть удален; такая ситуация возникает, если файлы, созданные с длинными именами, удаляются из обычного DOS. Этот метод очень похож на метод DELWATCH для использования атрибута тома для скрытия ожидающих удаления файлов для возможного восстановления в будущем, начиная с DR DOS 6.0 (1991) и выше. Он также похож на метод, публично обсуждавшийся для хранения длинных имен файлов в Ataris и под Linux в 1992 году. [69] [70]
Поскольку старые версии DOS могли ошибочно принимать имена LFN в корневом каталоге за метку тома, VFAT был разработан для создания пустой метки тома в корневом каталоге перед добавлением любых записей имен LFN (если метка тома еще не существовала). [примечание 13]
Каждая фальшивая запись может содержать до 13 символов UCS-2 (26 байт) с использованием полей в записи, содержащих размер файла или временные метки (но не поле начального кластера, для совместимости с дисковыми утилитами поле начального кластера установлено на значение 0. См. 8.3 имя файла для дополнительных объяснений). До 20 из этих 13-символьных записей могут быть объединены в цепочку, поддерживая максимальную длину 255 символов UCS-2. [55]
Если позиция последнего символа LFN не находится на границе записи каталога (13, 26, 39, ...), то в следующую позицию символа добавляется терминатор 0x0000 . Затем, если этот терминатор также не находится на границе, оставшиеся позиции символов заполняются 0xFFFF . Не будет существовать ни одной записи каталога, содержащей одинокий терминатор.
Записи LFN используют следующий формат:
Смещение байта | Длина (байты) | Описание |
---|---|---|
0x00 | 1 | Порядковый номер (бит 6: последняя логическая, первая физическая запись LFN, бит 5: 0; биты 4-0: номер 0x01 .. 0x14 ( 0x1F ), удаленная запись: 0xE5 ) |
0x01 | 10 | Символы имени (пять символов UCS-2 ) |
0x0B | 1 | Атрибуты (всегда 0x0F ) |
0x0C | 1 | Тип (всегда 0x00 для VFAT LFN, другие значения зарезервированы для будущего использования; специальное использование битов 4 и 3 в SFN см. выше) |
0x0D | 1 | Контрольная сумма имени файла DOS |
0x0E | 12 | Символы имени (шесть символов UCS-2 ) |
0x1A | 2 | Первый кластер (всегда 0x0000 ) |
0x1С | 4 | Символы имени (два символа UCS-2 ) |
Если для представления имени файла требуется несколько записей LFN, запись, представляющая конец имени файла, идет первой. Порядковый номер этой записи имеет бит 6 ( 0x40 ), установленный для представления того, что это последняя логическая запись LFN, и она имеет наивысший порядковый номер. Порядковый номер уменьшается в следующих записях. Запись, представляющая начало имени файла, имеет порядковый номер 1. Значение 0xE5 используется для указания того, что запись удалена.
На томах FAT12 и FAT16 проверка значений 0x1A на равенство нулю и значений 0x1C на ненулевое значение может использоваться для различения VFAT LFN и ожидающих удаления файлов в DELWATCH.
Например, имя файла «Файл с очень длинным именем.ext» будет отформатировано следующим образом:
Порядковый номер | Входные данные |
---|---|
0x03 | "я.ext" |
0x02 | "y long filena" |
0x01 | "Файл с версией" |
??? | Нормальный 8.3 вход |
Контрольная сумма также позволяет проверить, соответствует ли длинное имя файла имени 8.3; такое несоответствие может возникнуть, если файл был удален и создан заново с помощью DOS в той же позиции каталога. Контрольная сумма вычисляется с использованием алгоритма ниже. (pFCBName — это указатель на имя, как оно отображается в обычной записи каталога, т. е. первые восемь символов — это имя файла, а последние три — расширение. Точка подразумевается. Любое неиспользуемое пространство в имени файла заполняется пробелами (ASCII 0x20 ). Например, "Readme.txt" будет иметь вид " ".)README␠␠TXT
беззнаковый символ lfn_checksum ( const беззнаковый символ * pFCBName ) { int i ; беззнаковый символ sum = 0 ; для ( i = 11 ; i ; i -- ) сумма = (( сумма & 1 ) << 7 ) + ( сумма >> 1 ) + * pFCBName ++ ; вернуть сумму ; }
Если имя файла содержит только строчные буквы или представляет собой комбинацию нижнего регистра базового имени с заглавным расширением или наоборот; и не имеет специальных символов и соответствует ограничениям 8.3, запись VFAT не создается в Windows NT и более поздних версиях Windows, таких как XP. Вместо этого два бита в байте 0x0C записи каталога используются для указания того, что имя файла следует считать полностью или частично строчным. В частности, бит 4 означает нижнее расширение , а бит 3 — нижнее регистровое базовое имя , что допускает такие комбинации, как " " или " ", но не " ". Немногие другие операционные системы поддерживают это. Это создает проблему обратной совместимости со старыми версиями Windows (Windows 95 / 98 / 98 SE / ME), которые видят имена файлов, состоящие полностью из заглавных букв, если использовалось это расширение, и, следовательно, могут изменить имя файла при его переносе между операционными системами, например, на флэш-накопителе USB. Текущие версии Linux 2.6.x распознают это расширение при чтении (источник: ядро 2.6.18 и ); параметр монтирования определяет, будет ли эта функция использоваться при записи. [71]example.TXT
HELLO.txt
Mixed.txt
/fs/fat/dir.c
fs/vfat/namei.c
shortname
/W:246
. В отличие от других утилит FDISK , DR-DOS FDISK не только инструмент для разбиения на разделы, но и может форматировать свежесозданную разделы как FAT12 , FAT16 или FAT32 . Это снижает риск случайного форматирования неправильных томов.IBMBIO␠␠COM
имени загрузочного файла по умолчанию " " можно изменить с помощью SYS /DR:ext
параметра, где ext представляет новое расширение. Другие потенциальные имена загрузочных файлов DR-DOS, которые можно ожидать в особых сценариях, это " DRBIOS␠␠SYS
", " DRDOS␠␠␠SYS
", " IO␠␠␠␠␠␠SYS
", " JO␠␠␠␠␠␠SYS
"./O
(для old ) заполнения первого байта всех записей каталога значением 0xE5 вместо использования конечного маркера 0x00 . Таким образом, том оставался доступным в PC DOS 1.0 - 1.1 , в то время как форматирование занимало несколько больше времени, а более новые версии DOS не могли воспользоваться значительным ускорением, вызванным использованием конечного маркера 0x00 .NO␠NAME␠␠␠␠
метки томов каталогов " ", если пользователь пропускает ввод метки тома. Операционная система по умолчанию будет возвращать ту же строку, если метка тома каталога не может быть найдена в корне тома, но без реальной метки тома, сохраненной в качестве первой записи (после записей каталога), старые операционные системы могут ошибочно выбирать записи VFAT LFN вместо этого.ACCDATE=drive1+|- [drive2+|-]...
"{{cite web}}
: Отсутствует или пусто |url=
( помощь )Относительно инструкции перехода в начале загрузочного сектора: «Определите, является ли первый байт загрузочного сектора E9H или EBIT (первый байт 3-байтового NEAR или 2-байтового короткого перехода) или EBH (первый байт 2-байтового перехода, за которым следует NOP). Если это так, то BPB располагается, начиная со смещения 3».(Примечание. В этой книге много ошибок.)
Нумерация начинается с 2; первые две цифры, 0 и 1, зарезервированы.
Кластеры не могут быть 64 килобайта или больше