Операционные системы
ОПЕРАЦИОННАЯ СИСТЕМА MS-DOS
Методические указания к лабораторным работам для студентов 2 и 3 курса
Способы обращения к ОС MS-DOS
Программы, составленные на языке С, обращаются к прерываниям MS-DOS с помощью таких функций как intdos, int86, intdosx
Для передачи параметров используются структуры REGS, WORDREGS, BYTEREGS, SREGS, описанные в файле dos. h. Программа записывает параметры в поля структуры, соответствующие регистрам процессора, а затем вызывает одну из перечисленных выше функций, передавая ей адрес структуры. После выполнения прерывания результат записывается в эту же или другую структуру. Например: union REGS inregs, outregs; struct SREGS segregs;…
inregs. h. ah. = 0x3a; segregs. ds = FP_SEG (dir_name); inregs. x. dx = FP_OFF (dir_name); intdosx (&inregs, &outregs, &segregs) ;…
В этом фрагменте кода вызывается функция 3Ah прерывания INT 21h, для чего используется функция intdosx, которая входит в стандартную библиотеку системы разработки С++. Номер функции записывается в поле h. ah объединения inregs, параметры функции (передаваемые через регистры DS: DX) соответственно поле ds структуры segregs и в поле x. dx объединения inregs. Функция intdosx записывает содержимое регистров процессора поле выполнения программного прерывания в объединение outregs.
Объединение REGS определено в файле dos. h следующим образом: UNION REGS { struct WORDREGS x; struct BYTEREGS h; }; В нем имеется две структуры — WORDREGS и BYTEREGS.
Первая из этих структур предназначена для работы с 16-зфззядными регистрами. Она определена так: struct WORDREGS { unsigned int ax, bx, cx, dx, si. di, cflag, flags; }; В этой структуре поля ax, bx, cx, dx, si, di соответствуют одноименным регистрам центрального процессора. Значение флага переноса записывается в переменную cflag, поле flags предназначено для остальных флагов процессора.
С помощью структуры BYTEREGS можно задавать и определять содержимое 8-разрядных регистров процессора: struct BYTEREGS { unsigned char al, ah, bl, bh, cl, ch, dl, dh; }; Для работы с сегментными регистрами предназначена структура SREGS, определенная следующим образом: struct SREGS { unsigned int es; unsigned int cs; unsigned int ss, unsigned int ds; }; Для использования перечисленных выше структур программа должна одержать следующую строку: #include <dos. h> Поле вызова программного прерывания программа должна проверить флаг переноса, который сохраняется в поле cflag. Проверка поля cflag может быть выполнена, например, следующим образом: union REGS inregs, outregs;…
intdos (&inregs, &outregs); if (outregs. x. cflags! = 0) error () ;…
Код ошибки при этом записывается в переменную outregs. x. ax.
Лабораторная работа № 1 Исследование логической структуры диска в MS-DOS Цель работы Изучение логической структуры диска ОС MS-DOS Общие положения Диски ОС MS-DOS организованы по довольно жесткой схеме. Каждый диск включает в себя помимо области файлов еще несколько управляющих областей фиксированного размера. Первый сектор логического диска (сектор 1, дорожка 0, головка 0) содержит загрузочную запись — программу начальной загрузки ОС. Кроме программы начальной загрузки в загрузочной записи находятся параметры, описывающие характеристики данного логического диска. Эти параметры располагаются в самом начале сектора.
Формат загрузочной записи
Смещение байт | Размер байт | Содержание |
0 | 3 | Команда JMP xxxxx — ближний переход на программу начальной загрузки |
3 | 8 | Название фирмы-изготовителя ОС и версия. |
11 | 25 | Расширенный блок параметров BIOS |
36 | 1 | Физический номер устройства (0 — НГМД, 80h — НМД) |
37 | 1 | Зарезервировано |
38 | 1 | Символ «(" — признак расширенной загрузочной записи |
39 | 4 | Серийный номер диска, создается во время форматирования |
43 | 11 | Метка диска |
54 | 8 | Содержит запись ‘FAT12 ‘ или ‘FAT16 ‘, которая идентифицирует формат таблицы размещения файлов (FAT) |
Со смещением 11 располагается расширенный блок параметров BIOS. Этот блок содержит некоторые характеристики логического диска.
Смещение байт | Размер байт | Имя поля | Описание |
0 | 2 | set_siz | Количество байт в одном секторе диска |
2 | 1 | clustsiz | Количество секторов в одном кластере |
3 | 2 | res_sect | Количество зарезервированных секторов |
5 | 1 | fat_cnt | Количество FAT |
6 | 2 | root_siz | Максимальное количество дескрипторов файлов в корневом каталоге диска |
8 | 2 | tot_sect | Общее количество секторов на носителе данных |
10 | 1 | media | Байт-описатель среды носителя данных |
11 | 2 | fat_size | Количество секторов, занимаемых одной копией FAT |
13 | 2 | sectors | Количество секторов на дорожке |
15 | 2 | heads | Количество магнитных головок |
17 | 2 | hidden1 | Количество скрытых секторов, для носителя размером < 32 Мб |
19 | 2 | hidden2 | Количество скрытых секторов, для носителя размером > 32 Мб |
21 | 4 | tot_sect | Общее количество секторов на логическом диске, превышающим по размеру 32 Мб |
Байт описания среды — media может служит для идентификации носителя данных, например, он содержит значение F8h для жесткого диска любой емкости или значение F0h для диска размером 3,5 дюйма и емкостью 1440 Кб.
Прерывания для работы с логическим диском Для работы с логическим диском (или дискетой) на уровне логических номеров секторов MS-DOS программам два прерывания — INT 25h (чтение сектора по его логическому номеру) и INT 26h (запись сектора по его логическому номеру). Для вызова этих прерываний используется следующий формат: INT 25h — чтение сектора по его логическому адресу На входе: AL — Адрес НГМД или НМД (0-A, 1-B,
CX — количество секторов, которые нужно прочитать DX — логический номер начального сектора DS: BX — адрес буфера для чтения На выходе: AH — код ошибки при неуспешном завершении операции CF 1, если произошла ошибка; 0, если ошибки нет.
INT 26h — запись сектора по его логическому номеру На входе: AL — Адрес НГМД или НМД (0-A, 1-B,
CX — количество секторов, которые нужно записать DX — логический номер начального сектора DS: BX — адрес буфера, содержащего данные На выходе: AH — код ошибки при неуспешном завершении операции CF 1, если произошла ошибка; 0, если ошибки нет.