Файловая система FAT — это файловая система , используемая в операционных системах семейства MS-DOS и Windows 9x . [3] Она по-прежнему используется на мобильных устройствах и встроенных системах и, таким образом, является хорошо подходящей файловой системой для обмена данными между компьютерами и устройствами практически любого типа и возраста с 1981 года по настоящее время.
Файловая система FAT состоит из четырех областей:
FAT использует формат с прямым порядком байтов для всех записей в заголовке (за исключением, где это явно указано, некоторых записей в загрузочных секторах Atari ST) и FAT(ов). [5] Можно выделить больше секторов FAT, чем необходимо для количества кластеров. Конец последнего сектора каждой копии FAT может быть неиспользован, если нет соответствующих кластеров. Общее количество секторов (как указано в загрузочной записи) может превышать количество секторов, используемых данными (кластеры × секторы на кластер), FAT (количество FAT × секторы на FAT), корневым каталогом (н/д для FAT32) и скрытые сектора, включая загрузочный сектор: это приведет к появлению неиспользуемых секторов в конце тома. Если раздел содержит больше секторов, чем общее количество секторов, занимаемых файловой системой, это также приведет к появлению неиспользуемых секторов в конце раздела после тома.
На неразделенных устройствах хранения данных , таких как дискеты , загрузочный сектор ( VBR ) является первым сектором (логический сектор 0 с физическим адресом CHS 0/0/1 или адресом LBA 0). Для многораздельных устройств хранения данных, таких как жесткие диски, загрузочный сектор — это первый сектор раздела, как указано в таблице разделов устройства.
ДОС 3.0 БПБ:
Следующие расширения были задокументированы начиная с DOS 3.0, однако они уже поддерживались некоторыми выпусками DOS 2.11. [28] MS-DOS 3.10 по-прежнему поддерживал формат DOS 2.0, но также мог использовать формат DOS 3.0.
ДОС 3.2 БПБ:
Официально MS-DOS 3.20 по-прежнему использовал формат DOS 3.0, но SYS
уже FORMAT
был адаптирован для поддержки формата длиной на 6 байт (из которого использовались не все записи).
ДОС 3.31 БПБ:
Некоторые утилиты DOS 3.2, официально представленные в DOS 3.31 и не используемые в DOS 3.2, были разработаны с учетом этого нового формата. Официальная документация рекомендует доверять этим значениям только в том случае, если запись логического сектора по смещению 0x013 равна нулю.
Простая формула переводит заданный номер кластера тома 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):
По сути, FAT32 вставляет 28 байтов в EBPB, за которыми следуют оставшиеся 26 (или иногда только 7) байтов EBPB, как показано выше для FAT12 и FAT16. Операционные системы Microsoft и IBM определяют тип файловой системы FAT, используемой на томе, исключительно по количеству кластеров, а не по используемому формату BPB или указанному типу файловой системы, то есть технически возможно использовать «FAT32 EBPB». также для томов FAT12 и FAT16, а также EBPB DOS 4.0 для небольших томов FAT32. Поскольку было обнаружено, что такие тома создаются операционными системами Windows при некоторых странных условиях, [nb 6] операционные системы должны быть готовы справиться с этими гибридными формами.
Версии DOS до 3.2 полностью или частично полагались на байт дескриптора носителя в BPB или байт идентификатора FAT в кластере 0 первой FAT для определения форматов дискет FAT12, даже если BPB присутствует. В зависимости от найденного FAT ID и обнаруженного типа диска они по умолчанию используют один из следующих прототипов BPB вместо использования значений, фактически хранящихся в BPB. [номер 1]
Первоначально FAT ID должен был представлять собой битовый флаг со всеми установленными битами, за исключением бита 2, очищенного для обозначения формата с 80 дорожками (против 40 дорожек), бита 1 сброшенного для обозначения формата с 9 секторами (против 8 секторов). и бит 0 очищен, чтобы указать односторонний (а не двусторонний) формат, [7] но этой схеме не следовали все OEM-производители, и она устарела с появлением жестких дисков и форматов высокой плотности. Кроме того, различные 8-дюймовые форматы, поддерживаемые 86-DOS и MS-DOS, не соответствуют этой схеме.
Microsoft рекомендует различать два 8-дюймовых формата FAT ID 0xFE , пытаясь прочитать адресную метку одинарной плотности. Если это приводит к ошибке, значит, среда должна быть двойной плотности. [23]
В таблице не указан ряд несовместимых форматов 8-дюймовых и 5,25-дюймовых дискет FAT12, поддерживаемых 86-DOS , которые отличаются либо размером записей каталога (16 байт против 32 байтов), либо размером зарезервированного область секторов (несколько целых дорожек вместо одного логического сектора).
Реализация одностороннего формата FAT12 размером 315 КБ, используемая в MS-DOS для Apricot PC и F1e [34] , имела другую структуру загрузочного сектора, чтобы соответствовать BIOS этого компьютера, не совместимому с IBM. Инструкция перехода и 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]
«Информационный сектор ФС» был введен в FAT32 [38] для ускорения времени доступа к определенным операциям (в частности, получению количества свободного места). Он расположен по номеру логического сектора, указанному в загрузочной записи FAT32 EBPB в позиции 0x030 (обычно это логический сектор 1, сразу после самой загрузочной записи).
Данные сектора могут быть устаревшими и не отражать текущее содержимое носителя, поскольку не все операционные системы обновляют или используют этот сектор, и даже если они это делают, содержимое недействительно, когда носитель был извлечен без надлежащего отключения тома или после сбой питания. Поэтому операционные системы должны сначала проверить дополнительные битовые флаги состояния завершения работы тома, находящиеся в записи FAT кластера 1 или FAT32 EBPB по смещению 0x041, и игнорировать данные, хранящиеся в информационном секторе FS, если эти битовые флаги указывают на то, что том не был должным образом отключен. до. Это не вызывает никаких проблем, кроме возможного снижения скорости при первом запросе свободного пространства или выделении кластера данных; см. фрагментация.
Если этот сектор присутствует в томе FAT32, минимально допустимый размер логического сектора составляет 512 байт, тогда как в противном случае он будет составлять 128 байт. Некоторые реализации FAT32 поддерживают небольшое изменение спецификации Microsoft, делая информационный сектор FS необязательным, указав значение 0xFFFF [19] (или 0x0000 ) в записи по смещению 0x030 .
Область данных тома разделена на кластеры одинакового размера — небольшие блоки непрерывного пространства. Размеры кластеров различаются в зависимости от типа используемой файловой системы FAT и размера диска; типичные размеры кластеров варьируются от 2 до 32 КиБ . [39]
Каждый файл может занимать один или несколько кластеров в зависимости от его размера. Таким образом, файл представлен цепочкой кластеров (называемой односвязным списком ). Эти кластеры не обязательно хранятся рядом друг с другом на поверхности диска, а зачастую фрагментированы по всей области данных.
Каждая версия файловой системы FAT использует разные размеры записей FAT. Меньшие числа приводят к меньшему размеру FAT, но приводят к потере пространства в больших разделах из-за необходимости выделять его в большие кластеры.
Файловая система FAT12 использует 12 бит на запись FAT, поэтому две записи занимают 3 байта. Это последовательно прямой порядок байтов : если эти три байта рассматриваются как одно 24-битное число с прямым порядком байтов, 12 младших битов представляют первую запись (например, кластер 0), а 12 старших битов - вторую (например, кластер 1). . Другими словами, хотя младшие восемь битов первого кластера в строке хранятся в первом байте, старшие четыре бита хранятся в младшем полубайте второго байта, тогда как младшие четыре бита последующего кластера в строке хранятся в старшем полубайте второго байта и в восьми старших битах третьего байта.
Файловая система FAT16 использует 16 бит на запись FAT, поэтому одна запись занимает два байта в прямом порядке байтов:
Файловая система FAT32 использует 32 бита на запись FAT, таким образом, одна запись занимает четыре байта в порядке байтов с прямым порядком байтов. Четыре старших бита каждой записи зарезервированы для других целей; они очищаются во время форматирования и в противном случае не должны изменяться. Их необходимо замаскировать, прежде чем интерпретировать запись как 28-битный адрес кластера.
Таблица размещения файлов ( FAT ) представляет собой непрерывное количество секторов, следующих сразу за областью зарезервированных секторов. Он представляет собой список записей, сопоставленных с каждым кластером тома. Каждая запись записывает одну из четырех вещей:
Чтобы очень ранние версии DOS распознавали файловую систему, система должна быть загружена с тома, или FAT тома должна начинаться со второго сектора тома (логический сектор 1 с физическим адресом CHS 0/0/2 или адресом LBA 1). , то есть сразу после загрузочного сектора. Операционные системы предполагают это жесткое расположение FAT, чтобы найти идентификатор FAT в записи кластера 0 FAT на дискетах FAT DOS 1.0–1.1, где не найден действительный 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) этой записи всегда равны 1. Эти значения расположены так, чтобы запись также функционировала как завершающий элемент «ловушки для всех». -маркер цепочки для всех кластеров данных, содержащий нулевое значение. Кроме того, для идентификаторов FAT, отличных от 0xFF (и 0x00 ), можно определить правильный порядок полубайтов и байтов, используемый драйвером файловой системы, однако файловая система FAT официально использует только представление с прямым порядком байтов , и там не известны реализации вариантов, использующих вместо этого значения с прямым порядком байтов . От 86-DOS 0.42 до MS-DOS 1.14 вместо FAT ID использовались профили жесткого диска, но этот байт использовался для различения носителей, отформатированных с помощью 32-байтовых или 16-байтовых записей каталога, поскольку они использовались до 86-DOS 0.42 до MS-DOS 1.14. ДОС 0.42.
Вторая запись (кластер 1 в FAT) номинально хранит маркер конца цепочки кластеров, используемый форматировщиком, но обычно всегда содержит 0xFFF / 0xFFFF / 0x0FFFFFF , то есть за исключением битов 31-28 в FAT32. тома эти биты обычно всегда установлены. Однако некоторые операционные системы Microsoft устанавливают эти биты, если том не является томом, на котором находится работающая операционная система (то есть здесь используйте 0xFFFFFFFF вместо 0x0FFFFFFFF ). [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] (Аналогичный набор битовых флагов существует в EBPB FAT12/FAT16 по смещению 0x1A или EBPB FAT32 по смещению 0x36 . Хотя запись кластера 1 может быть доступна драйверам файловой системы после монтирования тома, Запись EBPB доступна, даже если том не смонтирован, и, следовательно, ее проще использовать драйверами блочных устройств диска или инструментами создания разделов.)
Если количество FAT в BPB не установлено равным 2, вторая запись кластера в первом FAT (кластер 1) также может отражать состояние тома TFAT для операционных систем, поддерживающих TFAT. Если запись кластера 1 в этой FAT содержит значение 0, это может указывать на то, что вторая FAT представляет последнее известное допустимое состояние транзакции и должна быть скопирована поверх первой FAT, тогда как первая FAT должна быть скопирована во вторую FAT, если все биты установлены.
Некоторые нестандартные реализации FAT12/FAT16 используют запись кластера 1 для хранения начального кластера корневого каталога переменного размера (обычно 2 [33] ). Это может произойти, когда количество записей корневого каталога в BPB имеет значение 0 и EBPB FAT32 не найден (нет подписи 0x29 или 0x28 по смещению 0x042 ). [20] Однако это расширение не поддерживается основными операционными системами, [20] поскольку оно конфликтует с другими возможными вариантами использования записи кластера 1. Большинство конфликтов можно исключить, если это расширение разрешено только для томов FAT12 с размером менее 0xFEF и томов FAT16 с кластерами менее 0x3FEF и 2 FAT.
Поскольку эти первые две записи FAT хранят специальные значения, кластеры данных 0 или 1 отсутствуют. Первый кластер данных (после корневого каталога, если FAT12/FAT16) — это кластер 2, [33] обозначающий начало области данных.
Значения записи FAT:
FAT32 использует 28 бит для номеров кластеров. Остальные 4 бита в 32-битной записи FAT обычно равны нулю, но они зарезервированы и их следует оставлять нетронутыми. Стандартный драйвер файловой системы или инструмент обслуживания FAT32 не должен полагаться на то, что старшие 4 бита равны нулю, и он должен удалить их перед оценкой номера кластера, чтобы справиться с возможными будущими расширениями, когда эти биты могут использоваться для других целей. Они не должны очищаться драйвером файловой системы при выделении новых кластеров, но должны быть очищены во время переформатирования.
Таблица корневых каталогов в файловых системах FAT12 и FAT16 занимает специальную область корневого каталога .
За исключением таблицы корневого каталога в файловых системах FAT12 и FAT16, которая занимает специальную область корневого каталога , все таблицы каталогов хранятся в области данных. Фактическое количество записей в каталоге, хранящемся в области данных, может увеличиться за счет добавления еще одного кластера в цепочку в 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 символов (включая букву диска, но исключая нулевой байтовый разделитель), [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 имеют CDS, совместимый с MS-DOS, и поэтому имеют те же ограничения по длине, что и 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 ):
Операционные системы IBM 4680 OS и IBM 4690 на базе FlexOS поддерживают уникальные атрибуты распределения, хранящиеся в некоторых битах ранее зарезервированных областей в записях каталога: [62]
Некоторые несовместимые расширения, обнаруженные в некоторых операционных системах, включают:
Варианты файловых систем 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 кластеров = 2 091 520 байт (2 042,5 КБ)
Минимум FAT32: 1 сектор на кластер × 65 525 кластеров = 33 548 800 байт (32 762,5 КБ)
Максимум FAT12: 64 сектора на кластер × 4, 084 кластеры = 133 824 512 байт (≈ 127 МБ)
[максимум FAT12: 128 секторов на кластер × 4 084 кластера = 267 694 024 байт (≈ 255 МБ)]
Максимум FAT16: 64 сектора на кластер × 65 524 кластера = 2 147 090 432 байта (≈2 ,047 МБ)
[максимум FAT16 : 128 секторов на кластер × 65 524 кластера = 4 294 180 864 байт (≈4 095 МБ)]
Максимум FAT32: 8 секторов на кластер × 268 435 444 кластера = 1 099 511 578 624 байт (≈1 024 ГБ)
Максимум FAT32: 16 секторов на кластер × 2 68 173 557 кластеров = 2 196 877 778 944 байт (≈ 2046 ГБ)
[Максимум 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
Спецификация Microsoft EFI FAT32 [4] гласит, что любая файловая система FAT с числом кластеров менее 4085 — это FAT12, в противном случае любая файловая система FAT с числом кластеров менее 65 525 — это FAT16, а в противном случае — FAT32. Запись для кластера 0 в начале FAT должна быть идентична байту дескриптора носителя, найденному в BPB, тогда как запись для кластера 1 отражает значение конца цепочки, используемое форматировщиком для цепочек кластеров ( 0xFFF , 0xFFFF или 0x0FFFFFF ). Записи для номеров кластеров 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] или, как это указано в спецификации Microsoft FAT: [ 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 для создания временных файлов.
Кроме того, начиная с DOS 3.0, записи каталога удаленных файлов будут помечены как 0xE5 . [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 с помощью хитрости: добавление дополнительных записей в каталог перед обычной записью файла. Дополнительные записи помечаются атрибутами «Метка тома», «Система», «Скрытый» и «Только для чтения» (дающими значение 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 имеют следующий формат:
Если для представления имени файла требуется несколько записей LFN, первой идет запись, представляющая конец имени файла. Порядковый номер этой записи имеет бит 6 ( 0x40 ), обозначающий, что это последняя логическая запись LFN и она имеет наивысший порядковый номер. Порядковый номер уменьшается в следующих записях. Запись, представляющая начало имени файла, имеет порядковый номер 1. Значение 0xE5 используется для указания того, что запись удалена.
На томах FAT12 и FAT16 проверка того, чтобы значения в 0x1A были равны нулю, а в 0x1C были ненулевыми, можно использовать для различения VFAT LFN и файлов, ожидающих удаления в DELWATCH.
Например, имя файла типа «Файл с очень длинным именем файла.ext» будет отформатировано следующим образом:
Контрольная сумма также позволяет проверить, соответствует ли длинное имя файла имени 8.3; такое несоответствие могло произойти, если файл был удален и заново создан с помощью DOS в той же позиции каталога. Контрольная сумма рассчитывается по приведенному ниже алгоритму. (pFCBName — это указатель на имя, которое появляется в обычной записи каталога, т. е. первые восемь символов — это имя файла, а последние три — расширение. Точка является неявной. Любой неиспользуемый пробел в имени файла дополняется пробелами. (ASCII 0x20 ). Например, "Readme.txt" будет " ".)README␠␠TXT
беззнаковый символ lfn_checksum ( const unsigned char * pFCBName ) { int i ; беззнаковая сумма символов = 0 ; for ( i = 11 ; i ; i -- ) sum = (( sum & 1 ) << 7 ) + ( sum >> 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
(для старых версий ) заполнения первого байта всех записей каталога значением 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 килобайта или больше.