Какие элементы включает файловая система fat16 операционной системы ms dos

Обновлено: 03.07.2024

Файловая система FAT (File Allocation Table) была разработана Биллом Гейтсом и Марком Макдональдом в 1977 году и первоначально использовалась в операционной системе 86-DOS. Чтобы добиться переносимости программ из операционной системы CP/M в 86-DOS, в ней были сохранены ранее принятые ограничения на имена файлов. В дальнейшем 86-DOS была приобретена Microsoft и стала основой для ОС MS-DOS 1.0, выпущенной в августе 1981 года. FAT была предназначена для работы с гибкими дисками размером менее 1 Мб и вначале не предусматривала поддержки жёстких дисков.

Структура раздела FAT изображена на рисунке.

Рисунок 1. Структура раздела с файловой системой FAT

В файловой системе FAT дисковое пространство логического раздела делится на две области – системную и область данных (см. рис. 1). Системная область создается и инициализируется при форматировании, а впоследствии обновляется при манипулировании файловой структурой. Системная область файловых систем FAT состоит из следующих компонентов:

  • загрузочная запись (boot record, BR);
  • резервная область;
  • таблицы размещения файлов;
  • область корневого каталога (не существует в FAT32).

Область данных логического диска содержит файлы и каталоги, подчиненные корневому, и разделена на участки одинакового размера – кластеры. Кластер может состоять из одного или нескольких последовательно расположенных на диске секторов. Число секторов в кластере должно быть кратно 2N и может принимать значения от 1 до 64. Размер кластера зависит от типа используемой файловой системы и объема логического диска.

Назначение, структура и типы таблицы размещения файлов

Своё название FAT получила от одноимённой таблицы размещения файлов – File Allocation Table, FAT. В таблице размещения файлов хранится информация о кластерах логического диска. Каждому кластеру соответствует элемент таблицы FAT, содержащий информацию о том, свободен данный кластер или занят данными файла. Если кластер занят под файл, то в соответствующем элементе таблицы размещения файлов указывается адрес кластера, содержащего следующую часть файла. Номер начального кластера, занятого файлом, хранится в элементе каталога, содержащего запись об этом файле. Последний элемент списка кластеров содержит признак конца файла (EOF – End Of File). Первые два элемента FAT являются резервными.

Файловая система FAT всегда заполняет свободное место на диске последовательно от начала к концу. При создании нового файла или увеличении уже существующего она ищет самый первый свободный кластер в таблице размещения файлов. Если в процессе работы одни файлы были удалены, а другие изменились в размере, то появляющиеся в результате пустые кластеры будут рассеяны по диску. Если кластеры, содержащие данные файла, расположены не подряд, то файл оказывается фрагментированным.

Существуют следующие типы FAT – FAT12, FAT16, FAT32. Названия типов FAT ведут свое происхождение от размера элемента: элемент FAT12 имеет размер 12 бит (1,5 байт), FAT16 – 16 бит (2 байта), FAT32 – 32 бита (4 байта). В FAT32 четыре старших двоичных разряда зарезервированы и игнорируются в процессе работы операционной системы.

За таблицами размещения файлов следует корневой каталог. Каждому файлу и подкаталогу в корневом каталоге соответствует 32-байтный элемент каталога (directory entry), содержащий имя файла, его атрибуты (архивный, скрытый, системный и «только для чтения»), дату и время создания (или внесения в него последних изменений), а также прочую информацию. Для файловых систем FAT12 и FAT16 положение корневого каталога на разделе и его размер жестко зафиксированы. В FAT32 корневой каталог может быть расположен в любом месте области данных раздела и иметь произвольный размер.

Форматы имен файлов

Структура элемента каталога для короткого имени файла представлена в таблице 1.

Первый байт короткого имени выполняет функции признака занятости каталога:

  • если первый байт равен 0xE5, то элемент каталога свободен и его можно использовать при создании нового файла;
  • если первый байт равен 0x00, то элемент каталога свободен и является началом чистой области каталога (после него нет ни одного задействованного элемента).

Таблица 1. Структура элемента каталога для короткого имени файла

На использование ASCII-символов в коротком имени накладывается ряд ограничений:

  • нельзя использовать символы с кодами меньше 0x20 (за исключением кода 0x05 в первом байте короткого имени);
  • нельзя использовать символы с кодами 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, 0x7C;
  • нельзя использовать символ пробела (0x20) в первом байте имени.

В файловых системах FAT32 и VFAT (виртуальная FAT, расширение FAT16) включена поддержка длинных имен файлов (long file name, LFN). Для хранения длинного имени используются элементы каталога, смежные с основным элементом. Имя файла записывается не ASCII-символами, а в Unicode. В одном элементе каталога можно сохранить фрагмент длиной до 13 символов Unicode. Неиспользованный участок последнего фрагмента заполняется кодами 0xFFFF. Структура элемента каталога для длинного имени файла представлена в таблице 2.

Таблица 2. Структура элемента каталога для длинного имени файла

В первом секторе логического диска с системой FAT располагается загрузочный сектор и блок параметров BIOS. Начальный участок данного блока для всех типов FAT идентичен (таблица 3). Различия в структуре загрузочных секторов для разных типов FAT начинаются со смещения 0x24. Для FAT12 и FAT16 структура имеет вид, показанный в таблице 4, для FAT32 – в таблице 5.

Таблица 3. Начальный участок загрузочного сектора

Таблица 4. Структура загрузочного сектора FAT12/FAT16

Смещение Размер, байт Описание 0x24 1 Номер дисковода для прерывания 0х13 0x25 1 0x26 1 Признак расширенной загрузочной записи (0x29) 0x27 4 Номер логического диска 0x2B 11 Метка диска 0x36 8 Текстовая строка с аббревиатурой типа файловой системы

Таблица 5. Структура загрузочного сектора FAT32

Размер, байт Описание 4 Количество секторов, занимаемых одной копией FAT 2 Номер активной FAT 2 Номер версии FAT32: старший байт - номер версии, младший – номер ревизии. В настоящее время используется значение 0:0 4 Номер кластера для первого кластера корневого каталога 2 Номер сектора структуры FSINFO в резервной области логического диска 2 Номер сектора(в резервной области логического диска), используемого для хранения резервной копии загрузочного сектора 12 Зарезервировано (содержит 0)

Кроме перечисленных в таблицах 2-го и 3-го полей, нулевой сектор логического диска должен содержать в байте со смещением 0x1FE код 0x55, а в следующем байте (смещение 0x1FF) – код 0xAA. Указанные два байта являются признаком загрузочного диска.

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

На логическом диске с организацией FAT32 дополнительно присутствует структура FSInfo, размещаемая в первом секторе резервной области. Эта структура содержит информацию о количестве свободных кластеров на диске и о номере первого свободного кластера в таблице FAT. Формат структуры описан в таблице 6.

Таблица 6. Структура сектора FSInfo и резервного загрузочного сектора FAT32

Размер, байт Описание 4 Значение 0x41615252 – сигнатура, которая служит признаком того, данный сектор содержит структуру FSInfo 480 Зарезервировано (содержит 0) 4 Значение 0x61417272 (сигнатура) 4 Содержит текущее число свободных кластеров на диске. Если в поле записано значение 0xFFFFFFFF, то число свободных кластеров неизвестно, и его необходимо вычислять 4 Содержит номер кластера, с которого дисковый драйвер должен начинать поиск свободных кластеров. Если в поле записано значение 0xFFFFFFFF, то поиск свободных кластеров нужно начинать с кластера номер 2 12 Зарезервировано (содержит 0) 4 Сигнатура 0xAA550000 – признак конца структуры FSInfo

Для доступа к содержимому файла, находящемуся на разделе с файловой системой FAT, необходимо получить номер первого кластера файла. Этот номер, как мы уже установили, входит в состав элемента каталога, содержащего запись о файле. Номеру первого кластера соответствует элемент таблицы FAT, в котором хранится адрес кластера, содержащего следующую часть файла. Элемент FAT, соответствующий последнему кластеру в цепочке, содержит сигнатуру конца файла. Для FAT12 это значение составляет 0xFFF, для FAT16 – 0xFFFF, для FAT32 – 0xFFFFFFFF.

Рассмотрим программную реализацию алгоритма чтения для каждого типа FAT, и начнём с FAT16.

Все исходные тексты, рассматриваемые в статье, доступны на сайте журнала.

Программная реализация алгоритма чтения файла с логического раздела с файловой системой FAT16

Разработаем модуль, выполняющий чтение N первых кластеров файла, созданного на разделе с файловой системой FAT16. Параметр N (число кластеров для считывания) является переменной величиной и задается пользователем. Имя файла соответствует формату «8.3», т.е. является коротким. Модуль функционирует под управлением ОС Linux.

Определим необходимые заголовочные файлы:

Заголовочный файл split.h имеет следующее содержание:

__u8 name[9]; // имя файла

__u8 ext[4]; // расширение файла

int name_len, // длина имени файла

ext_len; // длина расширения файла

Cтруктура split_name предназначена для хранения составных частей короткого имени файла (имени и расширения) и их длин.

В заголовочном файле определены структурные типы, описывающие основные компоненты файловой системы FAT – загрузочный сектор, сектор FSInfo, структуры элементов каталога для короткого и длинного имён файлов.

Рассмотрим кратко поля, которые входят в каждую из этих структур.

    1. Структура загрузочного сектора struct fat_boot_sector:
      • __s8 system_id[8] – системный идентификатор;
      • __u8 sector_size[2] – размер сектора в байтах;
      • __u8 cluster_size – размер кластера в секторах;
      • __u16 reserved – число резервных секторов в резервной области раздела;
      • __u8 fats – количество копий FAT;
      • __u8 dir_entries[2] – количество 32-байтных дескрипторов файлов в корневом каталоге;
      • __u8 sectors[2] – число секторов на разделе; если это поле равно 0, используется поле total_sect;
      • __u8 media – тип носителя, на котором создана файловая система;
      • __u16 fat_length – размер FAT в секторах;
      • __u32 total_sect – размер раздела FAT в секторах (если поле sectors == 0).
      • __u32 fat32_length – размер FAT32 в секторах;
      • __u32 root_cluster – номер первого кластера корневого каталога;
      • __u16 info_sector – номер сектора, содержащего структуру FSInfo.

    Следующие поля данной структуры используются только FAT32:

    1. Структура сектора FSInfo struct fat_boot_fsinfo:
      • __u32 signature1 – сигнатура 0x41615252;
      • __u32 signature2 – сигнатура 0x61417272;
      • __u32 free_clusters – количество свободных кластеров. Если поле содержит -1, поиск свободных кластеров нужно начинать с кластера номер 2.
    2. Структура элемента каталога короткого имени struct msdos_dir_entry:
      • __s8 name[8],ext[3] – имя и расширение файла;
      • __u8 attr – атрибуты файла;
      • __u8 ctime_ms – это поле уточняет время создания файла до мс (используется только FAT32);
      • __u16 ctime – время создания файла (используется только FAT32);
      • __u16 cdate – дата создания файла (используется только FAT32);
      • __u16 adate – дата последнего доступа к файлу (используется только FAT32);
      • __u16 starthi – старшие 16 бит номера первого кластера файла (используется только FAT32);
      • __u16 time,date,start – время и дата создания файла, номер первого кластер файла;
      • __u32 size – размер файла (в байтах).
    3. Структура элемента каталога длинного имени:
      • __u8 id – номер элемента;
      • __u8 name0_4[10] – символы 1 – 5 имени;
      • __u8 attr – атрибуты файла;
      • __u8 alias_checksum – контрольная сумма короткого имени;
      • __u8 name5_10[12] – символы 6 – 11 имени;
      • __u8 name11_12[4] – символы 12 – 13 имени.

    Продолжим рассмотрение программной реализации алгоритма и определим имя раздела, на котором создана файловая система FAT16:

    struct fat_boot_sector fbs; // структура загрузочного сектора

    struct msdos_dir_entry dentry; // структура элемента каталога

    __u16 *fat16; // сюда копируем таблицу FAT16

    __u16 sector_size; // размер сектора (из FAT16)

    __u16 dir_entries; // число 32-байтных дескрипторов

    // в root-каталоге (0 для FAT32)

    __u16 sectors; // общее число секторов в разделе

    __u32 fat16_size; // размер FAT16

    __u32 root_size; // размер корневого каталога

    __u32 data_start; // начало области данных

    __u16 byte_per_cluster; // размер кластера в байтах

    __u16 next_cluster; // очередной кластер в цепочке

    __u8 *dir_entry = NULL; // указатель на записи каталога

    int hard; // дескриптор файла устройства

    Начнём рассмотрение с главной функции:

    Задаем полное имя файла, содержимое которого мы хотим прочитать. Напомню, что мы работаем только с короткими именами файлов. Порядок работы с длинными именами в данной статье не рассматривается.

    __u8 *full_path = "/Folder1/Folder2/text.txt";

    Открываем файл устройства:

    hard = open(FAT16_PART_NAME, O_RDONLY);

    Считываем первые 10 кластеров файла. Считывание выполняет функция fat16_read_file(). Параметры функции – полное имя файла и число кластеров для чтения. Функция возвращает число прочитанных кластеров или -1, если при чтении произошла ошибка:

    num = fat16_read_file(full_path, 10);

    if(num < 0) perror("fat16_read_file");

    else printf("Read %d clusters ", num);

    Закрываем файл устройства и выходим:

    Функция чтения кластеров файла имеет следующий вид:

    int fat16_read_file(__u8 *full_path, int num)

    struct split_name sn; // структура для хранения составных частей файла

    __u8 tmp_name_buff[SHORT_NAME]; // буфер для временного хранения составных элементов полного пути файла

    static int i = 1;

    __u16 start_cluster, next_cluster;

    Параметры функции мы перечислили при рассмотрении функции main.

    Подготовительные операции – обнуляем буфер tmp_name_buff и структуру struct split_name sn:

    memset(tmp_name_buff, 0, SHORT_NAME);

    memset((void *)&sn, 0, sizeof(struct split_name));

    Первым символом в абсолютном путевом имени файла должен быть прямой слэш (/). Проверяем это:

    if(full_path[0] != "/") return -1;

    Считываем с раздела загрузочный сектор:

    if(read_fbs() < 0) return -1;

    Считанный загрузочный сектор находится сейчас в глобальной структуре struct fat_boot_sector fbs. Скопируем из этой структуры размер сектора, число записей в корневом каталоге и общее число секторов на разделе:

    memcpy((void *)&sector_size, (void *)fbs.sector_size, 2);

    memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2);

    memcpy((void *)&sectors, (void *)fbs.sectors, 2);

    Определим размер кластера в байтах:

    byte_per_cluster = fbs.cluster_size * 512

    Отобразим информацию, находящуюся в загрузочном секторе:

    printf("System id - %s ", fbs.system_id);

    printf("Sector size - %d ", sector_size);

    printf("Cluster size - %d ", fbs.cluster_size);

    printf("Reserved - %d ", fbs.reserved);

    printf("FATs number - %d ",fbs.fats);

    printf("Dir entries - %d ", dir_entries);

    printf("Sectors - %d ", sectors);

    printf("Media - 0x%X ", fbs.media);

    printf("FAT16 length - %u ", fbs.fat_length);

    printf("Total sect - %u ", fbs.total_sect);

    printf("Byte per cluster - %d ", byte_per_cluster);

    Вычисляем размер FAT16 в байтах и считываем её:

    fat16_size = fbs.fat_length * 512;

    if(read_fat16() < 0) return -1;

    Считываем корневой каталог:

    if(read_root_dentry() < 0) return -1;

    Сейчас указатель dir_entry позиционирован на область памяти, содержащую записи корневого каталога. Размер этой области памяти равен размеру корневого каталога (root_size).

    Сохраним (для контроля) содержимое корневого каталога в отдельном файле:

    fat = open("dir16", O_CREAT|O_WRONLY, 0600);

    write(fat, dir_entry, root_size);

    Вычисляем начало области данных:

    data_start = 512 * fbs.reserved + fat16_size * fbs.fats + root_size;

    Имея все записи корневого каталога, мы можем добраться до содержимого файла test.txt. С этой целью организуем цикл. В теле цикла проведем разбор полного имени файла, выделяя его элементы – подкаталоги (их у нас два, Folder1 и Folder2) и имя искомого файла (test.txt).

    memset(tmp_name_buff, 0, SHORT_NAME);

    memset((void *)&sn, 0, sizeof(struct split_name));

    for(n = 0 ; n < SHORT_NAME; n++, i++)

    Заполняем структуру struct split_name sn соответствующей информацией. Заполнение выполняет функция split_name, при этом выполняется проверка имени файла на соответствие формату «8.3»:

    if(split_name(tmp_name_buff, &sn) < 0)

    printf("not valid name ");

    Для каждого элемента полного имени файла определяем начальный кластер. Для этого ищем в элементах каталога (начиная с корневого) запись, соответствующую элементу полного имени, и считываем эту запись. Процедуру поиска выполняет функция get_dentry():

    printf("No such file! ");

    Проверяем атрибуты файла. Если это каталог, считываем его содержимое и продолжаем цикл:

    if(read_directory(dentry.start) < 0) return -1;

    Если это файл – считываем первые num кластеров. Для контроля считанную информацию сохраним в отдельном файле:

    tmp_buff = (__u8 *)malloc(byte_per_cluster); // сюда будет считываться содержимое кластера

    n = open("clust", O_CREAT|O_RDWR, 0600); // в этом файле сохраним считанную информацию

    printf("file`s first cluster - 0x%X .. ", start_cluster);

    Для считывания кластеров файла организуем цикл:

    for(i = 0; i < num; i++)

    memset(tmp_buff, 0, byte_per_cluster);

    Считываем содержимое кластера в буфер tmp_buff и сохраняем его в отдельном файле:

    if(read_cluster(start_cluster, tmp_buff) < 0) return -1;

    if(write(n, tmp_buff, byte_per_cluster) < 0)

    Считываем из FAT16 номер следующего кластера, занятого под данный файл. Если это последний кластер – прерываем цикл и возвращаемся в главную функцию:

    По стандарту диски могут быть разбиты на логические разделы, но мы будем рассматривать диски с одним разделом.

    Как вы знаете из предыдущих лекций: блоки записываются последовательно; по спирали; сектора по 2352 байта.

    Порядок записи информации:

    Каждый CD-ROM начинается с 16 блоков (неопределенных ISO 9660), эта область может быть использована для размещения загрузчика ОС или для других целей.

    Дальше один блок основного описателя тома - хранит общую информацию о CD-ROM, в нее входит:
    - идентификатор системы (32байта)
    - идентификатор тома (32байта)
    - идентификатор издателя (128байт)
    - идентификатор лица, подготовившего данные (128байт)
    - имена трех файлов, которые могут содержать краткий обзор, авторские права и библиографическая информация.
    - ключевые слова: размер логического блока (как правило 2048, но могут быть 4096, 8192 и т.д.); количество блоков; дата создания; дата окончания срока службы диска.
    - описатель корневого каталога (номер блока содержащего каталог).

    Могут быть дополнительные описатели тома, подобные основному.

    Каталоговая запись стандарта ISO 9660.

    Каталоговая запись стандарта ISO 9660.

    Расположение файла - номер начального блока, т.к. блоки располагаются последовательно.

    L - длина имени файла в байтах

    Имя файла - 8 символов, 3 символа расширения (из-за совместимости с MS-DOS). Имя файла может встречаться несколько раз, но с разными номерами версий.

    Sys - поле System use (используется различными ОС для своих расширений )

    Порядок каталоговых записей:

    Описатель самого каталога (аналог ".")

    Ссылка на родительский каталог (аналог "..")

    Остальные записи (записи файлов) в алфавитном порядке

    Количество каталоговых записей не ограничено, но ограничено количество вложенности каталогов - 8.

    В стандарте ISO 9660 определены три уровня ограничений:

    имена файлов и каталогов до 31 символа

    - имена файлов и каталогов до 31 символа
    - файлы могут быть не непрерывными, состоять из разделов

    3.1.2 Рок-ридж расширения для UNIX

    Это расширение было создано, чтобы файловая система UNIX была представлена на CD-ROM.

    Для этого используется поле System use.

    Расширения содержат следующие поля:

    PX - атрибуты POSIX (стандартные биты rwxrwxrwx, (чтение, запись, запуск) (владелец, группа, все) )

    PN - старший и младший номер устройств (чтобы можно было записать каталог /dev, который содержит устройства)

    SL - символьная связь

    NM - альтернативное имя, позволяет использовать произвольные имена, без ограничений

    CL - расположение дочернего узла (чтобы обойти ограничение на вложенность каталогов)

    PL - расположение дочернего узла (чтобы обойти ограничение на вложенность каталогов)

    RE - перераспределение (чтобы обойти ограничение на вложенность каталогов)

    TF - временные штампы (время создания, последнее изменение , последний доступ)

    3.1.3 Joliet расширения для Windows

    Это расширение было создано, чтобы файловая система ОС Windows 95 была представлена на CD-ROM.

    Для этого используется поле System use.

    Расширения содержат следующие поля:

    Длинные имена файлов (до 64 символов)

    Набор символов Unicode (поддержка различных языков)

    Преодоление ограничений на вложенность каталогов

    Имена каталогов с расширениями

    3.1.4 Romeo расширения для Windows

    Стандарт Romeo предоставляет другую возможность записи файлов с длинными именами на компакт-диск. Длина имени может составлять 128 символов, однако использование кодировки Unicode не предусмотрено. Альтернативные имена в этом стандарте не создаются, поэтому программы MS-DOS не смогут прочитать файлы с такого диска.

    Вы можете выбрать стандарт Romeo только в том случае, если диск предназначен для чтения приложениями Windows 95 и Windows NT.

    3.1.5 HFS расширения для Macintosh

    Иерархическая файловая система компьютеров Macintosh, не совместима ни с какими другими файловыми системами и называется Hierarchical File System (HFS).

    3.1.6 Файловая система UDF (Universal Disk Format)

    Изначально созданная для DVD, с версии 1.50 добавили поддержку CD-RW и CD-R.

    Эта файловая система позволяет дописывать диски, а также поддерживает большие размеры файлов и длинные имена файлов.

    3.2 Файловая система CP/M

    CP/M (Control Program for Microcomputers) - операционная система, предшественник MS-DOS.

    В ее файловой системе только один каталог, с фиксированными записями по 32 байта.

    Имена файлов - 8+3 символов верхнего регистра.

    После каждой перезагрузки рассчитывается битовый массив занятых и свободных блоков. Массив находится постоянно в памяти (для 180Кбайтного диска 23 байта массива). После завершения работы, он не записывается на диск.

    Каталоговая запись CP/M

    Видно, что максимальный размер файла 16Кбайт (16*1Кбайт).

    Для файлов размером от 16 до 32 Кбайт можно использовать две записи. Для до 48 Кбайт три записи и т.д.

    Порядковый номер записи хранится в поле экстент.

    Код пользователя - каждый пользователь мог работать только со своими файлами.

    Порядок чтения файлов:

    Файл открывается системным вызовом open

    Читается каталоговая запись, из которой получает информацию о всех блоках.

    Вызывается системный вызов read

    3.2 Файловая система MS-DOS (FAT-12,16,32)

    В первых версиях был только один каталог (MS-DOS 1.0).

    С версии MS-DOS 2.0 применили иерархическую структуру.

    Каталоговые записи, фиксированны по 32 байта.

    Имена файлов - 8+3 символов верхнего регистра.

    Порядок чтения файлов:

    Файл открывается системным вызовом open, которому указывается путь к файлу (может быть абсолютным и относительным).

    Файловая система открывает каталоги (согласно пути), считывает последний каталог в память.

    Ищет описатель файла.

    Читается дескриптор файла, из которого получает информацию о всех блоках.

    Вызывается системный вызов read

    Каталоговая запись MS-DOS, обратите внимание на пустые 10 байт, они будут задействованы в Windows 98

    Атрибут архивный нужен для программ резервного копирования, по нему они определяют надо копировать файл или нет.

    Поле время (16 разрядов) разбивается на три подполя:

    секунды - 5бит (2^5=32 поэтому хранятся с точностью до 2-х секунд)

    Поле даты (16 разрядов) разбивается на три подполя:

    год - 7бит (начинается с 1980г, т.е. максимальный 2107г.)

    Теоретически размер файлов может быть до 4Гбайт (32 разряда).

    Все блоки файла в записи не хранятся, а только первый блок. Этот номер используется в качестве индекса для 64К (для FAT-16) элементов FAT-таблицы, хранящейся в оперативной памяти.

    В зависимости от количества блоков на диске в системе MS-DOS применяется три версии файловой системы FAT:

    FAT-32 - для адреса используются только 28 бит, поэтому правильнее назвать FAT-28

    Размер блока (кластера) должен быть кратным 512 байт.

    В первой версии MS-DOS использовалась FAT-12 с 512 байтовыми блоками, поэтому максимальный размер раздела мог достигать 2Мбайта (2^12*512байта).

    С увеличением дисков, этого стало не хватать, стали увеличивать размер блоков 1,2 и 4 Кбайта (2^12) (при этом эффективность использования диска падает).

    FAT-12 до сих пор применяется для гибких дисков.

    16-разрядные дисковые указатели

    Размеры кластеров 512, 1, 2, 4, 8, 16 и 32Кбайт (2^15)

    Таблица постоянно занимала в памяти 128 Кбайт.

    Максимальный размер раздела диска мог достигать 2Гбайта (2^16*32Кбайта).

    Причем кластер в 32 Кбайта для файлов со средним размером в 1Кбайт, не эффективен.

    Размеры кластеров 512, 1, 2, 4, 8, 16 и 32Кбайт

    Максимальный размер раздела диска мог бы достигать 2^28*2^15, но здесь уже вступает другое ограничение - 512 байтные сектора адресуются 32-разрядным числом, а это 2^32*2^9, т.е. 2 Тбайта.

    Максимальный размер раздела для различных размеров кластеров

    Размер кластера, Кбайт

    Из таблицы видно, что FAT-16 использовать не эффективно уже при разделах в 256 Мбайт, учитывая, что средний размер файла 1Кбайт.

    3.2.4 Расширение Windows 98 для FAT-32

    Для расширения были задействованы 10 свободных бит.

    Формат каталоговой записи в системе FAT-32 с расширениями для Windows 98

    Пять добавленных полей:

    NT - предназначено для совместимости с Windows.

    Sec - дополнение к старому полю время, позволяет хранить время с точностью до секунды (было 2 секунды)

    Дата и время создания файла (Creation time)

    Дата (но не время) последнего доступа (Last access)

    Для хранения номера блока выделено еще 2 байта (16 бит), т.к. номера блоков стали 32-разрядные.

    Основная надстройка над FAT-32, это длинные имена файлов.

    Для каждого файла стали присваивать два имени:

    Короткое 8+3 для совместимости с MS-DOS

    Длинное имя файла, в формате Unicode

    Доступ к файлу может быть получен по любому имени.

    Если файлу дано длинное имя (или используются пробелы), то система делает следующие шаги:

    берет первые шесть символов

    преобразуются в верхний регистр ASCII, удаляются пробелы, лишние точки, некоторые символы преобразуются в "_"

    если такое имя есть, то используется суффикс

    Короткие имена хранятся в в обычном дескрипторе файла.

    Длинные имена хранятся в дополнительных каталоговых записях, идущих перед основным описателем файла. Каждая такая запись содержит 13 символов формата Unicode (для символа Unicode нужно два байта).

    Формат каталогов записи с фрагментом длинного имени файла в Windows 98

    Поле "Атрибуты" позволяет отличить фрагмент длинного имени (значение 0х0F) от дескриптора файла. Старые программы MS-DOS каталоговые записи со значением поля атрибутов 0х0F, просто игнорируют.

    Последовательность - порядковый номер в последовательности фрагментов.

    Длина имени файла ограничена 260 символами не из-за порядкового номера (1 байт), для номера используются только 6 бит 6х13=819 символов.

    Контрольная сумма нужна для выявления ошибок, т.к. файл с длинным именем может удалить MS-DOS и создать новый, и тогда останутся не удаленные записи, которые "прилипнут" к новому файлу. Т.к. это поле один байт, есть вероятность 1/256 что Windows 98 не заметит подмены.

    3.3 Файловая система NTFS

    Файловая система NTFS была разработана для Windows NT.

    64-разрядные адреса, т.е. теоретически может поддерживать 2^64*2^16 байт (1 208 925 819 Пбайт

    Размеры блока (кластера) от 512байт до 64 Кбайт, для большинства используется 4Кбайта.

    Поддержка больших файлов.

    Имена файлов ограничены 255 символами Unicode.

    Длина пути ограничивается 32 767 (2^15) символами Unicode.

    Имена чувствительны к регистру, my.txt и MY.TXT это разные файлы (но из-за Win32 API использовать нельзя), это заложено на будущее.

    Журналируемая файловая система, т.е. не попадет в противоречивое состояние после сбоев.

    Контроль доступа к файлам и каталогам.

    Поддержка жестких и символических ссылок.

    Поддержка сжатия и шифрования файлов.

    Поддержка дисковых квот.

    Главная файловая таблица MFT (Master File Table) - главная структура данных в каждом томе, записи фиксированные по 1Кбайту. Каждая запись описывает один каталог или файл. Для больших файлов могут использоваться несколько записей, первая запись называется - базовой записью.

    MFT представляет собой обычный файл (размером до 2^48 записей), который может располагаться в любом месте на диске.

    Главная файловая таблица MFT, каждая запись ссылается на файл или каталог.

    Первые 16 записей MFT зарезервированы для файлов метаданных. Каждая запись описывает нормальный файл, имена этих файлов начинаются с символа "$".

    Каждая запись представляет собой последовательность пар (заголовок атрибута, значение).

    Некоторые записи метаданных в MFT:

    0) Первая запись описывает сам файл MFT, и содержит все блоки файла MFT. Номер первого блока файла MFT содержится в загрузочном блоке.

    1) Дубликат файла MFT, резервная копия.

    2) Журнал для восстановления, например, перед созданием, удалением каталога делается запись в журнал. Система не попадет в противоречивое состояние после сбоев.

    3) Информация о томе (размер, метка и версия)

    4) Определяются атрибуты для MFT записей.

    6) Битовый массив использованных блоков - для учета свободного места на диске

    7) Указывает на файл начальной загрузки

    Атрибуты, используемые в записях MFT:

    Стандартная информация - флаговые биты (только чтение, архивный), временные штампы и т.д.

    Имя файла - имя файла в кодировке Unicode, файлы могут повторятся в формате MS-DOS 8+3.

    Список атрибутов - расположение дополнительных записей MFT

    Идентификатор объекта - 64-разрядный идентификатор файла, уникальный для данного тома.

    Точка повторного анализа - используется для символьных ссылок и монтирования устройств.

    Корневой индекс - используется для каталогов

    Размещение индекса - используется для очень больших каталогов

    Битовый массив - используется для очень больших каталогов

    Поток данных утилиты регистрации - используется для шифрования

    Данные - поточные данные, может повторяться, используется для хранения самого файла. За заголовком следует список дисковых адресов, определяющий положение файла на диске, если файл очень маленький (несколько сотен байт), то следует сам файл (такой файл называется - непосредственный файл).

    Как привило, все данные файла не помещаются в запись MFT.

    Дисковые блоки файлам назначаются по возможности в виде серий последовательных блоков (сегментов файлов). В идеале файл должен быть записан в одну серию (не фрагментированный файл), файл, состоящий из n блоков, может быть записан от 1 до n серий.

    Запись MFT для 9-блочного файла, состоящего из трех сегментов (серий).
    Вся запись помещается в одну запись MFT (файл не сильно фрагментирован).

    Заголовок содержит количество блоков (9 блоков).

    Каждая серия записывается в виде пары, дисковый адрес - количество блоков (20-4, 64-2, 80-3).

    Каждая пара, при отсутствие сжатия, это два 64-разрядные числа (16 байт на пару).

    Многие адреса содержат большое количество нулей, сжатие делается за счет убирания нулей в старших байтах. В результате для пары требуется чаще всего 4байта.

    Если файл сильно фрагментирован, требуется несколько записей MFT.

    Три записи MFT для сильно фрагментированного файла.
    В первой записи указывается индексы на дополнительные записи.

    Может потребоваться очень много индексов MFT, так что индексы не поместятся в запись. В этом случае список хранится не в MFT, а в файле.

    Запись MFT для небольшого каталога

    Поиск файла в каталоге по имени состоит в последовательном переборе имен файлов.

    Для больших каталогов используется другой формат. Используется дерево В+, обеспечивающее поиск в алфавитном порядке.

    3.3.1 Поиск файла по имени

    При создании файла, программа обращается к библиотечной процедуре

    Этот вызов попадает в совместно используемую библиотеку уровня пользователя kernel32.dll, где \??\ помещается перед именем файла, и получается строка:

    Это имя пути передается системному вызову NtFileCreate в качестве параметра.

    Этапы поиска файла C:\windows\readmy.txt

    3.3.2 Сжатие файлов

    Если файл помечен как сжатый, то система автоматически сжимает при записи, а при чтении происходит декомпрессия.

    Берутся для изучения первые 16 блоков файла (не зависимо от сегментов файла).

    При меняется к ним алгоритм сжатия.

    Если полученные данные можно записать хотя бы в 15 блоков, они записываются в сжатом виде.
    Если их можно записать только в 16 блоков, то они записываются в несжатом виде.

    Алгоритм повторяется для следующих 16 блоков.

    Запись MFT для предыдущего файла.

    Как видно из рисунка, сжатие приводит к сильной фрагментации.

    Чтобы прочитать сжатый блок системе придется распаковать весь сегмент. Поэтому сжатие применяют к 16 блокам, если увеличить количество блоков, уменьшится производительность (но возрастет эффективность сжатия).

    3.3.3 Шифрование файлов

    Любую информацию, если она не зашифрована, можно прочитать, получив доступ. Поэтому самая надежная защита информации от несанкционированного доступа - шифрование.

    Даже если у вас украдут винчестер, прочесть данные не смогут (большинство не сможет).

    Если файл помечен как шифрованный, то система автоматически шифрует при записи, а при чтении происходит дешифрация.

    Шифрование и дешифрование выполняет не сама NTFS, а специальный драйвер EFS (Encrypting File System).

    Каждый блок шифруется отдельно.

    Файловая система FAT (File Allocation Table) использовалась во всех версиях ОС Ms-DOS, а также в OS/2 (в версиях 1.0 и 1.1) и первых релизах Windows 95. Указанная файловая система вполне удовлетворяла требованиям своего времени в основном благодаря тому, что сама по себе очень компактна и проста. Благодаря этому она с легкостью использовалась на гибких носителях. Для хранения файла в FAT может использоваться один или несколько кластеров. Каждому кластеру диска в таблице FAT соответствует отдельная запись, которая либо указывает на следующий кластер файла, либо содержит метку конца файла. В составе каждого каталога хранятся имена входящих в него файлов. Вместе с именем файла хранится указатель на первый кластер этого файла. Помимо этого в каталоге хранится дата создания файла, его размер и атрибуты. Атрибуты могут указывать на то, что файл является скрытым, зарезервированным для использования операционной системой, требует архивирования (резервного копирования) или предназначен только для чтения. Казалось бы, при такой организации хранения данных, система должна быть достаточно быстрой и надежной.

    Давайте же рассмотрим ее недостатки. Самый первый и главный недостаток, с которым мы сталкиваемся при использовании FAT – это слишком сильная ограниченность максимального размера тома FAT. Цифра 16 в названии FAT 16 означает, что таблица размещения файлов FAT идентифицирует записи, соответствующие дисковым кластерам, при помощи 16-разрядных чисел. Таким образом, в таблице можно разместить не более 65 536 записей (2 в 16-ой степени). А если учитывать то, что максимальный размер кластера - 32 Кбайта, то выходит, что максимальный раздел дискового тома - 2 Гбайта. Естественно, что эта система не удовлетворяет современным винчестерам, имеющим объемы в десятки гигабайт.

    Второй недостаток заключается в том, что для хранения всех файловых атрибутов система FAT использует всего 1 байт! Много ли можно поместить в один байт? Следовательно, просто не представляется возможности хранить данные о правах доступа к файлу, о его владельце и т.д.

    Недостаток номер 3 – при использовании большего размера тома мы вынуждены использовать больший размер кластера. Однако, в FAT один файл занимает как минимум один кластер. Например, при размере кластера в 32 Кбайт мы имеем файл, размером 2 Кбайт – в результате файл занимает весь кластер и мы теряем 30 Кбайт. Таким образом, получается, что физически файл занимает не 2, а все 32 Кбайт!

    Четвертый недостаток – сведения о физическом расположении файлов хранятся в одном месте – таблице размещения файлов FAT. Это приводит к следующему:

    • увеличивается вероятность повреждения и потери всей информации

    • снижается скорость поиска, т.к. для поиска определенного файла нужно обработать всю таблицу.

    Подводя итог вышесказанному, можно сделать вывод, что использовать FAT 16 в настоящее время неэффективно. Но стоит заметить, что FAT создавалась довольно давно и удовлетворяла требованиям того времени.

    Файловая система FAT 32

    Эта файловая система пришла на смену FAT 16, начиная с Windows 95 OEM release 2. Основное ее отличие от FAT 16 заключается в том, что таблица размещения файлов FAT идентифицирует записи, соответствующие дисковым кластерам, при помощи 32-разрядных чисел. В соответствии с этим максимальное количество записей становится равным 4 294 967 296 (2 в 32-ой степени). Следовательно, существенно увеличивается максимальный размер тома (до 2 Тбайт). Но в остальном система осталась практически такой же. Однако необходимость работать с огромными по размеру томами и документами прямо указывает на недостатки FAT 32. Итак, рассмотрим их по порядку.

    • Не требуется большое количество оперативной памяти для эффективной работы с ней

    • Быстрая работа с малыми и средними каталогами

    • Диск совершает в среднем меньшее количество движений головками (в сравнении, например с NTFS)

    • Достаточно эффективно работает на медленных дисках. Не требовательна к системам Bus Mastering

    • Быстрый доступ к данным на маленьких по объему винчестерах

    • Малый размер файла каталога позволяет практически всегда оставлять его не фрагментированным

    • Катастрофическая потеря быстродействия с увеличением фрагментации, особенно для больших дисков

    • Сложности с произвольным доступом к большим (

    10% от объема винчестера и более) файлам

    • Очень медленная работа с каталогами, содержащими большое количество файлов

    • Одного байта явно недостаточно для хранения атрибутов файла, из-за этого нет возможности хранить данные о правах доступа к файлу, его владельце и т.д.

    Вывод напрашивается сам собой. FAT 32 как система уже отжила свое. Она показывает себя только на машинах с небольшими дисками и объемом ОЗУ менее 64 Мбайт. При лучшей машине гораздо удобней будет использовать NTFS как с точки зрения быстродействия, так и с точки зрения надежности. FAT 32 просто-напросто продлила жизнь фаловой системе FAT 16, не более того.


    Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

    Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.



    Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

    Для обеспечения доступа приложений к файлам операционная система с файловой системой FAT использует следующие структуры:

    • загрузочные секторы главного и дополнительных разделов ;
    • загрузочные секторы логических дисков (разделов);
    • корневой каталог;
    • область данных;
    • цилиндр для выполнения диагностических операций чтения-записи.

    На дискетах, в отличие от жесткого диска, нет загрузочных секторов главного и дополнительных разделов и диагностического цилиндра. Эти структуры создаются программой Fdisk, которая не применяется для дискет, так как они на разделы не разбиваются. Чтобы установить на один жесткий диск несколько операционных систем, его надо разбить на разделы . В загрузочном секторе главного раздела создается таблица списка разделов.

    Загрузочный сектор главного раздела (называемый главной загрузочной записью – Master Boot Record – MBR ) является первым сектором на жестком диске (цилиндр 0, головка 0, сектор 1) и состоит из двух элементов [10]:

    • таблица главного раздела, содержащая список разделов (максимум четыре) и расположение загрузочных секторов соответствующих логических дисков (первая и последняя головки, первый и последний цилиндры с соответствующими значениями секторов, а также количество секторов);
    • главный загрузочный код – небольшая программа, которая выполняется системой BIOS. Основная функция этого кода – передача управления в раздел, который обозначен как активный (загрузочный).

    Загрузочный сектор раздела содержит:

    • блок параметров диска, в котором содержится информация о разделе (размер, количество секторов, размер кластера , метка тома и др.);
    • загрузочный код – программу, с которой начинается процесс загрузки операционной системы (для Ms-Dos и Windows 9x – файл Io.sys).

    Загрузочные секторы логических дисков создаются программой Format . Они похожи на загрузочные диски разделов. Однако при загрузке выполняется код только того сектора, который находится в активном разделе.

    Логический диск , отформатированный программой Fdisk, состоит из следующих областей (рис. 7.20):

    • загрузочный сектор;
    • основная FAT-таблица, содержащая информацию о размещении файлов и каталогов на диске;
    • копия FAT-таблицы;
    • корневой каталог – фиксированная область (16 Кбайт для жесткого диска), позволяющая хранить 512 записей о файлах и каталогах (каждая запись состоит из 32 байтов);
    • область данных для размещения всех файлов и каталогов, кроме корневого каталога.

    Первые две записи FAT зарезервированы и содержат информацию о самой FAT , все остальные указывают на соответствующие кластеры диска. Индексный указатель принимает значение , характеризующее состояние связанного с ним кластера (для FAT 16):

    • кластер свободен (0000h);
    • кластер используется (любое значение, кроме специальных);
    • последний кластер файла (FFF8h – FFFFh);
    • кластер поврежден (FFF7h);
    • резервный кластер (FFF6h).

    FAT-система

    Размер FAT -таблицы определяется количеством кластера. Разрядность индексного указателя FAT -таблицы должна быть такой, чтобы можно было задать максимальный номер кластера диска определенного объема. В соответствии с разрядностью дискового указателя существуют несколько разновидностей FAT : FAT12, FAT16 , FAT32 (соответственно 2 12 , 2 16 и 2 32 кластеров). Тип используемой FAT определяется программой Fdisk, хотя и записываются они в процессе форматирования высокого уровня программы Format . На всех дискетах применяется FAT 12, на жестких дисках до 512 Мбайт – FAT16 , на жестких дисках, имеющих большую емкость при использовании Windows 95 OSR2 и Windows98 – FAT 32 (вообще размер кластера может быть от 1 до 128 секторов или от 512 байт до 64 Кбайт). Максимальный размер раздела FAT16 ограничен объемом 4 Гбайт (2 16 = 65536 кластеров по 64 Кбайт). Максимальный размер раздела FAT 32 практически не ограничен (232 кластеров по 32 Кбайт).

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

    Информация о расположении файла, то есть о расположении оставшихся кластеров, содержится в FAT -таблице. В процессе работы системы кластеры файла могут оказаться не в смежных областях, а будут чередоваться с кластерами других файлов. Однако эту цепочку кластеров легко выделить, зная начальный кластер файлов. На рис. 7.21 показан пример размещения двух файлов.

    В корневом каталоге имеются записи не только о файлах, но и подкаталогах. Эти записи имеют точно такую же структуру, что и записи корневого каталога. Признак подкаталогов указывается в атрибутах файла, т.е. можно считать, что подкаталог – это специальный файл . Структура атрибутивного байта показана ниже.

    Пример размещения двух файлов

    Файловые системы FAT 12 и FAT16 оперируют с именами файлов, составленных по схеме 8.3 (имя, расширение). В Windows 95 с появлением 32-разрядной виртуальной FAT - VFAT ( Virtual file allocation table ) поддерживаются имена длиной 255 символов (заметим, что изменился лишь программный код, поддерживающий FAT16 , он стал 32-м). Для обеспечения обратной совместимости ОС создает его псевдоним , удовлетворяющий стандарту 8.3. Делается это следующим образом.

    1. Первые 3 символа после последней точки в длинном имени файла становятся расширением псевдонима.
    2. Первые шесть символов длинного имени файла, за исключением пробелов, которые игнорируются, преобразуются в символы верхнего регистра и становятся шестью символами стандартного имени файла. Недопустимые символы (+ , ; = [28] ), которые могут использоваться в Windows 95, преобразуются в символы подчеркивания.
    3. Добавляются символы

    Если первые шесть символов нескольких файлов одни и те же, то добавляются символы

    VFAT хранит псевдонимы длинных имен в поле стандартных имен файлов записи каталога файла. Таким образом, все версии DOS и Windows могут получить доступ к файлу под длинным именем с помощью его псевдонима. Остается проблема: как хранить 255 символов имени файлов 32 байт записи каталога? Разработчики файловой системы решили эту проблему следующим образом: были добавлены дополнительные записи каталога для хранения длинных имен файлов. Чтобы предыдущие версии не повредили эти дополнительные записи каталога, VFAT устанавливает для них атрибуты, которые нельзя использовать для обычного файла: только для чтения, скрытый, системный и метка тома. Такие атрибуты DOS игнорирует, а следовательно, длинные имена файлов остаются нетронутыми. Подобным же образом решается проблема длинных имен в Windows NT/2000/2003/XP, применяющих для хранения имен двухбайтовый формат на каждый символ – Unicode.

    Как уже отмечалось, выбор типа FAT -системы во многом определяется емкостью жесткого диска. При использовании FAT16 нельзя создать раздел емкостью более 2-х Гбайт. Для устранения этого ограничения фирма Microsoft разработала FAT 32. Она работает как FAT 16, но имеет отличие в организации хранения данных. Кроме того, FAT 32 можно установить с помощью программы Fdisk. Впервые FAT 32 была реализована в Windows 95 OEM Service Release 2 (OSR2). Она встроена и в Windows 98/Ме/NT/2000.

    Основное преимущество FAT 32 – возможность использования 32-разрядных записей вместо 16-разрядных, что приводит к увеличению кластеров (вместо 216=65536) до 268 435 456 в разделе. Это значение в Windows 95 OSR2 эквивалентно 2 28 , а не 2 32 , поскольку 4 бита из 32 зарезервированы для других целей.

    При работе в FAT 32 размер раздела может достигать 2 Tбайт при кластере размером 8, 16 или 32 Кбайт. Новая файловая система может иметь 232 кластеров размером 512 байт , а размер единичного файла может составить 4 Гбайт. Реально FAT 32 поддерживает максимальный размер тома до 32 Гбайт. Это связано с тем, что в Windows 2000 это ограничение обусловлено программой Format . Вообще максимально возможный том – 2 Tбайт при кластере 32 Кбайт.

    Существует важное отличие FAT 32 от ее предшественниц – положение корневого каталога: он может располагаться в любом месте раздела и иметь любой раздел. Это обеспечивает динамическое изменение размера раздела. Независимые разработчики использовали это свойство. Так, фирма Power- Quest создала программу Partion Magic, позволяющую переопределять разделы после их создания.

    Файловая система FAT 32 также использует преимущество двух копий FAT . Как и в FAT 16, в FAT 32 первая копия является основной и периодически копирует данные в дополнительную копию FAT . При проблемах с главной копией FAT системы переключаются в дополнительную копию, которая становится главной.

    Примечание: программа Fdisk автоматически определяет размер кластера на основе выбранной файловой системы и размерам раздела. Однако существует недокументированный параметр команды Format , позволяющий явно указать размер кластера : Format /z:n, где n – размер кластера в байтах, кратный 512.

    Читайте также: