Операционные системы

ОПЕРАЦИОННАЯ СИСТЕМА 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, если ошибки нет.