Оглавление.
1. Введение. 2
1.1 Уровни программной поддержки защищенного режима. 2
1.1.1 Интерфейс BIOS. 2
1.1.2 интерфейс драйвера HIMEM.SYS. 2
1.1.3 интерфейс EMS/VCPI. 3
1.1.4 интерфейс DPMI. 3
1.1.5 расширители DOS (DOS-экстендеры). 3
1.2 Текущее положение дел в мире DOS-extender-ов. 4
2. Обоснование выбора средств. 4
3. Реализация работы программы в защищенном режиме процессора 80286. 5
3.1 Адресация защищенного режима процессора 80286. 5
3.2 Переход в защищенный режим процессора 80286. 8
3.3 Возврат в реальный режим процессора. 10
3.4 Обработка прерываний в защищенном режиме. 11
3.5 Реализация мультизадачности. 13
3.5.1 Контекст задачи. 14
3.5.2 Переключение задач. 15
3.5.3 Разделение ресурсов. 16
3.5.4 Задачи. 16
4. Полные исходные тексты программы. 17
4.1 Файл TOS.INC. Определение констант и структур для модулей, составленных на языке ассемблера. 17
4.2 Файл TOS.H. Определение констант и структур для модулей, составленных на языке Си. 18
4.3 Файл TOS.H. Основной файл программы. 19
4.4 Файл TASKS.C. Содержит функции задач. 24
4.5 Файл SEMAPHOR.C. Содержит процедуры для работы с семафорами. 26
4.6 Файл TIMER.C. Процедуры для работы с таймером и диспетчер задач. 27
4.7 Файл EXCEPT.C. Обработка исключений. 28
4.8 Файл INTPROC.C. Заглушки для аппаратных прерываний. 29
4.9 Файл KEYB.C. Ввод символа с клавиатуры. 30
4.10 Файл KEYBOARD.ASM. Процедуры для работы с клавиатурой. 30
4.11 Файлы SCREEN.H и SCREEN.C – модуль для работы с видеоадаптером. 34
4.11.1 SCREEN.H 34
4.11.2 SCREEN.C 34
4.12 Файл TOSSYST.ASM. Процедуры для инициализации, перехода в защищённый режим и возврата в реальный режим, для загрузки регистра TR и переключения задач. 36
5. Выводы. 41
6. Литература. 41
Операционная система MS DOS, не смотря на свое моральное устаревание, все еще довольно часто находит применение на парке старых ПК, а значит, все еще существует необходимость создания программ для нее.
К сожалению, написание программ в реальном режиме процессоров архитектуры Intel x86 осложнено отсутствием возможности использовать в программе оперативную память объемом свыше пресловутых 640 килобайт, а реально свыше 500-620 килобайт. Это ограничение к сожалению преследует MS DOS и аналогичные ей ОС других производителей, начиная с того момента, как горячо любимый в околокомпьютерных кругах Билл Гейтс заявил, что 640 килобайт достаточно для всех возможных задач ПК. Преодоление барьера 640 килобайт в новых версиях MS DOS усложнялось необходимостью совместимости с старыми программами, которые жизненно необходимо было поддерживать. Программирование защищенного режима процессора и расширенной памяти требовало от программистов недюжинных знаний архитектуры процессоров Intel и достаточно трудоемкого программирования.
Инженерная мысль не стоит на месте, особенно в такой области, как программирование. Задача программной поддержки защищённого режима и поддержки работы с расширенной памятью получила не одно, а сразу несколько решений. Этими решениями стали так называемые уровни программной поддержки защищённого режима и поддержки работы с расширенной памятью:
- интерфейс BIOS;
- интерфейс драйвера HIMEM.SYS;
- интерфейс EMS/VCPI;
- интерфейс DPMI;
- расширители DOS (DOS-экстендеры).
Интерфейсом самого низкого уровня является интерфейс BIOS, предоставляемый программам в виде нескольких функций прерывания BIOS INT 15h. Интерфейс BIOS позволяет программе перевести процессор из реального режима в защищённый, переслать блок памяти из стандартной памяти в расширенную или из расширенной в стандартную. Этим все его возможности и ограничиваются. Интерфейс BIOS используется для старта мультизадачных операционных систем защищённого режима (таких, как OS/2) или в старых программах, работающих с расширенной памятью в защищённом режиме (например, СУБД ORACLE версии 5.1).
С помощью функций, предоставляемых этим драйвером, программа может выполнять различные действия с блоками расширенной памяти, а также управлять адресной линией A20. Основное различие между способом работы с расширенной памятью драйвера HIMEM.SYS и интерфейсом прерывания BIOS INT 15h заключается в том, что первый выполняет выделение программе и внутренний учёт блоков расширенной памяти, а второй рассматривает всю расширенную память как один непрерывный участок. Однако драйвер HIMEM.SYS не открывает для программ доступ к защищённому режиму. Он полностью работает в реальном режиме, а для обращения к расширенной памяти использует либо недокументированную машинную команду LOADALL (если используется процессор 80286), либо возможности процессора 80386, который позволяет адресовать расширенную память в реальном режиме (при соответствующей инициализации системных регистров и таблиц).
Используя трансляцию страниц, некоторые драйверы памяти (например, EMM386 или QEMM) могут эмулировать присутствие дополнительной памяти, используя расширенную память. При этом стандартный набор функций управления дополнительной памятью, реализованный в рамках прерывания INT 67h, дополнен еще несколькими функциями для работы в защищённом режиме процессора. Эти новые функции реализуют интерфейс виртуальной управляющей программы VCPI (Virtual Control Programm Interface). Они позволяют устанавливать защищённый и виртуальный режимы работы процессора, работать с расширенной памятью на уровне страниц и устанавливать специальные отладочные регистры процессора i80386. Интерфейс VCPI облегчает использование механизма трансляции страниц, освобождая программиста от необходимости работать с системными регистрами процессора.
Интерфейс DPMI (DOS Protected Mode Interface - интерфейс защищённого режима для DOS) реализуется модулем, называющимся сервером DPMI. Этот интерфейс доступен для тех программ, которые работают на виртуальной машине WINDOWS или OS/2 версии 2.0 (позже мы обсудим некоторые детали, связанные с использованием интерфейса DPMI в WINDOWS). Интерфейс DPMI предоставляет полный набор функций для создания однозадачных программ, работающих в защищённом режиме. В этом интерфейсе имеются функции для переключения из реального режима в защищённый и обратно, для работы с локальной таблицей дескрипторов LDT, для работы с расширенной и стандартной памятью на уровне страниц, для работы с прерываниями (в том числе для вызова прерываний реального режима из защищённого режима), для работы с отладочными регистрами процессора i80386. Это наиболее развитый интерфейс из всех рассмотренных ранее.
Последний, самый высокий уровень программной поддержки защищённого режима - расширители DOS или DOS-экстендеры (DOS-extender). Они поставляются, как правило, вместе со средствами разработки программ (трансляторами) в виде библиотек и компонуются вместе с создаваемой программой в единый загрузочный модуль. DOS-экстендеры значительно облегчают использование защищённого режима и расширенной памяти в программах, предназначенных для запуска из среды MS-DOS. Программы, составленные с использованием DOS-экстендеров, внешне очень похожи на обычные программы MS-DOS, однако они получают управление, когда процессор уже находится в защищённом режиме. К формируемому с помощью DOS-экстендера загрузочному модулю добавляются процедуры, необходимые для инициализации защищённого режима. Эти процедуры первыми получают управление и выполняют начальную инициализацию таблиц GDT, LDT, IDT, содержат обработчики прерываний и исключений, систему управления виртуальной памятью и т.д. )