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


Дескриптор группы и битовая карта

Каждая группа блоков имеет собственный дескриптор, структуру ext2_ group desc, ПОЛЯ bg_free_blocks_count, bg_free_inodes_count И bg_used_dirs_count ИС- пользуются при выделении новых индексных дескрипторов и блоков данных. Эти поля определяют самый подходящий блок, в котором следует выделить ту или иную структуру. Битовые карты являются последовательностями битов, в которых 0 означает, что соответствующий индексный дескриптор или блок данных свободен, а 1 — что он занят. Поскольку каждая битовая карта должна храниться в одном блоке, а блок может иметь размер 1024, 2048
или 4096 байтов, одна битовая карта описывает состояние 8192, 16 384 или 32 768 блоков.

Таблица индексных дескрипторов

Таблица индексных дескрипторов состоит из ряда блоков, каждый из которых содержит заранее определенное количество индексных дескрипторов. Номер первого блока таблицы индексных дескрипторов хранится в поле bg inode tabie дескриптора группы.

Все индексные дескрипторы имеют одинаковый размер, 128 байтов. Блок длиной 1024 байта содержит 8 индексных дескрипторов, а блок из 4096 байтов — 32 индексных дескриптора. Чтобы узнать, сколько блоков занято таблицей индексных дескрипторов, разделите количество индексных дескрипторов в группе (которое хранится в поле s_inodes_per_group суперблока) на количество индексных дескрипторов в блоке.
Каждый индексный дескриптор в файловой системе Ext2 представляет собой структуру ext2_inode Многие поля, имеющие отношение к спецификациям POSIX, аналогичны полям объекта "индексный дескриптор" в виртуальной файловой системе Остальные поля специфичны для реализации Ext2 и, в основном, имеют отношение к выделению блоков.

В частности, поле i size содержит фактическую длину файла в байтах, а поле i biocks — количество блоков данных (измеряемое в единицах по 512 байтов), выделенных файлу.

Значения в полях i size и i biocks не обязательно связаны. Поскольку файл всегда занимает целое число блоков, непустой файл получает хотя бы один блок данных (поскольку фрагментация блоков еще не реализована), и значение в поле i size может оказаться меньше, чем 512xi_biocks. С другой стороны, как мы увидим в разд. "Дыры в файлах" далее в этой главе, файл может содержать "дыры". В этом случае i size может превышать 512xi_biocks.
Поле i biock является массивом из ext2_n_blocks (обычно 15) указателей на блоки и используется для идентификации блоков данных, выделенных файлу 32 бита, зарезервированные под поле i size, ограничивают размер файла четырьмя гигабайтами. Фактически старший бит поля i size не используется, так что максимальный размер файла равен 2 Гбайт. Однако файловая система Ext2 использует один "грязный трюк", позволяющий иметь файлы большего размера в системах с 64-разрядным процессором, таким как Opteron фирмы AMD или IBM PowerPC G5. Суть в том, что поле i dir aci индексного дескриптора, которое не используется для обычных файлов, представляет 32-битовое расширение поля i size. Поэтому размер файла хранится в индексном дескрипторе в виде 64-битового целого. Шестидесятичетырехбитовая версия файловой системы Ext2 в определенной степени совместима с 32-битовой версией, поскольку Ext2, созданная в 64-битовой архитектуре, может быть смонтирована в 32-битовой архитектуре и наоборот. В 32- битовой архитектуре нельзя обратиться к большому файлу иначе, чем открыв его с установленным флагом o Вспомним, что модель VFS требует, чтобы каждый файл имел собственный номер индексного дескриптора. В Ext2 нет необходимости хранить на диске отображение номера индексного дескриптора в соответствующий номер блока, поскольку последний может быть вычислен по номеру группы блоков и относительной позиции внутри таблицы индексных дескрипторов. Предположим, например, что каждая группа блоков содержит 4096 индексных дескрипторов, и мы хотим узнать адрес индексного дескриптора номер 13 021. В этом случае индексный дескриптор принадлежит третьей группе блоков, и его адрес на диске хранится в 733-й записи таблицы индексных дескрипторов. Как видите, номер индексного дескриптора является ключом, позволяющим служебным процедурам файловой системы Ext2 быстро читать его с диска.

Предыдущая страница | 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 | Следующая страница




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

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

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

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

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

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

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

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

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