Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - FAT - Структура системы FAT16 июня 2011Оглавление: 1. FAT 2. Структура системы FAT 3. Отказоустойчивость системы 4. Лицензирование В файловой системе FAT смежные секторы диска объединяются в единицы, называемые кластерами. Количество секторов в кластере может быть равно 1 или степени двойки. Для хранения данных файла отводится целое число кластеров, так что, например, если размер файла составляет 40 байт, а размер кластера 4 кбайт, реально занят информацией файла будет лишь 1% отведенного для него места. Для избежания подобных ситуаций целесообразно уменьшать размер кластеров, а для сокращения объема адресной информации и повышения скорости файловых операций – наоборот. На практике выбирают некоторый компромисс. Так как емкость диска вполне может и не выражаться целым числом кластеров, обычно в конце тома присутствуют т.н. surplus sectors – «остаток» размером менее кластера, который не может отводиться ОС для хранения информации. Пространство тома FAT32 логически разделено на три смежные области:
В FAT12 и FAT16 также специально выделяется область корневого каталога. Она имеет фиксированное положение и фиксированный размер в секторах. Если кластер принадлежит файлу, то соответствующая ему ячейка содержит номер следующего кластера этого же файла. Если ячейка соответствует последнему кластеру файла, то она содержит специальное значение. Таким образом выстраивается цепочка кластеров файла. Неиспользуемым кластерам в таблице соответствуют нули. «Плохим» кластерам также соответствует специальный код. При удалении файла первый знак имени заменяется специальным кодом E516 и цепочка кластеров файла в таблице размещения обнуляется. Поскольку информация о размере файла при этом остаётся нетронутой, в случае, если кластеры файла располагались на диске последовательно и они не были перезаписаны новой информацией, возможно восстановление удалённого файла. Загрузочная записьПервая важная структура тома FAT называется BPB и расположена в зарезервированной области, в нулевом секторе. В контексте BPB слово BIOS не имеет отношения к загрузочной программе, расположенной в чипе CMOS, а означает Basic Input-Output System в смысле «нижней» части MS-DOS 2.0, которая отвечала за драйвера устройств, в дополнение «верхней» части – BDOS. BIOS Parameter BlockBPB в принципе отсутствовал в FAT, обслуживавшей MS-DOS 1.x, так как в то время предполагалось лишь два различных типа тома – одно- и двусторонние пятидюймовые дискеты на 360 кб, причем формат тома определялся по первому байту области FAT. BPB был введен в MS-DOS 2.x в начале 1983 г. как обязательная структура загрузочного сектора, по которой впредь следовало определять формат тома; старая схема определения по первому байту FAT лишилась поддержки. Также в MS-DOS 2.0 была введена иерархия файлов и папок. Структура BPB в MS-DOS 2.x содержала 16-битное поле «общего количества секторов», что означало принципиальную неприменимость этой версии FAT для томов объемом более 2 = 65536 секторов, т.е. более 32 Мб при стандартном размере сектора 512 байт. В MS-DOS 4.0 вышеназванное поле BPB было расширено до 32 бит, что означало увеличение максимального размера тома до 2 = 4294967296 секторов, т.е. до 2 Гб при 512-байтном секторе. Следующая модификация BPB появилась вместе с Windows 95 OSR2, в которой была введена FAT32. Было снято двухгигабайтное ограничение на размер тома, том FAT32 теоретически может иметь размер до 8 Тб. Впрочем, размер каждого отдельного файла при этом не может превышать 4 Гб. BIOS Parameter Block FAT32 в целях совместимости с ранними версиями FAT повторяет BPB FAT16 вплоть до поля BPB_TotSec32 включительно, далее следуют различия.
FSInfoЗагрузочная запись раздела FAT32 содержит структуру под названием FSInfo, используемую для хранения значения числа свободных кластеров тома. FSInfo, как правило, занимает сектор 1 и имеет следующую структуру:
Смысл введения FSInfo в оптимизации работы системы, так как в FAT32 таблица индексных указателей может иметь значительные размеры и ее побайтовый просмотр может занять значительное время. Однако значения полей FSI_Free_Count и FSI_Nxt_Free могут не соответствовать действительности и должны проверяться на адекватность. Кроме того, они даже не обновляются в резервной копии FSInfo, расположенной, как правило, в секторе 7. Определение типа FAT томаОпределение типа FAT тома производится ОС по количеству кластеров в томе, которое в свою очередь определяется из полей BPB. Прежде всего вычисляется количество секторов корневого каталога: RootDirSectors = / BPB_BytsPerSec Далее определяется, какие из полей BPB_FATSz16/32 и BPB_TotSec16/32 не равны нулю, и они используются при определении количества секторов области данных тома: DataSec = TotSec – + RootDirSectors) Наконец, определяется количество кластеров области данных: CountofClusters = DataSec / BPB_SecPerClus По количеству кластеров проводится однозначное соответствие с файловой системой:
Согласно официальной спецификации, это единственный допустимый способ определения типа FAT. Искусственное создание тома, нарушающего указанные правила соответствия, приведет к его некорректной обработке Windows. Тем не менее, рекомендуется избегать значений CountofClusters, близких к критическим, для верного определения типа файловой системы любыми, часто некорректно написанными драйверами. На дискете при форматировании всегда создается FAT12. Что касается жестких и флэш-дисков, то при размере диска до 512 Мб по умолчанию создается FAT16, свыше 512 Мб – FAT32. Размер кластера определяется при форматировании исходя из файловой системы и размера тома. Серийный номер томаСерийный номер тома в Windows 98 создается из даты и времени форматирования таким образом, что восстановить их невозможно без дополнительной информации. Таблица FATСледующая важная структура тома FAT – это сама таблица FAT, занимающая отдельную логическую область. Она определяет список кластеров, в которых размещаются файлы и папки тома. Между кластерами и индексными указателями таблицы имеется взаимно однозначное соответствие – N-й указатель соответствует кластеру с тем же номером. Первому кластеру области данных присваивается номер 2. Значение индексного указателя соответствует состоянию соответствующего кластера. Возможны следующие состояния:
Кластеры 0 и 1 отражаются FAT особо. Индексный указатель, соответствующий нулевому кластеру, содержит значение BPB_Media в нижних 8 битах; остальные биты устанавливаются в 1. Например, если BPB_Media = 0xF8, FAT = 0x0FFFFFF8 для FAT32. Таким образом, формально FAT = EOC, что используется при обработке файлов нулевого размера. Второй зарезервированный указатель, FAT, при форматировании устанавливается в значение метки EOC. В FAT12 он не используется больше никак, а в FAT16 и FAT32 верхние два бита этого указателя могут содержать отметку о необходимости проверки тома, при чем все остальные биты выставлены в 1. Наличие грязного бита проверяется в процессе загрузки Windows программой autochk.exe. Грязный бит формируется при некорректном отключении тома или при аппаратной ошибке носителя и соответственно принимает два возможных значения. Индексный указатель FAT32 по определению является 32-битным, однако верхние 4 бита в действительности игнорируются, так что значение указателя по сути является 28-битным. Единственной операцией, оперирующей с верхними 4 битами указателя, является форматирование тома, когда обнуляется весь указатель. Это означает, что, например, значения указателя 0x10000000, 0xF0000000 и 0x00000000 все соответствуют свободному кластеру, так как они отличаются лишь в верхних 4 битах. Значение размера таблицы FAT по BPB, т.е. BPB_FATSz16/32, может превышать реальное, так что в конце каждой таблицы FAT могут находиться сектора, не соответствующие никаким реальным кластерам данных. При форматировании эти сектора обнуляются, а в процессе функционирования тома никак не используются. Поэтому действительный адрес последнего сектора таблицы FAT, содержащего указатели на реальные кластеры тома, всегда должен рассчитываться из общего количества кластеров области данных, а не из поля BPB_FATSz16/32. Кроме того, последний сектор, занятый таблицей FAT, вовсе не обязательно весь занят ею – в этом случае избыточное пространство сектора так же не используется и забивается нулями при форматировании тома. Файловые записиНепосредственно после окончания последней таблицы FAT следует область данных, содержащая файлы и папки. Каталог FAT является обычным файлом, помеченным специальным атрибутом. Данными такого файла в любой версии FAT является цепочка 32-байтных файловых записей. Директория не может штатно содержать два файла с одинаковым именем. Если программа проверки диска обнаруживает искусственно созданную пару файлов с идентичным именем в одном каталоге, один из них переименовывается. Корневой каталогЕдинственным обязательно присутствующим каталогом является корневой каталог. В FAT12/FAT16 корневой каталог имеет фиксированный размер в секторах, который вычисляется из значения BPB_RootEntCnt, и следует на диске непосредственно после таблицы FAT. В FAT32 корневой каталог, как любой другой, имеет переменный размер и является цепочкой кластеров. Номер первого кластера корневого каталога отражается BPB_RootClus. Корневой каталог имеет следующие отличия от других каталогов тома FAT:
Структура файловой записиФайловая запись FAT32 состоит из следующих структур:
Если первый байт записи FAT суть 0xE5 или 0x05, это значит, что запись свободна. Если DIR_Name = 0х00, это значит, что свободна не только эта запись, но и все записи директории после нее; Windows не анализирует остаток каталога после обнуленной записи. Имя файла в FATПоле DIR_Name логически разбивается на первые 8 символов, образующие имя файла, и последние 3, образующие расширение. Точка-разделитель добавляется на уровне файловой системы и не включается в поле имени. Если имя и расширение файла не заполняют отведенное для них место, остальные байты поля DIR_Name забиваются пробелами. Имя и расширение файла могут содержать любую комбинацию букв, цифр или символов с ASCII-кодами свыше 127; специальные символы распределяются на три группы: Файловые атрибутыВ байте атрибутов верхние два бита являются резервными и всегда должны быть обнулены. Остальные биты распределяются таким образом, что значение 0x01 соответствует атрибуту «только для чтения», 0x02 – «скрытый», 0x04 – «системный», 0x20 – «архивный». Набор нескольких атрибутов составляется суммированием основных значений. Кроме этих стандартных атрибутов, используются ещё следующие: 0x10 – свидетельствует, что файл является каталогом; 0x08 – ATTR_VOLUME_ID, специальный атрибут уникального файла нулевого размера в корневом каталоге, имя которого считается меткой тома. Ограничение длины метки тома FAT в 11 символов связано с размером поля DIR_Name. Если файл имеет набор атрибутов READ_ONLY | HIDDEN | SYSTEM | VOLUME_ID, это свидетельствует, что запись не соответствет отдельному файлу, а содержит часть длинного имени другого файла, не вписывающегося в рамки 8.3. Искусственное присвоение ненулевого значения верхним двум битам DIR_Attr используется для формирования файлов, которые невозможно удалить или переименовать штатными средствами файловой системы без форматирования. Это полезно, например, при борьбе с вирусами Autorun.inf. С другой стороны, это же средство могут использовать сами вирусы. Значение DIR_Attr = 0x40 резервировано для внутреннего использования. Что происходит при создании каталогаПри создании каталога для него «пожизненно» выставляется DIR_FileSize = 0. Размер содержимого каталога определяется простым следованием по цепочкам кластеров до метки End Of Chain. Размер самого каталога лимитируется файловой системой в 65 535 32-байтных записей. Это ограничение призвано ускорить операции с файлами и позволить различным служебным программам использовать 16 битное целое для подсчета количества записей в директории.. Каталогу отводится один кластер области данных и полям DIR_FstClusHI / DIR_FstClusLO присваивается значение номера этого кластера. В таблицу FAT для записи, соответствующей этому кластеру, помещается метка EOC, а сам кластер забивается нулями. Далее создаются два специальных файла, без которых директория FAT считается поврежденной – файлы нулевого размера “dot” и “dotdot” с именами “.” и “..” соотв. Штампы даты-времени этих файлов приравниваются значениям для самого каталога на момент создания и не обновляются при изменениях каталога. Поля DIR_FstClusHI / DIR_FstClusLO файла «.» содержат значение номера содержащего его кластера, а файла «..» – номера первого кластера каталога, содержащего данный. Таким образом, файл «.» отсылает к самому каталогу, а файл «..» – к начальному кластеру родительского каталога; если родительский каталог – корневой, начальным кластером считается нулевой. Время и датаДвухбайтовый штамп даты имеет следующий формат: биты 0-4 – день месяца, допускаются значения 1-31; биты 5-8 – месяц года, допускаются значения 1-12; биты 9-15 – год, считая от 1980 г., возможны значения от 0 до 127 включительно, т.е. 1980-2107 гг. Два байта, отвечающие штампу времени, распределяются так: биты 0-4 – счетчик секунд, допустимы значения 0-29, т.е. 0-58 секунд; биты 5-10 – минуты, допустимы значения 0-59; биты 11-15 – часы, допустимы значения 0-23. Из штампов даты-времени критическим является лишь штамп времени последней модификации, остальные могут не поддерживаться многими системами; при операциях с файлом в такой системе такие поля игнорируются. FAT сохраняет штампы даты-времени по местному часовому поясу, при его смене штампы не изменяются. Временные штампы каталогов задаются при создании и не изменяются при записи новых файлов в каталог, переименовании или выделении ему нового кластера. Дата последнего доступа к файлу обновляется при каждом обращении, например при просмотре свойств файла, при перемещении на другой том. При копировании файла в Windows 98 дата последнего доступа исходного файла обновляется, в Windows XP – нет. Дата-время модификации файла изменяется при каждой записи нового содержимого в области данных. Другими словами, дата-время модификации не изменяется при смене атрибутов или переименовании файла. Перемещение или копирование файла сохраняет исходный штамп модификации. Дата-время создания задается при выделении файловой записи для нового, не существовавшего до этого файла. Иначе говоря, при переименовании или перемещении файла дата-время создания не изменяется, а при копировании новый файл получает новый штамп. Таким образом, при копировании файла в Windows файл может получить более позднюю дату создания, чем дату модификации. LFN-записиФайлы и каталоги с длинным именем обрабатываются файловой системой FAT особым образом. Структура 32-битной записи для файла с LFN отличается от обычной:
Набор LFN-записей каталога FAT всегда должен быть связан с обычной SFN-записью, которой физически предшествует на диске. Набор LFN-записей, обнаруженный без соответствующей обычной записи, называется орфаном и запись считается поврежденной; подобный файл является совершенно невидимым в старых версиях MS-DOS/Windows. В последовательности LFN-записей каждая из них имеет собственный порядковый номер, определяемый первым байтом. Маска 0х40 свидетельствует, что данная запись является крайней в ряду следующих за ней LFN-записей. В последующих записях этот байт изменяется от N для N-й «длинной» записи по счету от соответствующей обычной, до 1 для ближайшей к обычной записи. Длинные имена файлов хранятся в кодировке UNICODE, при этом сохраняется вводимый регистр буквенных символов. Если некоторый символ имени в кодировке OEM или UNICODE не может быть превращен в символ кодовой страницы, он всегда отображается в виде символа подчеркивания «_», при чем сохраненный на диске действительный символ не изменяется. Байт контрольной суммы вычисляется по определенному алгоритму на основе 8.3 имени обычной записи и копируется во все соответствующие ей «длинные» записи. Если какое-либо из значений не согласуется с именем файла, возникает орфан. 8.3-Псевдоним файла с длинным именем состоит из основной части и, при необходимости, цифрового «хвоста». Если файл имеет расширение, его первые 3 символа сохраняются в псевдониме. Соответствующее имя образуется переводом в кодировку OEM символов длинного имени файла, причем все пробелы длинного имени игнорируются, а символы, непереводимые в OEM либо запрещенные в контексте короткого имени, заменяются подчеркиванием «_». Цифровой хвост «~n», где n = 1 ÷ 999999, добавляется к псевдониму, если первоначально полученный псевдоним конфликтовал с именем какого-либо файла в той же директории, либо превышал стандарт 8.3, или если какой-либо символ при смене кодировки не нашел OEM-аналога и был заменен подчеркиванием. Таким образом образуются псевдонимы типа NEWFIL~1.DJV. Схема образования псевдонима файла оптимизирована для скорости операций и поэтому малопредсказуема в подробностях. Имя файла длиной, некратной 13 символам, не заполняет поля имени LFN-записей таблицы FAT полностью. В таком случае имя файла искусственно оканчивается символом NUL, а избыточные байты забиваются единицами. Для длинных имен длина имени ограничена 255 символами, не считая разделителя NUL, а полный путь – 260 символами, включая NUL. В длинном имени также допускается использование шести специальных символов, запрещенных в коротких именах: + , ; = При попытке создания в томе FAT32 файла или каталога с именем, содержащим такой символ, автоматически генерируется LFN-запись независимо от длины имени файла. Аналогичный процесс происходит при создании файла/папки с именем, содержащим не-ASCII символы. Возможна ситуация, когда файл метки тома физически не предшествует всем записям тома с длинными именами. Тогда метка тома в FAT12/FAT16 будет отображаться неправильно, так как будет взята из ближайшей LFN-записи, и при попытке изменения метки тома в действительности будет происходить нарушение имени соответствующего файла. При удалении файла, имеющего ассоциированные LFN-записи, последние не затрагиваются и становятся орфаном. При дальнейшем создании нового файла упомянутый орфан может быть ошибочно ассоциирован с ним в случае совпадения контрольных сумм имен старого и нового файлов, однако используемый алгоритм вычисления контрольной суммы делает такую вероятность ничтожно малой. Смысл файловых операций в FATФорматирование тома – таблица индексных указателей обнуляется, за исключением первых трех и записей поврежденных кластеров; записи корневого каталога обнуляются, в остальном область данных не затрагивается. Удаление файла – первый символ файловой записи и всех ассоциированных LFN-записей заменяется кодом 0xE5; занимаемые файлом кластеры помечаются в таблице FAT как свободные, а в области данных не затрагиваются. Создание файла или каталога командой «Создать» контекстного меню – создается файловая запись для нового «пустого» файла с именем по умолчанию и размером, определяемым типом файла; сам файл, если имеет ненулевой размер записывается в области данных в выделенные ему кластеры; в таблице FAT создается соответствующая кластерная цепочка. После присвоения файлу действительного имени первоначально созданная файловая запись помечается как удаленная и создается новая. Переименование файла – создается новая запись с обновленным именем; старая запись помечается как удаленная. Сохранение файла из приложения – создается запись, содержащая все поля, кроме размера и начального кластера файла; после завершения сохранения файла создается новая запись, содержащая все поля, а прежняя удаляется. Копирование файла – в новом местоположении создается идентичная файловая запись, файлу выделяется первый свободный кластер и содержимое файла копируется в новое место, при чем происходит копирование текущего кластера, поиск следующего свободного и заполнение таблицы FAT. Перемещение файла – копирование с последующим удалением файла из исходного местоположения. Перемещение файла – кластерная цепочка не затрагивается, файловая запись копируется без изменения в новый каталог, после чего удаляется из прежнего. Поиск свободного кластера по таблице индексных указателей для выделения новому файлу начинается в общем случае не с начала области данных, а с последнего выделенного какому-либо файлу кластера, номер которого сохраняется в структуре FSInfo. Другими словами, если файлу 1 был отведен кластер 30, а файлу 2 – кластер 31, после чего файл 1 был удален, то при создании нового файла 3 он, скорее всего, будет физически размещен начиная с кластера 32. Просмотров: 7985
|