Добрый день, дорогие читатели! Я попытаюсь подробно разжевать устройство и внутреннее строение файловой системы FAT12, которая является самой простой из семейства FAT. Эта система в основном использовалась на дискетах. В следующей статье я планирую изобрести велосипед на основе данной системы и написать программу на DCPU (вымышленный компьютер из игры 0x10c), которая бы форматировала дискету в велосипедной файловой системе. (Спецификация дискет и дисковода не была объявлена официально, но в 0x10c DevKit они присутствуют). Итак, если вам интересно понять как все наши папочки и файлики хранятся на диске, милости прошу под кат.
Следует заметить, что система устарела и ее почти не используют, но была выбрана именно она по двум причинам: она весьма проста для понимания и она как нельзя кстати подходит для такого простого устройства, как DCPU.
А теперь уберите детей и беременных женщин от экранов, потому что мы будет иметь дело с байтами в чистом виде.
Для начала определимся с дискетой. А именно с самой обыкновенной дискетой 3.5” с 1.44Мб на борту, которая всем нам так хорошо знакома. Так вот, всё место на дискете разбито на секторы, размер каждого сектора составляет 512 байт. Сектора объединяются в кластеры, но на дискете не так уж и много секторов (2848), поэтому каждый кластер содержит только один сектор.
Итак, файловая система. Самый первый сектор на дискете (нулевой) отводится под Boot Sector – загрузочный сектор. В нем хранится всякая полезная и важная информация. Сразу за ним следует FAT таблица. FAT расшифровывается как File AllocationTable – Таблица Размещения Файлов. Как правило, эта таблица дублируется с целью увеличения надежности. Первая и вторая таблицы занимают 1-9 и 10-18 сектора соответственно. После таблиц несколько секторов (на дискете это 14шт) отводятся под корневой каталог. И после всего этого уже идут секторы с содержимым файлов.
А теперь обо всем по порядку.
Boot Sector – Загрузочный сектор
Этот сектор занимает нулевой сектор на дискете. Он содержит очень важную информацию об устройстве файловой системы. Далее следуют номера байтов в секторе и то, что в них хранится:
- 0-10 — игнорируются
- 11-12 — количество байтов в каждом секторе
- 13 — количество секторов в каждом кластере
- 14-15 — количество зарезервированных секторов
- 16 — количество FAT таблиц
- 17-18 — максимальное число файлов и папок в корневой директории
- 19-20 — общее число секторов
- 21 — игнорируется
- 22-23 — количество секторов, которое требуется для каждой FAT таблицы
- 24-25 — количество секторов на дорожке (в дискете сектора еще объединяются в дорожки)
- 26-27 — количество головок
- 28-31 — игнорируется
- 32-35 — игнорируется в FAT12
- 36-37 — игнорируется
- 38 — boot signature — загрузочная подпись
- 39-42 — id тома
- 43-53 — метка тома
- 54-61 — тип файловой системы
- 62 — отсюда и до конца загрузочного сектора байты не используются
Немного объяснений:
Если байт загрузочной области установлен в 0x29, то следующие за ним 3 поля присутствуют.
Id тома используется как его серийный номер. Обычно его получают из времени создания тома.
Метка тома — это его название. По умолчанию выставляется в «NO NAME    ».
Тип файловой системы — для FAT12, это строка «FAT12   ». На самом деле большинство драйверов определяют тип системы не из этой строки, а на основе количества секторов в носителе (FAT12 выбирается, если на носителе не более 2^12 = 4096 секторов)
FAT таблица
FAT таблица очень похожа на массив, элементы которого состоят из 2х байтов. Каждый элемент соответствует сектору с данными, но тут мы используем не реальные, а логические сектора. Их отличие в том, что их нумерация начинается не с начала дискеты, а с начала области данных. То есть в нашем примере первые 33 сектора дискеты (0-32) заняты Boot сектором, FAT таблицами и корневым каталогом, то есть сами данные начинаются на 33 секторе. В FAT таблицах нулевой и первый элемент зарезервированы, поэтому мы начинаем со второго. Таким образом второй элемент FAT таблицы соответствует 33 сектору на дискете или 0 логическому сектору, а, например, пятый элемент — 36му и 3му логическому. Значения элемента могут быть 3х типов:
- Значение, указывающее на то, что сектор является последним в файле
- Значение, указывающее на то, что сектор в настоящее время не используется
- Порядковый номер следующего сектора файла
Вот более подробный список значений и того, что они означают:
- 0x000 — сектор не используется
- 0xFF0-0xFF6 — сектор зарезервирован
- 0xFF7 — плохой сектор
- 0xFF8-0xFFF — последний сектор в файле
- все остальные значения — порядковый номер следующего логического сектора файла
Небольшой пример. Представьте, что у нас на диске записано 2 файла. Это text.txt, который занимает 4 сектора и picture.png, который занимает 2 сектора. Пусть text.txt занимает 0, 2, 4 и 5 логические сектора в области данных (отсчет ведется с нуля), а picture.png — 1 и 3. Тогда FAT таблица будет выглядеть примерно так:
R 0x0000
R 0x0000 — первые 2 элемента зарезервированы, помните?
0 0x0002 — начало файла text.txt, тут хранится указатель на следующий сектор файла text.txt
1 0x0003 — начало picture.png и указатель на продолжение
2 0x0004 — продолжение text.txt
3 0x0FFF — последний сектор picture.png
4 0x0005 — предпоследний сектор text.txt
5 0x0FFF — последний сектор text.txt
Цифра перед значением показывает, с каким логическим сектором связан этот элемент. Буква «R» стоит перед зарезервированными, то есть неиспользуемыми элементами.
Директории
Директории (в том числе и корневая) хранятся на диске как файлы и занимают один или несколько секторов. Каждый сектор директории (512 байт) содержит указатели на 16 файлов, то есть по 32 байта на каждый указатель. Такой указатель описывает вложенную директорию или файл на диске и ссылается на него. Таким образом набор этих указателей полностью описывает внутреннее содержимое папки. Разберем эти указатели поподробнее. Номера байтов и их содержимое:
- 0-7 — имя файла
- 8-10 — расширение
- 11 — атрибуты
- 12-13 — зарезервировано, следовательно игнорируется
- 14-15 — время создания
- 16-17 — дата создания
- 18-19 — дата последнего использования
- 20-21 — игнорируется в FAT12
- 22-23 — дата последнего изменения
- 24-25 — время последнего изменения
- 26-27 — указание на первый логический сектор файла или директории
- 28-31 — размер файла в байтах
Если первый байт имени имеет значение 0x29, то этот указатель пуст (то есть файл был удален), но после него еще имеются указатели. Если же первый байт имени — 0x00, то указатель пуст и дальше все указатели тоже пусты.
Байт атрибутов описывает свойства файлов. Вот его допустимые значения:
- 0x01 — только чтение
- 0x02 — скрытый
- 0x04 — системный
- 0x08 — Volume Label (я так и не разобрался, что это такое)
- 0x10 — указывает на то, что файл является папкой
- 0x20 — архивный (Archive, тоже не разобрался)
- 0x40 — не используется
- 0x80 — не используется
Значения можно комбинировать. Например, если мы хотим чтобы наш файл был скрытой системной папкой, то мы устанавливаем этот байт в значение 0x16, потому-что 0x16 = 0x02 + 0x04 + 0x10.
Имя файла и расширение
В FAT12 выделяется 8 символов под имя файла и 3 символа под расширение. Если у файла имя занимает меньше 8ми символов, то оставшиеся заполняются пробелами (ASCII 32 или 0x20). То же самое и с расширением. Также все имена и расширения хранятся в ВЕРХНЕМ РЕГИСТРЕ. У директорий, кстати, тоже могут быть расширения. В одной папке не может находится сразу несколько файлов или директорий с одинаковыми именами и расширениями. Вот несколько примеров, слева то, что хранится на диске, а справа имена, которые мы дали файлам. Символом подчеркивания ("_") я заменил пробел для наглядности:
- «FOO_____BAR» — «foo.bar»
- «FOO_____BAR» — «Foo.Bar»
- «FOO_____BAR» — «FOO.BAR»
- «FOO________» — «foo»
- «FOO________» — «foo.»
- «PICKLE__A__» — «PICKLE.A»
- «PRETTYBGBIG» — «prettybg.big»
Имя файла ".big" является некорректным, потому-что имена не могут начинаться с точки.
Ну вот, теперь вы должны представлять себе устройство системы FAT12, надеюсь я все понятно разжевал. Тем не менее, если у вас возникнут какие-либо вопросы, то задавайте их в комментариях.
Автор: idg_dima
“FAT таблица очень похожа на массив, элементы которого состоят из 2х байтов.”
FAT12 – 1,5 байта. Ну и другие несоответствия.
Полно неточностей!