Системное программное обеспечение персональных ЭВМ


Пример 8 - часть 3


Для жесткого диска выполняется по алгоритму, подобному примеру 10.2, выборка элемента таблицы разделов для заданного диска (функция Read_Mbr). Здесь и далее все операции чтения выполняются функцией Read_13, читающей один сектор при помощи прерывания BIOS. Выбранный элемент сохраняется в глобальной структуре part и используется в дальнейшем. Функция Read_Boot считывает Bootсектор логического диска, причем для гибкого диска адрес этого сектора назначается - 0, 0, 1, а для жесткого - выбирается из part. Здесь же (функция Get_First) определяется абсолютный номер начального сектора логического диска и запоминается в переменной First_Sect. Это значение вычисляется из физического адреса начала, получаемого из полей Begin_Hd, Begin_SecTrk элемента таблицы разделов; но можно предложить и другой способ его получения - в процессе перебора таблицы разделов суммировать значения полей RelSect. В дальнейшем дисковые адреса в программе представляются в виде номера логического сектора (в пределах данного логического диска), и только непосредственно перед чтением номер логического сектора преобразуется (функция Sect_to_Daddr) в физический адрес. FAT считывается в память целиком (функция Read_Fat), адрес начала FAT на диске и ее размер определяются из ранее прочитанного Boot-сектора. Далее происходит поиск имени - выделенного из задания слова в каталоге. Поиск, естественно, начинается с корневого каталога. Начальный сектор корневого каталога определяется из Boot -сектора, оттуда же выбираются и исходные данные для определения числа секторов в корневом каталоге. Эти секторы поочередно считываются в память и интерпретируются как массив из 16 элементов оглавления. В каждом секторе ищется выбранное имя (функция Find_Dir). При поиске в подкаталоге выбирается номер начального кластера подкаталога, переводится в номер сектора (функция Clust_to_Sect) и поочередно считываются подряд идущие секторы, входящие в этот кластер. При исчерпании кластера определяется номер следующего кластера, и операции повторяются для следующего кластера.Определение номера следующего кластера выполняет функция Next_Clust, анализирующая FAT. Для последнего кластера (и для корневого каталога) эта функция возвращает нулевое значение. При поиске имени в каталоге учитываются значения поля атрибутов: если искомое имя не является последним словом в задании, то оно должно представлять собой имя подкаталога, в противном случае - имя файла, атрибуты найденного элемента должны соответствовать этому условию. Если имя найдено, то переменной dirnum присваивается значение индекса найденного элемента в массиве элементов каталога, и из этого элемента выбирается номер начального кластера соответствующего подкаталога или файла. Когда найдено имя файла, файл считывается в память посекторно (так же, как подкаталог) прочитанное выводится на экран в текстовом виде. При выводе каждого следующего байта модифицируется счетчик размера файла, программа завершается при исчерпании этого счетчика.




- Начало -  - Назад -  - Вперед -