Алгоритм поиска расположения файлов на диске



 

Определение начального кластера расположения файла на диске

Расчет номеров цепочки кластеров расположения фала на диске

Для того, чтобы определить начальный номер кластера, необходимо считать из корневой директории ROOT или из любой другой 32-байтную запись с информацией о файле. В 26-27 байтах хранится необходимая информация, которая укажет нам номер первого занимаемого файлом кластера. Извлекаем эти 2 байта в переменную типа WORD    

Рис. 3. Узнаём номер начального кластера

В памяти число представлено как 02 00, получается, что значение будет 0002. Это и есть номер кластера.

Далее переходим к таблице FAT, и по ней уже определяем всю цепочку кластеров. 

Рис. 4. Дамп FAT демонстрирующий цепочку кластеров расположения файла.

Последовательность действий такова:

В нашем случае (12-бит) умножаем номер кластера на 1,5 (2*1,5=3). В случае дробного числа берём только целую часть.

Прочитаем слово по результирующему адресу, то есть смещению от начала FAT (0340, значение 4003). Если номер кластера четный, то берём младшие 12 бит, в случае если номер кластера нечётный берём старшие 12 бит. В нашем случае получаем (003)

Полученный результат даёт нам номер следующего кластера. Проделываем пункты 1-2 до тех пор, пока не получим значение FFF, говорящее о конце файла

В данном случае цепочка кластеров имеет вид: 003-004-005-006-FFF

 

Методы доступа к информации на дисках

Доступ к информации, записанной на магнитном диске, может выполняться либо последовательным, либо прямым методом доступа. Использование прямого метода доступа позволяет позиционировать головки сразу на тот файл, который вам нужен (или на нужную запись файла). Например, вы можете задать номер сектора на определенной дорожке и номер головки.

 

Изменение элементов таблиц FAT и ROOT при выполнении команд DOS : COPY , MOVE , DEL , RENAME .

При выполнении команд DOS: COPY, MOVE, DEL, RENAME были отмечены следующие изменения в структуре системных файлов:

- выполнение команды COPY в ROOT создаёт новый элемент, а в FAT образуется новая цепочка

- выполнение команды DEL в ROOT помечается символом 0xE5 вместо первой буквы имени, а в FAT все элементы цепочки удалённого файла получают значение 000h.

- выполнение команды MOVE никак не отражается в таблице FAT

 


Организация обслуживания прерываний

Общие сведения о механизме прерываний

Прерывания – это принудительная передача управления от выполняемой программы к системе (а через нее – к соотв программе обработки прерывания), происходящая при возникновении определенного события. Основная цель введения прерываний – реализация синхронного режима работы и распараллеливание работы отдельных устройств вычислительного комплекса.

Механизм прерываний

Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции.

Программы могут сами вызывать прерывания с заданным номером. Для этого они используют команду INT. Это так называемые программные прерывания. Программные прерывания не являются асинхронными, так как вызываются из программы. Программные прерывания удобно использовать для организации доступа к отдельным, общим для всех программ функциям.

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

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

Иногда желательно сделать систему нечувствительной ко всем или отдельным аппаратным прерываниям. Для этого используют так называемое маскирование прерываний.

Уровни приоритетов обозначаются сокращенно IRQ0 - IRQ15.

Приведем список аппаратных прерываний, расположенных в порядке убывания приоритета:

Номер описание

8 IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду

9 IRQ1 - прерывание от клавиатуры

A       IRQ2 - используется для каскадирования аппаратных прерываний

70      IRQ8 - прерывание от часов реального времени

 

Аппаратные прерывания

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

Аппаратные прерывания  вызываются событиями, физически связанными в аппаратуре с соответствующими векторами прерываний. Например, клавиатура в PC связана с прерыванием 9. Нажатие клавиши вызывает прерывание выполняемой программы и переход по адресу, находящемуся в векторе прерывания, соответствующему прерыванию 9. В памяти этот вектор находится по адресу 0х24 (9*4 байт ).

 

Программные прерывания

Программные прерывания – эти прерывания происходят по соответствующей команде прерывания, т е по этой команде процессор осуществляет практически те же действия, что и при обычных внутренних прерываниях.

Программные прерывания удобно использовать для организации доступа к отдельным, общим для всех программ модулям. Например, программные модули операционной системы доступны прикладным программам именно через прерывания, и нет необходимости при вызове этих модулей знать их текущий адрес в памяти. Прикладные программы могут сами устанавливать свои обработчики прерываний для их последующего использования другими программами. Для этого встраиваемые обработчики прерываний должны быть резидентными в памяти.

Программные прерывания происходят при выполнении в текущей программе команды INT с номером прерывания в качестве операнда. В остальном нет никакой разницы между программным и аппаратным прерыванием. Если необходимо организовать обработку прерывания, необходимо:

прочитать содержимое элемента таблицы векторов прерываний для вектора с нужным номером;

запомнить это содержимое в области данных программы;

установить новый адрес в таблице векторов прерываний так, чтобы он соответствовал началу программы обработки прерывания;

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

Для чтения вектора используется функция 35h прерывания 21h. Перед ее вызовом регистр AL должен содержать номер вектора в таблице. После выполнения функции в регистрах ES:BX будет искомый адрес обработчика прерывания. Функция 25h прерывания 21h устанавливает для вектора с номером, находящимся в AL, обработчик прерывания DS:DX.

В Си библиотека Quick C содержит функции _dos_getvec(), _dos_setvect(). Первая функция получает адрес из таблицы векторов прерываний, вторая устанавливает новый адрес; имеется функция для организации цепочки прерываний - _chain_intr().

 

Таблица векторов прерываний

Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти. Эта таблица находится в диапазоне адресов от 0000:0000 до 0000:03FFh и состоит из 256 элементов - дальних адресов обработчиков прерываний.

Элементы таблицы векторов прерываний называются векторами прерываний. В первом слове элемента таблицы записана компонента смещения, а во втором - сегментная компонента адреса обработчика прерывания.

Вектор прерывания с номером 0 находится по адресу 0000:0000, с номером 1 - по адресу 0000:0004 и т. д. Инициализация таблицы выполняется частично системой базового ввода/вывода BIOS после тестирования аппаратуры и перед началом загрузки операционной системой, частично при загрузке MS-DOS. Операционная система MS-DOS может изменить некоторые вектора прерываний, установленные BIOS.

Функции ДОС по работе с прерываниями

Для облегчения работы по замене векторов прерываний MS-DOS предоставляет в наше распоряжение специальные функции, предназначенные для чтения элемента таблицы векторов прерывания и для записи в нее нового адреса. Если использовать эти функции, MS-DOS гарантирует, что операция по замене вектора будет выполнена правильно. Вам не надо заботиться о непрерывности процесса замены вектора прерывания.

Для чтения вектора используют функцию 35h прерывания INT 21h . Перед ее вызовом регистр AL должен содержать номер вектора в таблице. После выполнения функции в регистрах ES:BX будет искомый адрес обработчика прерывания.

Для вектора с номером, находящимся в регистре AL, функция 25h прерывания INT 21h устанавливает новый обработчик прерывания. Адрес обработчика прерываний следует передать через регистры DS:DX.

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

Очень важно не забыть перед завершением работы восстановить содержимое измененных векторов в таблице прерываний.

Дело в том, что память, которая была распределена программе, после завершения работы программы освобождается. Она может быть использована, например, для загрузки другой программы. Если забыть восстановить вектор и пришло прерывание, то система может разрушиться - вектор теперь указывает на область, которая может содержать что угодно.

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

• прочитать содержимое элемента таблицы векторов прерываний для вектора с нужным вам номером;

• запомнить это содержимое (адрес старого обработчика прерывания) в области данных программы;

• установить новый адрес в таблице векторов прерываний так, чтобы он указывал на начало вашей программы обработки прерывания;

• перед завершением работы программы прочитать из области данных адрес старого обработчика прерывания и записать его в таблицу векторов прерываний.

Кроме того, операция изменения вектора прерывания должна быть непрерывной в том смысле, что во время изменения не должно произойти прерывание.

 

Перехват прерывания

Чтобы по прерыванию NN получала управление пользовательская interrupt-функция, необходимо записать ее адрес на место вектора NN.

После того как записать на место прерывания NN адрес своей программы обработки прерывания, по этому прерыванию управление будет передаваться пользовательской interrupt-функции. Но те действия, которые выполнял системный обработчик прерывания NN были не лишними, а может быть, и жизненно необходимыми для функционирования системы. Чтобы не дублировать эти действия в своем обработчике прерывания, необходимо прежде, чем записывать свой адрес на место вектора, сохранить где-то тот адрес, который там был записан (адрес системного обработчика). Первым (после сохранения регистров) действием нашего обработчика должна быть передача управления по этому адресу, то есть вызов системного обработчика прерывания. Такой подход в некоторых источниках называется "дополнением прерывания". Когда программа, включающая в себя пользовательскую обработку прерывания, заканчивается, она должна восстановить значение перехваченного вектора, то есть, системную обработку прерывания.

Для облегчения работы по замене прерывания DOS предоставляет специальные функции для чтения элемента таблицы векторов прерывания и для записи в нее нового адреса.

Для чтения вектора используйте функцию 35h прерывания 21h. Перед ее вызовом регистр AL должен содержать номер вектора в таблице. После выполнения функции в регистрах ES:BX будет искомый адрес обработчика прерывания.

Функция 25h прерывания 21h устанавливает для вектора с номером, находящимся в AL, обработчик прерывания DS:DX.

Для пользователей языка Си библиотека Quick C содержит функции _dos_getvec(), _dos_setvect(). Первая функция получает адрес из таблицы векторов прерываний, вторая устанавливает новый адрес.

 


Дата добавления: 2019-02-13; просмотров: 558; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!