Создание операционной системы на ассемблере

Файловые системы на базе FAT (File Allocation Table).


Этот тип файловых систем разработала фирма Microsoft достаточно давно. Вместе с первыми DOS... С тех пор неоднократно натыкались на различные препятствия и дорабатывались в соответствии с требованиями времени.

Теперь пойдет небольшой экскурс в историю. :)

  • В 1977 году Биллом Гейтсом и Марком МакДональдом была разработана первая файловая система FAT. Ради совместимости с CP/M в ней было ограничено имя файла. Максимальная длина имени составляла 8 символов, и 3 символа можно было использовать для расширения файла. Регистр букв не различался и не сохранялся. Размер кластера не превышал 4 килобайта. Размер диска не мог превышать 16 мегабайт.
  • В 1981 году вышла первая версия MSDOS, которая базировалась на FAT.
  • Начиная с MSDOS версии 3.0, в файловой системе появилось понятие каталога.
  • Для поддержки разделов более 16 мегабайт размер элемента FAT был увеличен до 16 бит, (первая версия была 12-битная) а максимальный размер кластера увеличен до 32 килобайт. Это позволило создавать разделы до 2 гигабайт.
  • В таком состоянии FAT просуществовал до появления VFAT, появившегося вместе с выходом Windows'95, в которой появилась поддержка длинных имен файлов. Теперь имя файлов могло иметь длину до 255 символов, но ради совместимости старый формат имен так же остался существовать.
  • Немного позже FAT был еще расширен, размер элемента FAT стал 32 бита, при этом максимальный размер кластера вновь уменьшился до 4 килобайт, но это позволило создавать разделы до 2 терабайт. Кроме того, была расширена информация о файлах. Теперь она позволяли хранить помимо времени создания файла время модификации и время последнего обращения к файлу.
  • Ну а теперь подробнее рассмотрим структуру этой файловой системы.

    Общий формат файловой системы на базе FAT таков:

  • Boot sector (в нем так же содержится "Блок параметров FS")
  • Reserved Sectors (могут отсутствовать)
  • FAT (Таблица размещения файлов)
  • FAT (вторая копия таблицы размещения файлов, может отсутствовать)
  • Root directory (корневая директория)
  • Область файлов. (Кластеры файловой системы)



  • Boot sector имеет размер 512 байт, как мы уже знаем, может содержать в себе загрузчик системы, но помимо этого для FAT он содержит Блок параметров. Блок параметров размещается в boot sector'е по смещению 0x0b и содержит в себе следующую информацию:

    struct FAT_Parameter_block { u_int16 Sector_Size; u_int8 Sectors_Per_Cluster; u_int16 Reserved_Sectors; u_int8 FAT_Count; u_int16 Root_Entries; u_int16 Total_Sectors; u_int8 Media_Descriptor; u_int16 Sectors_Per_FAT; u_int16 Sectors_Per_Track; u_int16 Heads; u_int32 Hidden_sectors; u_int32 Big_Total_Sectors; };

    Размер кластера можно вычислить, умножив Sector_Size на Sectors_Per_Cluster.

    Общий размер диска определяется следующим образом: Если значение Total_Sectors равно 0, то раздел более 32 мегабайт и его длина в секторах храниться в Big_Total_Sectors. Иначе размер раздела показан в Total_Sectors.

    Таблица FAT начинается с сектора, номер которого храниться в Reserved_Sectors и имеет длину Sectors_Per_FAT; при 16-битном FAT размер таблицы может составлять до 132 килобайт (или 256 секторов) (в FAT12 до 12 килобайт).
    Вторая копия FAT служит для надежности системы... но может отсутствовать.

    После таблицы FAT следует корневая директория диска. Размер этой директории ограничен Root_Entries записями. Формат записи в директории таков:

    struct FAT_Directory_entry { char Name[8]; char Extension[3]; u_int16 File_Attribute; char Reserved[10]; u_int16 Time; u_int16 Date; u_int16 Cluster_No; u_int32 Size; };

    Размер записи - 32 байта, следовательно, общий размер корневой директории можно вычислить, умножив Root_Entries на 32.

    Далее на диске следуют кластеры файловой системы. Из записи в директории берется первый номер кластера, с него начинается файл. В FAT под этим номером может содержаться либо код последнего кластера (0xffff или 0xfff для FAT12) либо номер кластера, следующего за этим.

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



    Все выше сказанное про FAT справедливо для FAT12 и FAT16. FAT32 более существенно отличается, но общие принципы организации для нее примерно такие же. VFAT ничем не отличается от FAT16, для хранения длинных имен там используется однеа запись в директории для хранения короткого имени файла и несколько записей для хранения длинного. Длинное имя храниться в unicode, и на запись в директории приходится 13 символов длинного имени, причем они разбросаны по некоторым полям записи, остальные поля заполняются с таким расчетом, чтобы старые программы не реагировали на такую запись.

    С первого взгляда видна не высокая производительность таких файловых систем. Не буду поливать грязью Microsoft, у них и без меня достаточно проблем... :) К тому же и у них есть другие разработки, которые не столь плохи. Но о них мы поговорим ниже... А сейчас давайте посмотрим на ext2fs. Правда, эта файловая система несколько другого уровня, и сравнивать ее с FAT - нельзя. Но обо всем по порядку.


    Содержание раздела