Skip to content

06 сем Лекция 2 22.03.

LyubaxaPro edited this page Jun 15, 2021 · 3 revisions

Структура VFS.

image

Комментарии к рисунку:

  • (Standart kernel) System call interface - интерфейс системных вызовов.
  • В этой абстракции отдельно представлен уровень VFS. VFS представляет здесь уровень абстракции, определяющий Posix API, которые освобождают пользователя от знаний подробностей работы каждой конкретной файловой системы.
  • Системные вызовы (API) - open, read, write, close - работают одинаково, независимо от того, какая файловая система располагается ниже (FS0, FS1 и т.д.).

GNU и GCC

  • GNU - проект 1984го года, используется для создания программ для открытых операционных систем. GNU - ОС с открытым микроядром.
  • GCC - компилятор, один из инструментов для работы с открытым ядром.
  • GCC - GNU Compiler Collection General Public License(?).
  • Compiler Collection включает: C, C++, Objective C, Ada и т.д.
  • GNU - рекурсивный акроним GNU's Not Unix.

Файловые системы для Linux

Родными для Linux являются EXT (Extended File System), UFS (User File System), NFS (Network file system) файловые системы. NTFS (New technology file system) - файловая система, написанная под Windows.

Структуры в основе VFS

В основе VFS (внутренней организации виртуальной файловой системы) находится 4 основные структуры:

  • struct superblock
  • struct dentry
  • struct inode
  • struct file

Все эти структуры связаны между собой, связи прослеживаются в самих структурах - определяются соответствующими полями каждой из этих структур.

Интегральное представление (связей между структурами):

Комментарии к рисунку:

  • В системе существует так называемый "просто файл" - любая поименованная совокупность данных, которая находится на диске, которую мы можем увидеть в каталогах. Процесс использует файлы для того, чтобы прочитать или записать информацию. Для этого процесс должен открыть файл. В результате, для данного процесса создается файловый дескриптор в таблице открытых файлов процесса. Т.е. у каждого процесса есть собственная таблица файловых дескрипторов файлов, открытых процессом. В системе есть одна таблица открытых файлов - в ней находятся дескрипторы всех открытых файлов в системе.
  • Доступ к файлу осуществляется по полному имени файла (несмотря на то что имя не идентификатор) - для этого struct dentry.
  • Один и тот же файл может иметь несколько имен в разных директориях - это хардлинки.
  • Идентификатором файла является номер inode'a, а дескриптором - struct inode.
  • Есть два inode'a - ядреный и дисковый. Дисковый - содержит полную информацию о файле и информацию, которая позволяет адресовать каждый участок дискового пространства, в котором находится информация данного файла. Unix/Linux поддерживают очень большие файлы - для таких невозможно выделить непрерывное адресное пространство на диске -> файлы хранятся участками, необходимо хранить адреса каждого участка- все эти адреса хранятся в дисковом айноде.
  • Любой файл принадлежит определённой файловой системе. Суперблок содержит общую информацию о файловой системе (метаданные). Говорят, что "суперблок является контейнером для метаданных высокого уровня, представляющих данных конкретную ФС.
  • Суперблок это структура, которая существует на диске, причем для большей надежности в нескольких местах диска, а также в памяти. На диске суперблок предоставляет ядру инфу о конкретной файловой системе.

Раздел жесткого диска с ФС EXT2.

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

оригинал

image

Комментарии к рисунку:

  • Смонтированная файловая система содержит один суперблок, который ее описывает.
  • Важнейшая информация о файловой системе - информация о файлах, принадлежащих данной файловой системе. Файлы описываются в struct inode.
  • Для того чтобы иметь возможность обращаться к файлам файловой системы, необходимо иметь соответствующую информацию - битовую карту ilist, таблицу inode'ов.
  • Дисковый inode содержит информацию об адресе каждого блока, который содержит информацию данного файла.
  • Есть 12 блоков прямой адресации, косвенная адресация, двойная косвенная адресация, тройная косвенная адресация.

Структура struct superblock:

struct superblock 
{
    struct list_head s_list;                // обеспечивает организацию связного списка
    dev_t s_dev;                            // информация об устройстве, на  
                                            // котором находится файловая система 
    unsigned char s_block_size_bits;        // размер блока в битах 
    unsigned long s_block_size_size;        // размер блока в байтах 
    loff_t s_maxbytes;                      // максимально возможный размер файла
    struct file_system_types *s_type;       // тип файловой системы (один тип)
    const struct super_operations *s_op;    // все операции, определенные на суперблоке
    ...                                     
    unsigned long s_flags;                  // флаги монтирования
    ...
    unsigned long s_magic;                  // магическое число для доступа к суперблоку
    struct dentry *s_root;                  // точка монтирования 
    ...
    int s_count;                            // счетчик ссылок на суперблок 
    struct list_head s_mounts;              // список монтирований 
    struct block_device *s_bdev;            // связанное блочное устройство
    char s_id[32];                          // символьное имя 
    ...
    fmode_t s_mode;                         // права доступа для монтирования
    ...
    const struct dentry_operations *s_d_op; // в этом суперблоке операции над 
                                            // структурой dentry 
    ...
    struct list_head s_inodes;              // список всех inode'ов
    ...
}

Комментарии:

  • В системе существует связный список суперблоков.
  • В системе имеется структура struct file_system_types, которая описывает тип файловой системы. У каждой файловой системы есть ровно один тип, но смонтированных файловых систем одного типа может быть много.
  • Любая структура ядра содержит средства взаимоисключения - в каждой структуре есть семафоры/мьютексы для того, чтобы обеспечивать монопольный доступ к определенным полям структуры.
  • Суперблок создается на диске и в ядре.
  • struct vfsmount - описывает объект управления, который предоставляет информацию о смонтированных файловых системах.

Что-то полезное

Clone this wiki locally