Архитектура Unix

Преобразование адреса смещения



Рисунок 4.8. Преобразование адреса смещения в номер блока в файловой системе

алгоритм bmap /* отображение адреса смещения в байтах от начала логического файла на адрес блока в файловой системе */ входная информация: (1) индекс (2) смещение в байтах выходная информация: (1) номер блока в файловой системе (2) смещение в байтах внутри блока (3) число байт ввода-вывода в блок (4) номер блока с продвижением { вычислить номер логического блока в файле исходя из заданного смещения в байтах; вычислить номер начального байта в блоке для ввода- вывода; /* выходная информация 2 */ вычислить количество байт для копирования пользова- телю; /* выходная информация 3 */ проверить возможность чтения с продвижением, пометить индекс; /* выходная информация 4 */ определить уровень косвенности; выполнить (пока уровень косвенности другой) { определить указатель в индексе или блок косвенной адресации исходя из номера логического блока в файле; получить номер дискового блока из индекса или из блока косвенной адресации; освободить буфер от данных, полученных в резуль- тате выполнения предыдущей операции чтения с диска (алгоритм brelse); если (число уровней косвенности исчерпано) возвратить (номер блока); считать дисковый блок косвенной адресации (алго- ритм bread); установить номер логического блока в файле исходя из уровня косвенности; } }


Рассмотрим формат файла в блоках (Рисунок 4.9) и предположим, что дисковый блок занимает 1024 байта. Если процессу нужно обратиться к байту, имеющему смещение от начала файла, равное 9000, в результате вычислений ядро приходит к выводу, что этот байт располагается в блоке прямой адресации с номером 8 (начиная с 0). Затем ядро обращается к блоку с номером 367; 808-й байт в этом блоке (если вести отсчет с 0) и является 9000-м байтом в файле. Если процессу нужно обратиться по адресу, указанному смещением 350000 байт от начала файла, он должен считать блок двойной косвенной адресации, который на рисунке имеет номер 9156. Так как блок косвенной адресации имеет место для 256 номеров блоков, первым байтом, к которому будет получен доступ в результате обращения к блоку двойной косвенной адресации, будет байт с номером 272384 (256К + 10К); таким образом, байт с номером 350000 будет иметь в блоке двойной косвенной адресации номер 77616. Поскольку каждый блок одинарной косвенной адресации позволяет обращаться к 256 Кбайтам, байт с номером 350000 должен располагаться в нулевом блоке одинарной косвенной адресации для блока двойной косвенной адресации, а именно в блоке 331. Так как в каждом блоке прямой адресации для блока одинарной косвенной адресации хранится 1 Кбайт, байт с номером 77616 находится в 75-м блоке прямой адресации для блока одинарной косвенной адресации, а именно в блоке 3333. Наконец, байт с номером в файле 350000 имеет в блоке 3333 номер 816.



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