- •1. Структура и принципы работы ms-dos
- •1.1. Основные компоненты операционной системы
- •Msdos.Sys
- •Command.Com
- •Config.Sys
- •Autoexec.Bat
- •Wina20.386
- •Драйверы
- •Внешние команды
- •Подготовка системной дискеты
- •Программа fdisk
- •Резидентные программы
- •1.2. Процесс загрузки операционной системы
- •1.3. Состав и общая схема работы ms-dos
- •Файловая система
- •Система управления памятью
- •Система управления программами
- •Система связи с драйверами устройств
- •Система обработки ошибок
- •Служба времени
- •Работа с консолью оператора
- •Другие системы ms-dos
- •1.4. Обзор прерываний bios
- •Определение конфигурации компьютера
- •Определение объема оперативной памяти
- •Работа с видеоконтроллером
- •Выбрать видеорежим (00h)
- •Установить размеры и форму курсора (01h)
- •Свернуть окно (06h, 07h)
- •Работа с клавиатурой
- •Обслуживание дисковой подсистемы
- •Перезагрузка операционной системы
- •Системный сервис для машин класса at
- •1.5. Обзор прерываний ms-dos
- •Получение системной информации
- •Символьный ввод и вывод
- •Работа с файловой системой
- •Управление программами
- •Управление памятью
- •Связь с драйверами устройств
- •Другие функции
- •1.6. Обработка ошибок
- •1.7. Вызов прерываний ms-dos
- •1.8. Программа errcode
- •1.9. Переменная errno
- •1.10. Программа errno
Работа с файловой системой
MS-DOS предоставляет программам обширный сервис для работы с файлами и дисками. Практически все файловые операции можно выполнять с помощью специально предназначенных для этого функций. Только в некоторых случаях (например, защита данных от копирования) приходится использовать прямое обращение к функциям BIOS или портам контроллера диска.
С помощью файловых функций MS-DOS можно создавать и удалять файлы и каталоги, открывать и закрывать файлы, создавать временные файлы. И ввод, и вывод может быть буферизован. Программа может получить как последовательный доступ к содержимому файла, так и произвольный.
Управление программами
MS-DOS предоставляет программам возможность организовать запуск других программ или загрузку и выполнение программных оверлеев. Для этого служит функция 4Bh.
Для завершения работы программа должна также использовать одну из специальных функций MS-DOS. Функция 4Ch, завершая работу программы, позволяет передать операционной системе некоторое число, называемое кодом завершения программы. Это число может быть затем проанализировано в пакетном файле командой IF ERRORLEVEL. Если одна программа запускает другую, то первая может получить код завершения второй с помощью функции 4Dh.
Для того чтобы завершающаяся программа осталась в оперативной памяти (т. е. стала резидентной), она должна вызвать прерывание INT 27h или воспользоваться функцией 31h.
В нашей книге мы приведем различные примеры запуска программ из программ и научимся составлять резидентные программы.
Управление памятью
MS-DOS управляет распределением памяти с помощью блоков управления памятью MCB (Memory Control Block). Вся память разбивается на фрагменты различного размера, которым предшествует блок MCB, содержащий характеристики данного фрагмента (например, такие, как его размер).
Программа может динамически получать и освобождать области памяти с помощью функций 48h и 49h, соответственно. Кроме того, можно изменять размер фрагмента памяти, выделенного операционной системой программе. Это делает функция 4Ah.
Драйвер himem.sys предоставляет программе доступ к расширенной памяти, расположенной в адресном пространстве выше границы первого мегабайта. Так как в реальном или виртуальном режиме процессор не может непосредственно адресовать блоки расширенной памяти, для выполнения такой адресации необходимо пользоваться программным интерфейсом драйвера himem.sys.
Связь с драйверами устройств
Мы уже обращали ваше внимание на то, что программы не могут обращаться непосредственно к драйверам периферийных устройств. Все обращения к драйверам имеют либо неявный характер (ввод/вывод с помощью функций прерывания INT 21h), либо используют специальную функцию MS-DOS с кодом 44h. Эта функция предназначена для обмена управляющей информацией между драйвером и программой.
Другие функции
Существуют функции, позволяющие переопределять прерывания, работать с системными часами и календарем, функции для работы в сети и некоторые другие. Эти функции будут описаны позже в соответствующих разделах книги.
1.6. Обработка ошибок
Когда программа обращается к MS-DOS для выполнения какой-либо операции, она должна вызвать соответствующее прерывание, загрузив перед этим все необходимые параметры в регистры процессора. Если выполнение операции невозможно по каким-то причинам (неправильные параметры, устройство неработоспособно, запрашиваемая операция не поддерживается текущей версией MS-DOS и т. д.), то для большинства функций MS-DOS устанавливается признак ошибки - флаг переноса. При этом регистр AX содержит код ошибки.
Перечислим коды ошибок, возвращаемые программе через регистр AX.
Код |
Описание |
01 |
Указан неправильный код функции |
02 |
Файл не найден |
03 |
Путь не найден |
04 |
Слишком много открытых файлов |
05 |
Доступ запрещен |
06 |
Неправильный идентификатор |
07 |
Разрушен блок управления памятью |
08 |
Недостаточно памяти |
09 |
Неправильный адрес блока памяти |
0Ah |
Неправильная среда |
0Bh |
Неправильный формат |
0Ch |
Неправильный доступ |
0Dh |
Неправильные данные |
0Eh |
Зарезервировано |
0Fh |
Ошибка при указании диска |
10h |
Невозможно удалить текущий каталогтекущий каталог |
11h |
Другое устройство |
12h |
Больше нет файлов |
Для MS-DOS версии 3.0 и более поздних версий обработка ошибок значительно расширена. Введена функция 59h, предназначенная для получения дополнительной информации об ошибках.
При вызове этой функции регистр BX должен содержать индикатор уровня анализа ошибок, который должен быть равен 0. Кроме расширенного кода ошибки, возвращаемого в регистре AX, программа может получить класс ошибки (регистр BH), код предполагаемых действий (регистр BL), локализацию ошибки (регистр CH).
К сожалению, эта функция разрушает содержимое регистров CL, DX, SI, DI, BP, DS, ES. Программа, использующая функцию 59h прерывания INT 21h, должна позаботиться о сохранении содержимого этих регистров.
Расширенный код ошибки, возвращаемый в регистре AX, может принимать значения, указанные ниже. Коды от 1 до 12h эквивалентны кодам, рассмотренным ранее и второй раз не приводятся.
Код |
Описание |
13h |
Выполнена попытка записи на защищенный от записи диск |
14h |
Указан неизвестный идентификатор устройства |
15h |
Диск не готов |
16h |
Неизвестная команда |
17h |
Ошибка циклического кода проверки |
18h |
Неправильная длина структуры запроса |
19h |
Ошибка при поиске |
1Ah |
Неизвестен тип среды носителя данных |
1Bh |
Сектор не найден |
1Ch |
Кончилась бумага в принтере |
1Dh |
Ошибка записи |
3Eh |
Ошибка чтения |
1Fh |
Общая ошибка |
20h |
Ошибка при доступе к совместно используемому файлу |
21h |
Нарушение блокировки файла |
22h |
Неправильный диск |
23h |
FCBFCB недоступен (слишком много блоков FCB) |
24h |
Переполнился буфер, предназначенный для совместного доступа к файлам |
25h |
Несоответствие кодовых страниц |
26h |
Ошибка при обработке конца файла |
27h |
Переполнение диска |
28h - 31h |
Зарезервировано |
32h |
Сетевая функция не поддерживается |
33h |
Удаленный компьютер не отвечает |
34h |
Дублирование имени в сети |
35h |
Сетевое имя не найдено |
36h |
Сеть занята |
37h |
Сетевое устройство больше не существует |
38h |
Слишком много команд |
39h |
Ошибка в аппаратуре сетевого адаптера |
3Ah |
Неправильный ответ из сети |
3Bh |
Непредусмотренная ошибка сети |
3Ch |
Несовместимый удаленный адаптер |
3Dh |
Переполнена очередь печати |
3Eh |
Мало места в очереди печати |
3Fh |
Печать отменена |
40h |
Сетевое имя было удалено |
41h |
Доступ к сетевому ресурсу запрещен |
42h |
Неправильный тип сетевого устройства |
43h |
Сетевое имя не найдено |
44h |
Слишком много сетевых имен |
45h |
Слишком много сеансов связи |
46h |
Совместное использование ресурсов в сети временно отменено |
47h |
Сетевой запрос отвергнут |
48h |
Переадресация приостановлена |
49h - 4Fh |
Зарезервировано |
50h |
Файл уже существует |
51h |
Дублирование блока FCBFCB |
52h |
Невозможно создать дескриптор в каталоге |
53h |
Ошибка обработчика критических ошибок INT 24hINT 24h |
54h |
Слишком много переназначений |
55h |
Двойное переназначение |
56h |
Неправильный пароль |
57h |
Неправильный параметр |
58h |
Ошибка при записи данных в сети |
59h |
Нет такой функции в сети |
5Ah |
Не установлен необходимый компонент системы |
Класс ошибки, передаваемый в регистре BH, содержит информацию, которая поможет вам обработать данную ошибку:
Класс ошибки |
Описание |
1 |
Недостаточно ресурсов: блоков FCBFCB, памяти и т. д. |
2 |
Временная ситуация, попробуйте повторить операцию позже |
3 |
Нет прав доступа |
4 |
Внутренняя ошибка MS-DOS |
5 |
Ошибка аппаратуры |
6 |
Системная ошибка MS-DOS |
7 |
Ошибка в прикладной программе |
8 |
Файл или объект не найден |
9 |
Неправильный формат файла или объекта |
10 |
Файл или объект заблокирован |
11 |
Ошибка носителя данных |
12 |
Файл или объект уже существует |
13 |
Прочие ошибки |
Код предполагаемых действий, передаваемый через регистр BL, поможет вашей программе правильно обработать ошибку. Приведем список кодов предполагаемых действий:
Код |
Рекомендуемые действия |
1 |
Повторить операцию позже. Можно спросить пользователя, желает он повторить операцию или завершить работу программы |
2 |
Повторить предыдущую операцию после небольшой паузы. Если ошибка не исчезла, следует спросить пользователя, будет он ждать и дальше, или следует завершить работу программы |
3 |
Если пользователь вводил какие-то данные для MS-DOS, следует попросить его ввести эти данные еще раз (например, пользователь мог указать неправильный идентификатор диска или путь доступа к файлу) |
4 |
Аварийно завершить работу прикладной программы с выполнением всех обычных завершающих действий (закрытие файлов, сброс буферов на диск, освобождение блоков памяти и т. д.) |
5 |
Немедленный выход из программы без выполнения завершающих действий. Система находится в непредсказуемом состоянии |
6 |
Следует игнорировать ошибку |
7 |
Повторить операцию, после того как пользователь выполнит требуемые действия (установит дискету и т. п.) |
Сведения о локализации ошибки передаются в регистре CH. Приведем список кодов локализации:
Код |
Место, где произошла ошибка |
1 |
Система не знает, где произошла ошибка |
2 |
В устройстве, выполняющем обмен данными отдельными блоками (диск или магнитная лента) |
3 |
Ошибка связана с сетью |
4 |
В символьном устройстве, например, в принтере |
5 |
Ошибка связана с оперативной памятью |
Если ваша программа составлена на языке ассемблера, то после обращения к MS-DOS через прерывание следует проверить состояние флага переноса:
int 21h
jc error
MS-DOS имеет еще одно средство для обработки ошибок - обработчик критических ошибок (Critical Error Handler). Этот модуль вызывается MS-DOS, когда она получает сообщение об ошибке от драйвера устройства.
Модуль выдает на экран хорошо известное вам сообщение:
Abort, Retry, Fail?
Это сообщение обычно появляется тогда, когда вы забываете вставить дискету или начинаете печатать при отключенном принтере.
Прикладные программы могут подключать свой модуль обработки критических ошибок вместо стандартного модуля.
А теперь расскажем более подробно о том, как программа может вызывать прерывания MS-DOS.