Вы находитесь на странице: 1из 2

Подробное описание FAT32 (как устроены файловые записи, как работает таблица)

Для начала про файловые записи

Так выглядит файловая запись в FAT32. Большинство полей нам не интересны, нужны только следующие:

 DIR_Name – 11 байт. Хранит имя файла или директории


 DIR_Attr – 1 байт. Хранит информацию о типе файловой записи
o Обычный файл (0x20)
o Директория (0x10)
o LFN-запись (Long File Name) (0x0f)
o Системный файл (0x01)
o Архивный файл (0x02)
o Удалённый файл (0x80)
С последними тремя мы не работали, но, думаю, знать о них нужно. Есть и другие, но там совсем караул
 DIR_FstClusLO – 2 байта (младшее слово). Указывает на номер первого кластера, который содержит
данные файла или директории
Ещё есть DIR_FstClusHI, отвечающий за старшее слово, но чё-то в hd он был равен нулю везде, хотя в
википедии написано, что равен нулю на томе FAT12/FAT16

Также стоит помнить вот об этих полях:

 DIR_CrtTime - DIR_CrtDate – 2 байта каждое. Содержит информацию о времени и дате создания файла или
директории с точностью до двух секунд. Конкретно по битам (счёт с нуля):
o 0–4 – год (1980–2107)
o 5–8 – месяц (1–12)
o 9–13 – день (1–31)
o 14–18 – час (0–23)
o 19–24 – минуты (0–59)
o 25–29 – секунды (0–29 с шагом 2)
Возникает вопрос. А чё, FAT32 так тупо устроен, что не может мне точно секунды записать? Смотри
 DIR_CrtTimeTenth – 2 байта. Содержит счётчик десятков миллисекунд времени создания (значения 0–199).
Вот здесь и лежит точная секунда и даже почти миллисекунда
 Аналогично DIR_WrtTime – DIR_WrtDate (DIR_WrtTimeTenth нет) для времени и даты последней
модификации
 DIR_FileSize – 4 байта. Содержит информацию о размере файла в байтах. Максимально допустимый
размер файла в FAT32 – это 4ГБ – 1Б (0xffffffff (тут 8 f-ок если что))
Вообще, у LFN-записи своя структура

Но мы её не разбирали и вообще их игнорируем, так что нам на эту структуру должно быть, мягко говоря, похуй.
Стоит только заметить, что позиция LDIR_Attr совпадает с DIR_Attr в обычной записи (12-й байт), что облегчает
идентификацию записей (просто смотреть на этот конкретный байт и больше никуда)

Теперь как устроена таблица FAT32 этого вашего


Таблица FAT32 состоит из записей размером 4 байта, каждая из которых соответствует кластеру
на логическом диске и может принимать следующие значения

 0x00000000 - кластер не используется


 0x00000001 - кластер является первым кластером в файле
 0x00000002–0xFFFFFFF6 - кластер является следующим кластером в файле
 0xFFFFFFF7 - кластер является битом конца файла
 0xFFFFFFFE - кластер является битом поврежденного кластера
 0xFFFFFFFF - кластер является битом последнего кластера в цепочке

Каждая запись в таблице FAT32 имеет размер в 4 байта. Размер всей таблицы определяется полями "sectors per
FAT" (у нас было 23) и "bytes per sector" (у нас было 512) из загрузочного сектора

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

Также создатели FAT32 зачем-то придумали две зарезервированных записи в начале (те, которые по 4 байта), из-
за чего нам при чтении приходилось отступать их. На вопрос «Для чего они нужны ?» Женя так и сказал: «Ну вот
так придумали»

Выглядит таблица примерно так:

Вам также может понравиться