6. ІЄРАРХІЯ ЗАСОБІВ ДЛЯ РОБОТИ У ЗАХИЩЕНОМУ РЕЖИМІ
Ви вже, напевно, звернули увагу на те, що програмування для захищеного режиму значно складніше, ніж для реального, і потребує врахування великої кількості важливих деталей. Навіть для того, щоб просто перевести процесор i80286 у захищений режим, потрібно провести ґрунтовну підготовчу роботу. Процесори i80386 та i80486 значно складніші, ніж i80286. Використання всіх можливостей цих процесорів доступне лише висококваліфікованим системним програмістам і вимагає детального ознайомлення з посібниками з процесорів, які постачаються фірмою Intel.
На щастя існує програмне забезпечення, що полегшує процес створення програм для захищеного режиму. Це програмне забезпечення виступає як інтерфейс між програмою користувача та деякою керуючою програмою (наприклад, мультизадачною операційною системою захищеного режиму).
Ми розглянемо засоби, доступні програмістам серед MS-DOS версії 5.0 і MS WINDOWS версій 3.0 і 3.1.
Існує кілька рівнів програмної підтримки захищеного режиму та підтримки роботи з розширеною пам'яттю:
- інтерфейс BIOS;
- інтерфейс драйвера HIMEM.SYS;
- інтерфейс EMS/VCPI;
- інтерфейс DPMI;
- розширювачі DOS (DOS-екстендери).
Інтерфейсом найнижчого рівня є інтерфейс BIOS, який надається програмам у вигляді кількох функцій переривання BIOS INT 15h. Інтерфейс BIOS дозволяє програмі перевести процесор з реального режиму в захищений, переслати блок пам'яті зі стандартної пам'яті до розширеної або розширеної до стандартної. Цим усі його можливості й обмежуються. Інтерфейс BIOS використовується для старту мультизадачних операційних систем захищеного режиму (таких як OS/2) або в старих програмах,працюючих із розширеною пам'яттю в захищеному режимі (наприклад, СУБД ORACLE версії 5.1).
У додатку ми описали дії, які виконує команда LOADALL. Ви переконаєтесь, що команда повністю виправдовує свою назву! (Load All – завантажити все).
Наступний рівень – інтерфейс EMS/VCPI. У другій частині другого тому "Бібліотеки системного програміста", розділ 11, ми докладно розглядали інтерфейс EMS, який використовується для роботи з додатковою пам'яттю. Там же пояснюються відмінності між розширеною та додатковою пам'яттю. Використовуючи трансляцію сторінок, деякі драйвери пам'яті (наприклад, 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, містять обробники переривань та винятків, систему управління віртуальною пам'яттю тощо.
Приклад DOS-екстендера, що постачається разом із транслятором – 386-DOS/Extender фірми Phar Lap.
Цей інтерфейс реалізується в рамках переривання BIOS INT 15h на комп'ютерах моделей IBM AT на основі процесорів i80286, i80386 або i80486.
Визначити розмір розширеної пам'яті
Ця функціяпризначена для визначення розміру розширеної пам'яті, доступної для використання переривання функціями INT 15h.
Зверніть увагу, що якщо в системі встановлено драйвер HIMEM.SYS, функція 88h може повернути нульовий розмір доступної розширеної пам'яті. Деякі програми (наприклад, СУБД Oracle версії 5.1) можуть виявитися несумісними з драйвером HIMEM.SYS, оскільки вони працюють із розширеною пам'яттю засобами переривання INT 15h. Аналогічні проблеми можуть виникнути і під час використання інших драйверів розширеної пам'яті, наприклад, QEMM.
Як правило, драйвери розширеної пам'яті дозволяють зарезервувати частину розширеної пам'яті програм, що використовують інтерфейс INT 15h. Для цього необхідно вказати відповідні параметри. Наприклад, для драйвера HIMEM.SYS розмір зарезервованої розширеної пам'яті можна вказати так:
У цьому рядку "xxxx" – розмір зарезервованої пам'яті в кілобайтах.
Переслати блок розширеної пам'яті
У третьому та четвертому дескрипторі необхідно заповнити поля межі для копіюваного блоку пам'яті (у них має бути записано значення CX*2 - 1), та поле доступу (значення 93):
Таблиця 6. GDT для пересилання блоку пам'яті засобами BIOS.