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

Ext2fs (Расширенная файловая система версия 2)


Linux разрабатывался на операционной системе Minix. В ней была (да и есть) файловая система minixfs. Система не очень гибкая и достаточно ограниченная. После появления Linux была разработана (на базе minixfs) файловая система extfs, которую в скором времени заменила ext2fs, которая и используется в большинстве Linux, по сей день.

Для начала давайте рассмотрим основное устройство этой файловой системы:

  • Boot sector (1 сектор)
  • Свободно (1 сектор, может быть использован для расширения Boot sector'а до килобайта)
  • Super block (2 сектора или 1024 байта длиной)
  • Group descriptors (2 сектора максимум)
  • Group 1
  • Group 2
  • ... и так далее... до Group 32 если необходимо.
  • Если ext2fs находится на каком ни будь разделе жесткого диска, или является не загрузочной, то boot sector'а там может вообще не быть.

    Super block содержит в себе информацию о файловой системе и имеет следующий формат:

    struct ext2_super_block { u_int32 s_inodes_count; u_int32 s_blocks_count; u_int32 s_r_blocks_count; u_int32 s_free_blocks_count; u_int32 s_free_inodes_count; u_int32 s_first_data_block; u_int32 s_log_block_size; int32 s_log_frag_size; u_int32 s_blocks_per_group; u_int32 s_frags_per_group; u_int32 s_inodes_per_group; u_int32 s_mtime; u_int32 s_wtime; u_int16 s_mnt_count; u_int16 s_max_mnt_count; u_int16 s_magic; u_int16 s_state; u_int16 s_errors; u_int16 s_pad; u_int32 s_lastcheck; u_int32 s_checkinterval; u_int32 s_reserved[238]; };

    Не буду описывать значение всех полей этой структуры, ограничусь основными. Размер блока файловой системы можно вычислить так: 1024 * s_log_block_size. Размер блока может быть 1, 2 или 4 килобайта размером.

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

    struct ext2_group_desc { u_int32 bg_block_bitmap; u_int32 bg_inode_bitmap; u_int32 bg_inode_table; u_int16 bg_free_blocks_count; u_int16 bg_free_inodes_count; u_int16 bg_used_dirs_count; u_int16 bg_pad; u_int32 bg_reserved[3]; };

    Содержимое группы таково:




    • Block bitmap (Битовая карта занятости блоков)
    • Inode bitmap (Битовая карта занятости inode)
    • Inode table (Таблица inode)
    • Available blocks (блоки, доступные для размещения файлов)
    Блоки в файловой системе отсчитываются с начала раздела. В дескрипторе группы содержаться номер блока с битовой картой блоков группы, номер блока с битовой картой инодов, и номер блока с которого начинается таблица inode. Про inode мы поговорим чуть попозже, а сперва разберемся с битовыми картами.



    В суперблоке храниться количество блоков в группе (s_blocks_per_group). Битовая карта имеет соответствующий размер в битах (занимает она не более блока). и в зависимости от размера блока может содержать информацию об использовании 8, 32 или 132 мегабайт максимум. Дисковое пространство раздела разбивается на группы в соответствии с этими значениями. А групп, как я уже упоминал, может быть до 32... что позволяет создавать разделы, в зависимости от размера блока, 256, 1024 или 4096 мегабайт соответственно.

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

    Теперь давайте разберемся, что такое inode. В отличии от FAT информация о файле здесь храниться не в директории, а в специальной структуре, которая носит название inode (информационный узел). В записи директории содержится только адрес inode и имя файла. При этом на один inode могут ссылаться несколько записей директории. Это называется hard link.

    Формат inode таков:

    struct ext2_inode { u_int16 i_mode; u_int16 i_uid; u_int32 i_size; u_int32 i_atime; u_int32 i_ctime; u_int32 i_mtime; u_int32 i_dtime; u_int16 i_gid; u_int16 i_links_count; u_int32 i_blocks; u_int32 i_flags; u_int32 i_reserved1; u_int32 i_block[14]; u_int32 i_version; u_int32 i_file_acl; u_int32 i_dir_acl; u_int32 i_faddr; u_int8 i_frag; u_int8 i_fsize; u_int16 i_pad1; u_int32 i_reserved2[2]; };

    Как видно из приведенной выше структуры в inode содержится следующая информация:



  • Тип и права доступа файла (i_mode)
  • идентификатор хозяина файла (i_uid)
  • Размер (i_size)
  • Время доступа, создания, модификации и удаления файла ( после удаления inode не удаляется, а просто перестает занимать блоки файловой системы)
  • Идентификатор группы
  • Количество записей в директориях, указывающих на этот inode...
  • Количество занимаемых блоков fs
  • дополнительные флаги ext2fs
  • таблица занимаемых блоков
  • Ну и другая, не столь существенная в данных момент информация.


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

    Первые 10 inode зарезервированы для специфического использования.

    Для корневой директории в этой файловой системе не отводится заранее отведенного места. Любая, в том числе и корневая директория в этой файловой системе является по сути своей обыкновенным файлом. Но для облегчения поиска корневой директории для нее зарезервирован inode номер 2.

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

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

    Примерно так же устроены файловые системы FFS, HPFS, NTFS. Но в их устройство я не буду вдаваться. И так уже выпуск очень большой получается. :)

    Но в недавнее время появился еще один тип файловых систем. Эти системы унаследовали некоторые черты от баз данных и получили общее название "Журналируемые файловые системы". Особенность их заключается в том что все действия, производимые в файловой системе фиксируются в журнале, который правда съедает некоторый объем диска, но это позволяет значительно повысит надежность систем. В случае сбоя проверяется состояние файловой системы и сверяется с записями в журнале. В случае обнаружения несоответствий довести операцию до конца не составляет проблем, и отпадает необходимость в ремонте файловой системы. К таким файловым системам относятся ext3fs, RaiserFS и еще некоторые.

    Но на этом я завершаю свой выпуск. Повторю только, что мы в первую очередь планируем ориентироваться на ext2fs, и возможно в следующем выпуске мы уже сможем рассмотреть программную работу с ext2fs. А я прощаюсь с вами до следующего выпуска, пишите. Мой адрес, как всегда, можно найти чуть ниже.

    Отправлено 2001-08-24 для 4145 подписчиков.
    ведущий рассылки Dron
    Сайт проекта
    Архив Рассылки

    При поддержке Kalashnikoff.ru



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