Linux Kernel (Ядро линукса) (часть 2)


Системные вызовы, обрабатываемые VFS

перечислены системные вызовы, относящиеся к файловым системам, обычным файлам, каталогам и символьным ссылкам. Некоторые другие системные вызовы, обрабатываемые VFS, такие как iopermo, ioctio, pipe и mknod , имеют отношение к файлам устройств и каналам. Они обсуждаются в следующих главах. Еще одна группа системных вызовов, обрабатываемых VFS, В которую ВХОДЯТ, например, socket о, connect о И bind, относится к сокетам и применяется в реализации сетей. Некоторые из служебных процедур ядра, соответствующих системным вызовам,
Ранее мы уже говорили, что VFS является слоем между программами и конкретными файловыми системами. Однако в отдельных случаях VFS может самостоятельно выполнить файловую операцию, не обращаясь к процедуре более низкого уровня. Например, когда процесс закрывает открытый файл, никакие операции с файлом на диске, как правило, не требуются, и VFS просто освобождает соответствующий файловый объект. Аналогичным образом, когда системный вызов lseeko перемещает файловый указатель (который является атрибутом, относящимся к взаимодействию процесса с открытым файлом), для VFS достаточно модифицировать лишь соответствующий файловый объект без обращения к файлу на диске. Следовательно, у VFS нет необходимости вызывать специальную процедуру. В определенном смысле можно считать VFS универсальной файловой системой, которая, в случае необходимости, опирается на специфические файловые системы.

Структуры данных VFS

Каждый объект VFS хранится в соответствующей структуре данных, которая включает в себя как атрибуты объекта, так и указатель на таблицу методов объекта. Ядро может динамически модифицировать методы объекта и, следо
вательно, задавать его специальное поведение. В следующих разделах подробно рассматриваются объекты VFS и их взаимоотношения.

Суперблоки

Все суперблоки объединены в циклический двунаправленный список. Первый элемент этого списка представлен переменной super block, а поле s iist суперблока содержит указатели на соседние элементы списка. Спин- блокировка sb iock защищает список от попыток одновременного обращения в многопроцессорных системах.

Поле s fs info является указателем на информацию о суперблоке конкретной файловой системы. Например, как мы увидим в главе 18, если объект-суперблок относится к файловой системе Ext2, это поле указывает на структуру ext2_sb_inf о, которая содержит битовые маски распределения пространства на диске и прочие данные, не имеющие отношения к общей файловой модели VFS.

Вообще говоря, данные, на которые указывает поле s fs info, являются информацией, взятой с копии диска в памяти, созданной из соображений эффективности. Каждая дисковая файловая система должна читать и обновлять свои битовые карты распределения свободного места, чтобы выделять и освобождать блоки на диске. VFS позволяет этим файловым системам работать непосредственно с полем s fs info суперблока в памяти, не обращаясь к диску.
Впрочем, такой подход создает одну проблему. Суперблок VFS может оказаться рассинхронизированным с соответствующим суперблоком на диске. Это приводит к необходимости введения флага s dirt, который показывает, является ли суперблок "грязным”, т. е. следует ли обновлять данные на диске. Отсутствие синхронизации приводит к известной проблеме разрушенной файловой системы, которая возникает, когда электропитание неожиданно выключается, не давая пользователю осуществить корректный останов системы. Как мы увидим в разд. "Запись грязных страниц на диск" в главе 75, Linux минимизирует эту проблему, периодически копируя все грязные” суперблоки на диск.

Методы, связанные с объектом суперблок”, называются операциями суперблока. Они описаны в структуре super operations, адрес которой хранится в поле s op.

В каждой файловой системе могут быть определены собственные операции суперблока. Когда VFS нужно вызвать один из них, например read inode , она выполняет следующий код:
sb->s_op->read_inode(inode);
Здесь sb содержит адрес соответствующего суперблока. Поле read inode таблицы super operations хранит адрес нужной функции, которая и вызывается.
Кратко опишем операции суперблока, реализующие операции высокого уровня, такие как удаление файлов или монтирование дисков. Они приведены в том порядке, в каком хранятся в таблице super operations:
- aiioc inode (sb) — выделяет место для объекта индексный дескриптор”, в том числе и для данных о конкретной файловой системе;
- destroy inode(inode)— уничтожает объект индексный дескриптор” и данные о конкретной файловой системе;
- read inode (inode) — заполняет поля объекта индексный дескриптор”, переданного в качестве параметра, данными, хранящимися на диске; поле i ino объекта индексный дескриптор” идентифицирует конкретный индексный дескриптор файловой системы, который следует прочитать с диска;
- dirty inode(inode) — вызывается, когда индексный дескриптор помечен как модифицированный (грязный). Используется файловыми системами, такими как ReiserFS и Ext3, для обновления журнала файловой системы на диске;
- write inode(inode, flag) — записывает в индексный дескриптор файловой системы содержимое объекта индексный дескриптор”, переданного в качестве параметра; поле i ino объекта индексный дескриптор” идентифицирует конкретный индексный дескриптор файловой системы на диске. Параметр flag показывает, должна ли операция ввода/вывода быть синхронной;
- put inode (inode) — вызывается при освобождении индексного дескриптора (уменьшении на единицу его счетчика ссылок) для выполнения операций, специфических для файловой системы;
- drop inode(inode) — вызывается непосредственно перед уничтожением индексного дескриптора, т. е. когда последний пользователь освобождает индексный дескриптор. Файловые системы, в которых реализован этот метод, обычно используют generic_drop_inode. Эта функция удаляет все ссылки на индексный дескриптор из структур данных VFS и, если индексный дескриптор больше не присутствует в каталоге, вызывает метод суперблока deiete inode, который удаляет индексный дескриптор из файловой системы;
- deiete inode (inode) — вызывается, когда индексный дескриптор должен быть уничтожен. Удаляет индексный дескриптор VFS из памяти, а также данные файла и метаданные с диска;
- put super (super) — освобождает объект-суперблок, переданный в качестве параметра (потому что соответствующая файловая система размонтирована);
- write super (super) — записывает в суперблок файловой системы содержимое указанного объекта;
- sync_fs(sb, wait) — вызывается при сбросе на диск содержимого буферов файловой системы для обновления специфичных для нее структур данных на диске (используется в журналируемых файловых системах);
- write super iockfs (super) — блокирует изменения в файловой системе и записывает в суперблок файловой системы содержимое указанного объекта. Этот метод вызывается, когда файловая система заморожена”, например, драйвером LVM (Logical Volume Manager, Менеджер логических томов);
- uniockfs (super)— снимает блокировку изменений файловой системы, установленную методом write super iockfs;
- statfs (super, buf) — возвращает статистику по файловой системе в буфере buf;
- remount fs (super, flags, data) — заново монтирует файловую систему с новыми настройками (вызывается, когда какая-то настройка монтирования должна быть изменена);
- ciear inode (inode) — вызывается, когда уничтожается индексный дескриптор на диске для выполнения операций, специфических для файловой системы;
- umount begin (super) — отменяет операцию монтирования, поскольку была запущена соответствующая операция размонтирования (применяется только в сетевых файловых системах);
- show_options (seq_file, vfsmount) — ИСПОЛЬЗуетСЯ ДЛЯ ВЫВОда настроек файловой системы;
- quota_read(super, type, data, size, offset) — ИСПОЛЬЗуетСЯ системой квот для чтения данных из файла, в котором указаны ограничения, установленные в этой файловой системе2;
- quota_write (super, type, data, size, offset) — используется системой квот для записи данных в файл, в котором указаны ограничения, установленные в этой файловой системе.
Перечисленные методы доступны во всех допустимых файловых системах, однако в каждой конкретной файловой системе имеется лишь какое-то их подмножество, а поля, соответствующие нереализованным методам, приравнены К NULL.
Обратите внимание на отсутствие метода get super для чтения суперблока.
В самом деле, как ядро стало бы вызывать метод объекта, который еще только предстоит прочитать с диска? Мы найдем эквивалентный метод get sb у другого объекта, описывающего тип файловой системы.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...