LRP1
.pdfс - разряды значения сектора, С - старший разряд).
. |
╓15┬14┬13┬12┬11┬10┬09┬08╥07┬06┬05┬04┬03┬02┬01┬00╖ |
|
. |
║ ц ц ц ц ц ц ц ц Ц ц |
С с с с с с║ |
. |
╙──┴──┴──┴──┴──┴──┴──┴──╨──┴──┴──┴──┴──┴──┴──┴──╜ |
|
|
Рис. 1 |
|
Относительный сектор 0 совпадает с цилиндром 0, головкой 0, сектором 1. Относительный номер сектора увеличивается сначала по каждому сектору на головке, затем по каждой головке и наконец по каждому цилиндру.
3.4. Чтение сектора диска в память.
Для чтения содержимого требуемого сектора в указанную область памяти используется функция 2 прерывания 13h. При этом регистры имеют следующее назначение:
. ah - номер функции;
. dl - номер дисковода: 0 - "A", 1 - "B", $80 - жесткий диск;
. dh - номер головки (стороны);
. ch - номер дорожки (цилиндра);
. cl - номер сектора;
. al - число секторов;
. es - значение сегмента адреса области памяти;
. bx - значение смещения адреса области памяти.
Если функция прерывания выполнена без ошибок, то флаг переноса CF (младший разряд регистра флагов Flags) установлен в 0 и регистр ah содержит 0. Если флаг переноса установлен в 1, значит была ошибка и регистр ah содержит код ошибки (байт состояния). В таблице 4 приведен формат байта состояния для дискеты.
Таблица 4
Байт состояния дискеты
. ────────────────────────────────────────────────────────────────
. |
|
Биты |
|
. |
7 6 5 |
4 3 2 1 0 |
Значение |
|
──────────────────────────────────────────────────────────────── |
||
|
. . . . . . . 1 |
Неверная команда: неправильный запрос |
|
|
|
|
к контроллеру дискеты |
|
. . . . . . 1 . |
Плохой адресный маркер: неверная маркировка |
|
|
|
|
идентификатора сектора или маркер не найден |
|
. . . . . 1 . . |
Плохой сектор: на дискете нет заданного |
|
|
|
|
сектора |
|
───────────────────────────────────────────────────────────────── |
||
|
|
|
51 |
. |
|
Продолжение табл.4 |
|
─────────────────────────────────────────────────────────────── |
|
. |
Биты |
|
. |
7 6 5 4 3 2 1 0 |
Значение |
────────────────────────────────────────────────────────────────
. . . . 1 . . . |
Ошибка прямого доступа к памяти (DMA) |
. . . 1 . . . . |
Ошибка циклического кода : ошибка в четнос- |
|
ти данных при чтении дискеты |
. . 1 . . . . . |
Ошибка контроллера дискеты: неисправность |
|
контролллера дискеты |
. 1 . . . . . . |
Ошибка поиска: ошибка при перемещении на |
|
заданную дорожку |
1 . . . . . . . |
Тайм-аут: дисковод не отвечает |
. . . . . . 1 1 |
Ошибка защиты записи: попытка записи на за- |
|
щищенную дискету |
. . . . 1 . . 1 |
Ошибка границы DMA : попытка обращения за |
|
пределы области 64K |
───────────────────────────────────────────────────────────────────
4.Порядок выполнения
4.1.С помощью функции 2 прерывания 13h прочитать в память содержимое первого сектора жесткого диска (Прочитать таблицу разделов) (см. п. 2.3).
4.2. Проверить правильность выполненной операции.
4.3.Используя таблицу разделов жесткого диска (табл. 2), опре делить число разделов жесткого диска ПЭВМ.
4.4.Используя таблицу 2, определить начало раздела (номера головки, сектора и цилиндра), т.е. адрес корневого сектора (Boot). Номер требуемого раздела выбрать следующим образом:
. нр = нж mod чр,
. где:нр - номер раздела; нж - номер студента в журнале;
чр - определенное в п. 3.2 число разделов.
4.5. Используя таблицу 2, определить тип FAT (12-битная или 16-битная).
52
4.6.С помощью функции 2 прерывания 13h прочитать в память и вывести на экран (все данные по смещениям) содержимое корневого сектора
(Boot) выбранного раздела и проверить правильность операции.
4.7.Используя таблицу 1 определить адрес (номера головки, цилиндра и сектора) области FAT и корневого каталога.
5.Особенности программирования
5.1.На языке Турбо-Паскаль.
5.1.1.При использовании программного прерывания необходимо:
-подключить модуль Dos, в котором описаны процедура Intr и тип переменной Registers;
-объявить переменную этого типа, например, reg:Registers;
-к регистрам микропроцессора обращаться, как reg.ah, reg.al
ит.д.;
-процедуру прерывания 13H вызывать следующим образом:
Intr($13,reg).
5.1.2. Область памяти, куда считывается содержимое сектора, удобно объявить как массив байтов:
. |
var |
. |
sect:array[0..511] of byte; |
Тогда необходимые значения сегмента и смещения адреса области памяти можно задать, используя функции Seg и Ofs:
. |
reg.es:=Seg(sect); |
. |
reg.bx:=Ofs(sect); |
|
5.2. На языке Турбо-Си. |
5.2.1.При использовании программного прерывания необходимо:
- подключить библиотеку Dos, в котором описаны процедура Int86x
и
тип смеси REGS директивой:
. |
#include <dos.h> |
|
- объявить переменные смеси: |
|
53 |
. |
union REGS in,out,sr; |
- к регистрам микропроцессора обращаться, как in.h.ah, in.x.ax;
-к сегментным регистрам обращаться, как sr.es;
-процедуру прерывания 13H вызывать следующим образом:
. Int86x(0x13,&in,&out,&sr).
5.2.2. Область памяти, куда считывается содержимое сектора, удобно объявить как массив байтов:
. |
unsigned char buf[512]; |
Тогда необходимые значения сегмента и смещения адреса области памяти можно задать, используя функции FP_SEG() и FP_OFF():
. |
sr.es=FP_SEG(buf); |
. |
in.x.bx=FP_OFF(buf); |
6. Индивидуальные задания Индивидуальные задания в данной лабораторной работе определе-
ны в п. 4.4.
7.Содержание отчета
7.1.Тема лабораторной работы. 7.2.Цель работы.
7.3.Порядок выполнения. 7.4.Индивидуальное задание. 7.5.Текст программы. 7.6.Результаты работы программы. 7.7.Выводы.
Лабораторная работа 7
СТРУКТУРА КОРНЕВОГО КАТАЛОГА
1. Цель работы
Изучение структуры корневого каталога и приобретение практических навыков работы с его отдельными элементами.
54
2.Темы для предварительной проработки
2.1.Организация корневого каталога.
3.Описание работы
3.1.Структура корневого каталога.
Каждый диск имеет один корневой каталог. Расположение корневого каталога на диске фиксировано и определяется типом и форматом диска. Адрес каталога можно определить, используя таблицу разделов (только для жестких дисков) и таблицу корневого сектора (см. лаб. раб. "Структура дисков" ).
Корневой каталог используется для хранения информации о файлах, включая имя файла, его размер, начальный элемент таблицы раз-
мещения, относящийся к данному файлу, |
дату и время его создания |
|
или модификации и атрибуты файла (см. табл. |
1). |
|
Каталог представляет собой таблицу, |
в |
которой каждому файлу |
на диске (включая подкаталоги и метку тома) соответствует одна за-
пись. |
Эта запись имеет размер 32 байта, |
следовательно на одном |
||
секторе |
размером 512 байтов помещается 16 записей (элементов) ка- |
|||
талога. |
|
|
|
|
|
|
|
|
Таблица 1 |
|
|
Поля записи каталога |
||
────────────────────────────────────────────────────────── |
||||
Поле Смещ. |
Описание |
Размер |
Формат |
|
────────────────────────────────────────────────────────── |
||||
1 |
0 |
Имя файла |
8 |
Символы ASCII |
2 |
8 |
Имя расширения файла |
3 |
Символы ASCII |
3 |
11 |
Атрибуты |
1 |
Биты байта |
4 |
12 |
Служебное поле |
10 |
Не используется |
5 |
22 |
Время создания |
2 |
Слово |
6 |
24 |
Дата создания |
2 |
Слово |
7 |
26 |
Начальный кластер |
2 |
Слово |
8 |
28 |
Размер файла |
4 |
Длинное целое |
────────────────────────────────────────────────────────────
3.2. Поля записи каталога.
3.2.1. Имя файла.
Первые восемь байтов записи каталога содержат имя файла в формате ASCII. Если имя файла короче восьми символов, то оно дополняется справа пробелами (ASCII код - 32). Буквы в имени обяза-
55
тельно должны быть заглавными.
Существует три особых ситуации, отмечаемых специальными значениями первого байта в имени файла.
Неиспользуемые элементы каталога имеют первый байт равный 0. DOS прекращает просмотр каталога, как только встретит такой элемент. Этот же признак может использовать программист при работе с каталогом как признак окончания элементов каталога.
Если первый байт имени файла равен E5h, то это означает, что данный файл уничтожен.
Уничтожение файла на диске, собственно, означает две вещи: -первый байт имени устанавливается равным E5h;
-все кластеры, относящиеся к данному файлу, помечаются в таблице размещения файлов как свободные.
Вся прочая информация об этом файле, включая остаток имени, размер фала, его начальный кластер, остается в каталоге.
Третий особый случай - когда в качестве первого байта имени используется символ "." (ASCII код - 2h). Этот символ применяется для указания подкаталогаа. Если и второй символ имени - точка, тогда этот элемент каталога соответсвует катологу-родителю текущего, а поле начального кластера указывает расположение каталога-ро- дителя.
3.2.2. Расширение имени файла.
Непосредственно за именем файла следует расширение имени файла, записанное в формате ASCII. Длина его составляет три байта и подобно имени файла, если расширение имени состоит меньше чем из
трех символов, оно дополняется пробелами. |
Однако если имя файла |
|
должно состоять хотя бы из одного символа, |
расширение может иметь |
|
одни пробелы. |
|
|
3.2.3. Атрибуты файла. |
|
|
Формат байта атрибутов файла представлен в таблице 2. |
||
|
Таблица 2 |
|
|
Формат байта атрибутов файла |
|
──────────────────────────────────────── |
||
Биты |
Значение, когда бит = 1 |
|
────────────────────────────────────────
0Разрешено только чтение
1Скрытый
2Системный
3Метка тома
4Подкаталог
────────────────────────────────────────
56
Продолжение табл.2
────────────────────────────────────────
Биты Значение, когда бит = 1
────────────────────────────────────────
5Архив
6Не используется
7Не используется
────────────────────────────────────────
Если разрешено только чтение файла, то в этом случае файл защищен от любого изменения или удаления с помощью любых операций
DOS.
Биты 1 и 2 маркируют файл как скрытый или системный. Файлы помеченные как скрытые или системные, или и те и другие, нельзя увидеть с помощью простой операции DOS вроде DIR (чтобы увидеть такой файл необходимо изменить его атрибут). Атрибут "системный" не имеет какого-то особого значения, он остался по наследству от операционной системы CP/M и в DOS абсолютно ничего не делает.
Бит 3 маркирует элемент каталога как метку, что означает, что этот элемент содержит идентифицирующую метку тома диска. Метка записывается в полях имени и расширении имени файла, которые в данном случае расматриваются как объединенное поле. Поля размера и начального кластера не используются, хотя поля даты и времени используются.
Бит 4 маркирует элемент каталога как подкаталог. Подкаталоги записываются на диске подобно обычным файлам. Для элемента каталога такого типа используются все поля, за исключением поля размера файла, которое равно нулю. Действительный размер подкаталога определяется просмотром его FAT.
Бит 5, атрибут архива был создан для того, чтобы помочь копированию большого количества файлов, хранящихся на жестком диске. Этот разряд сброшен для всех файлов, которые изменились после последнего копирования. Для дискет атрибут архива практически бесполезен.
3.2.4. Служебное поле.
Это поле оставлено для возможного использования в будущем. Все 10 байтов поля обычно равны 0.
3.2.5. Время создания файла или его последней модификации. Поле 5 содержит 2-байтовое значение, указывающее время созда-
ния или последнего изменения файла. Вместе с полем даты эти два поля могут рассматриваться как одно 4-байтовое беззнаковое число.
57
Это |
число может сравниваться с такими же числами в других элемен- |
||||||||
тах каталога на больше, |
меньше или равно. |
Формат поля времени |
и |
||||||
выражения для |
выделения |
часов, |
минут и 2-секундных единиц (для |
||||||
хранения полных секунд не хватило |
одного |
бита) |
представлены |
на |
|||||
рис. 1. |
|
|
|
|
|
|
|
|
|
╓15┬14┬13┬12┬11┬10┬09┬08╥07┬06┬05┬04┬03┬02┬01┬00╖ |
|
||||||||
║ |
часы |
│ |
минуты |
│ |
сек/2 |
║ |
|
||
╙──┴──┴──┴──┴──┴──┴──┴──╨──┴──┴──┴──┴──┴──┴──┴──╜ |
|
||||||||
|
╚═════╦═════╝ |
╚═══════╦══════╝ |
╚═════╦═════╝ |
|
|||||
|
║ |
|
|
║ |
|
|
╚════ 2-секундные |
|
|
|
║ |
|
|
║ |
|
|
|
единицы (0-30) |
|
|
║ |
|
|
║ |
|
|
|
(t & 001fH) |
|
|
║ |
|
|
║ |
|
|
|
|
|
|
║ |
|
|
╚═══════════════ минуты (0-59) |
|
||||
|
║ |
|
|
|
|
|
((t & 07e0H >> 5) |
|
|
|
║ |
|
|
|
|
|
|
|
|
|
║ |
|
|
|
|
|
|
|
|
╚══════════════════════════ часы (0-23)
((t & 0f800H) >> 11)
Рис. 1 3.2.6. Дата создания файла или его последней модификации.
Поле 6 содержит 2-байтовое значение, указывающее на дату создания или изменения файла. Вместе с полем времени эти два поля могут рассматриваться как одно 4-байтовое беззнаковое число. Это число может сравниваться с такими же числами в других элементах каталога на больше, меньше или равно. Формат поля даты и выражения для выделения дня, месяца и года представлены на рис. 2.
╓15┬14┬13┬12┬11┬10┬09┬08╥07┬06┬05┬04┬03┬02┬01┬00╖
║ |
год |
│ месяц │ |
день |
║ |
╙──┴──┴──┴──┴──┴──┴──┴──╨──┴──┴──┴──┴──┴──┴──┴──╜ |
||||
╚════════╦════════╝ |
╚════╦════╝ |
╚═════╦═════╝ |
||
|
║ |
║ |
╚════ день (0-31) |
|
|
║ |
║ |
|
(d & 001fH) |
|
║ |
║ |
|
|
|
║ |
╚═════════════ месяц (1-12) |
||
|
║ |
|
|
((d & 01e0H) >> 5) |
|
║ |
|
|
|
╚════════════════════════ год (0-119)
((d & f800H) >> 9)
Рис. 2
58
Для получения истинного значения года надо к значению года, выделенного из даты прибавить 1980.
3.2.7. Номер начального кластера Кластер - это группа смежных секторов. Величина кластера,ко-
торая для разных типов дисков и форматов может быть разной, указывается в таблице корневого сектора.
Поле 7 - это 2-байтовое значение, которое дает номер начального кластера для области данных файла. Оно действует как точка входа в цепочку занятого пространства файла, находящуюся в FAT. Для файлов, не занимающих области данных, а также для меток томов номер начального кластера равен нулю.
3.2.8. Размер файла.
Последнее поле элемента файла дает размер файла в байтах. Отметим, что когда DOS читает файл, она указывает на конец файла, когда превышает размер файла или когда достигает конца цепочки занятого пространства в FAT в зависимости от того, что первым
будет обнаружено.
3.3. Чтение сектора диска в память.
Для чтения содержимого требуемого сектора в указанную область памяти используется функция 2 прерывания 13h. При этом регистры имеют следующее назначение:
ah - номер функции;
dl - номер дисковода: 0 - "A", 1 - "B", $80 - жесткий диск; dh - номер головки (стороны);
ch - номер дорожки (цилиндра); cl - номер сектора;
al - число секторов;
es - значение сегмента адреса области памяти; bx - значение смещения адреса области памяти.
Если функция прерывания выполнена без ошибок, то флаг переноса CF (младший разряд регистра флагов Flags) установлен в 0 и регистр ah содержит 0. Если флаг переноса установлен в 1, значит была ошибка и регистр ah содержит код ошибки (байт состояния). В таблице 3 приведен формат байта состояния для дискеты.
59
Таблица 3
Байт состояния дискеты
────────────────────────────────────────────────────────────────
Биты |
|
7 6 5 4 3 2 1 0 |
Значение |
────────────────────────────────────────────────────────────────
. . . . . . . 1 |
Неверная команда: неправильный запрос |
|
к контроллеру дискеты |
. . . . . . 1 . |
Плохой адресный маркер: неверная маркировка |
|
идентификатора сектора или маркер не найден |
. . . . . 1 . . |
Плохой сектор: на дискете нет заданного |
|
сектора |
. . . . 1 . . . |
Ошибка прямого доступа к памяти (DMA) |
. . . 1 . . . . |
Ошибка циклического кода : ошибка в четнос- |
|
ти данных при чтении дискеты |
. . 1 . . . . . |
Ошибка контроллера дискеты: неисправность |
|
контролллера дискеты |
. 1 . . . . . . |
Ошибка поиска: ошибка при перемещении на |
|
заданную дорожку |
1 . . . . . . . |
Тайм-аут: дисковод не отвечает |
. . . . . . 1 1 |
Ошибка защиты записи: попытка записи на за- |
|
щищенную дискету |
. . . . 1 . . 1 |
Ошибка границы DMA: попытка обращения за пре- |
|
делы области 64K |
────────────────────────────────────────────────────────────────
4.Порядок выполнения
4.1.С помощью функции 2 прерывания 13h прочитать в память содержимое первого сектора корневого каталога (адрес корневого каталога был определен в лаб. раб. "Структура дисков").
4.2.Проверить правильность выполненной операции.
4.3.Для всех файлов этого сектора определить и вывести на экран следующие данные файлов:
-имя файла и его расширенное имя; -атрибуты; -номер начального кластера;
-время и дату создания; -размер.
60
