Ядро ОС Linux

       

B.7. Краткий обзор сущности типа файловой системы.


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

Интерфейс VFS достаточно универсален для поддержки обеих встроенных фс UN*X и более экзотичных, таких, как msdos и umsdos.

Каждая фс создается из следующих компонентов, принадлежащих ее собственным каталогам:

  • Запись в массиве file_streams[] (fs/filesystems.c);
  • Суперблочный файл include (include/linux/type_fs_sb.h);
  • inode include файл (include/linux/type_fs_i.h);
  • Основной include файл (include/linux/type_fs.h);
  • Две строки #include внутри include/linux/fs.h, также как изапись в структуры super_block и inode.
  • Собственная директория типа фс содержит исходные тексты, обладающие inode и осуществляющие управление обработкой информации.

    Глава про фс proc в этой книге содержит все подробности о низкоуровневом коде и интерфейсе VFS для этого типа фс. Исходный текст в fs/procfs достаточно доступен после прочтения этой главы.

    Разберем внутреннее устройство механизма VFS и фс minix в качестве примера. Я выбрал в качестве примера minix, так как она небольшая, но полная, кроме того, все фс linux берут начало от minix. Читателю предлагается разобрать в качестве упражнения тип ext2, встречающийся в инсталляции Linux.

    Во время поддержки системой фс minix minix_read_super заполняет структуру super_block информацией, полученной с поддерживаемого устройства. Поле s_op структуры содержит указатель на minix_sops, используемый основным кодом фс для быстрого выполнения операции суперблока.

    Соединение новой поддерживаемой фс с системой основывается на изменении следующих компонент (помещение sb в super_block и dir_i в место обращения):

  • sb->s_mounted указывает на inode корневого каталога поддерживаемой фс (MINIX_ROOT_INO);
  • dir_i->i_mount, содержащий sb->s_mounted;
  • sb->s_covered, содержащий dir_i;
  • Umount происходит с помощью do_umount, включающим запуск minix_put_super. Когда разрешен доступ к файлу, minix_read_inode заполняет общую системную inode структуру полями из minix_inode. Поле inode->i_op заполняется, исходя из inode->i_mode и отвечает за все будующие операции над файлом.

    Описание исходных текстов функций minix вы можете найти в fs/minix/inode.c. Структура inode_operations используется для засылки inode операций в специальные функции ядра; первая запись в структуре - указатель на file_operations, которая информационно эквивалентна i_op. Фс minix позволяет выбрать три образца наборов inode - операций (для каталогов, для файлов и для скомпанованных символов) и два образца установки file_operations.

    Операции над каталогами (одна minix_readdir) могут быть найдены в fs/minix/dir.c, операции над файлами - в fs/minix/file.c, и операции над скомпанованными символами - в fs/minix/symlink.c.

    Остальная часть каталога minix предназначена для следующих задач:

  • bitmap.c управляет распределением и очисткой inode и блоков (ext2 имеет два разных файла).
  • fsynk.c ответственнен за системные вызовы fsync() - управление прямыми, непрямыми и сдвоенными непрямыми блоками. (Я надеюсь, вы имеете о них представление из UN*X).
  • namei.c включает в себя inode-операции, связанные с именами, такие как создание и удаление node, переименование, компановка.
  • truncate.c выполняет усечение файлов.


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