FAT 12 16 32

THIS IS FAT!!!
Помогал одногруппнице с курсовой работой. Почерпнул для себя много нового. Решил записать.



Структура FAT на внешнем носителе, выглядит так:
  1. Загрузочный сектор 512 байт
  2. FAT1. (НЕ)Хитрый односвязный список. Длинна записи зависит от типа FAT. Указатели FAT
  3. FAT2. Копия первого. Актуально для дискет (не обязательно присутствует)
  4. Корневой каталог 32 сектора
  5. Кластеры данных.
Для работы с FAT, первым делом, нужно прочитать первый сектор и прочитав его, ответить на некоторые вопросы:

С какой версией фата мы имеем дело?
Сколько кластеров?
Какого размера сектора?
Какого размера кластеры?
Где корневой каталог?

Отвечать на эти вопросы не сложно. Воспользуйтесь этой документацией - ссыль, либо ее переводом (В котором, переводчик поясняет некоторые моменты)
Теперь, когда все что нам интересно - известно, мы можем прочесть корневой каталог. Так выглядит мой (Это загрузочная дискета GRUB которую я использовал для экспериментов с Multiboot Specicifation):




Я выделил желтым все что относится к первому файлу в каталоге.

Важно отметить, каталоги — это файлы, которые ссылаются на другие файлы и каталоги.

Запись файла в каталоге содержит длинное и короткое имена файла (последнее обязательно должно присутствовать). Одна запись выглядит так:
typedef struct FileStruct
{
uint8_t Name[11];
uint8_t Attr;
uint8_t NTRes;
uint8_t CrtTimeTenth;
uint16_t CrtTime;
uint16_t CrtDate;
uint16_t LstAccDate;
uint16_t FstClusHI;
FatTime WrtTime;
FatTime WrtDate;
uint16_t FstClusLO;
uint32_t FileSize;
} __attribute__((gcc_struct, __packed__)) FileStruct;
Атрибуты выглядят так:
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRRECTORY 0x10
#define ATTR_ARCHIVE 0x20\

Кроме того, если байт атрибутов выглядит так:

ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID

То, перед вами фрагмент имени файла, а не файл. Первый байт такой записи указывает на ее номер (одна запись содержит 13 символов длинного имени). Последняя запись длинного имени имеет номер равный n | 0x40. Таким образом, для однозначной идентификации последней записи длинного имени количество этих записей не должно привышать 15. Вот так:

0x43 часть имени
0x02 часть имени
0x01 часть имени
запись файла с коротким именем

В записи файла кроме имени и атрибутов содержится номер первого кластера в таблице кластеров.

Прочли запись файла, теперь прочтем его содержимое.

Из записи файла берем номер первого кластера и читаем ассоциированную с кластером запись в FAT таблице. Как я писал выше, фат таблица - односвязный список. Каждой записи в фат таблице соответствует один кластер на диске, а значение записи указывает на следующую запись в списке. Если значение записи == 0xFFFF то это последний кластер в файле, если больше 0x0000 и меньше 0x0FF0 то это указатель на следующий кластер. Думаю очевидно, как это читать.



Как я писал выше, каталог — тот же файл, если вы прочтете файл, содержащий каталог, то работа с ним не отличается от работы с корневым каталогом.

Комментарии

Популярные сообщения из этого блога

Siege Up! Editor (beta)

STM32F4 и программный выход в DFU

Git и Yandex.Disk