При звертанні до пам'яті мікропроцесор на етапі сегментації формує лінійна адреса операнда чи команди, а потім на етапі сторінкової організації перетворить його у фізичну адресу. Якщо сторінкова організація не використовується, те лінійна адреса буде бути фізичним.
Лінійна адреса операнда чи команди дорівнює сумі базової адреси того сегмента, де знаходяться операнд чи команда, і їхньої відносної адреси. При цьому базова адреса сегмента береться мікропроцесором саме з дескрипторного регістра, а не з дескриптора сегмента в GDT, що зажадало би звертання до пам'яті і додатковим тимчасовим витратам.
1.5. Формування дескрипторів сегментів.
Структура дескриптора таблиці GDT відповідно до формату дескриптора сегмента. Для сегмента коду байт доступу буде дорівнює:
acc_code:=present OR nosys OR exe OR read, тобто він знаходитися в пам'яті (P=1), не є системним (S=1), його можна виконувати (E=1) і його можна читати (R=1).
Формування дескрипторів таблиці GDT здійснюється за допомогою
занесення значення параметрів у відповідні полючи дескриптора, і мають наступне значення :
i - номер дескриптора сегмента в GDT;
limit - границя сегмента;
base - базова адреса сегмента;
acces - байт доступу;
d, g - біти D і G байта 6 дескриптора сегмента.
1.6. Завдання адреси і розміру GDT.
Після формування дескрипторів GDT необхідно вказати мікропроцесору місце розташування цієї таблиці в пам'яті і її розмір.
Це робиться за допомогою регістра GDTR, що містить 32-розрядний базова адреса таблиці і її 16-розрядну границю.
Для формування даних регістра GDTR і його завантаження використовується базова адреса і розмір перемінної gdt і за допомогою команди LGDT завантажує ці значення в регістр GDTR.
1.7. Підготовка до скидання мікропроцесора.
Для МП 80286 повернення в реальний режим із захищеного здійснюється тільки шляхом скидання мікропроцесора, ініційованого командою контролера клавіатури.
Для МП наступних моделей можливі два варіанти повернення в реальний режим: за допомогою команди MOV чи також через скидання МП. У випадку повернення через скидання мікропроцесора необхідно в реальному режимі підготувати структури даних для здійснення повернення в задану крапку програми після скидання МП.
Після виконання скидання процесор переходить у реальний режим і керування передається BIOS. BIOS аналізує вміст осередку CMOS-пам'яті з адресою 0Fh - байта стану відключення. Подальші дії визначаються вмістом цього осередку.
Значення байта стану відключення
Таблиця 3.
Значення | Причина відключення |
0123456,7,890Ah | Програмне скидання при натисканні комбінації клавішCTRL-ALT-DEL чи несподіване скидання. Виконується звичайний перезапуск системи, але процедури тестування, що працюють при включенні харчування, не виконуються.Скидання після визначення обсягу пам'яті.Скидання після тестування пам'яті.Скидання після виявлення помилки в пам'яті (контрольпарності).Скидання з запитом перезавантаження.Після скидання перезавантажується контролер переривань,потім керування передається за адресою, що знаходиться в області даних BIOS 0040h:0067h.Скидання після виконання тесту роботи процесора взахищеному режимі.Скидання після виконання пересилання блоку пам'яті зосновної пам'яті в розширену.Після скидання керування негайно передається поадресі в 0040h:0067h області даних BIOS. |
Якщо в захищеному режимі не використовуються переривання і, відповідно, не перепрограмується контролер переривань, є зміст застосувати значення 0Ah. При цьому послу скидання МП керування буде відразу передано за адресою, узятому з області даних BIOS 0040h:0067h. У цьому випадку час, витрачений на повернення в реальний режим, буде менше.
Для запису байта даних в осередок CMOS-пам'яті необхідно спочатку в порт з адресою 70h записати номер потрібного осередку, а потім у порт 71h - занести дані.
1.8. Заборона маскуємих і немаскуємих переривань.
Перед переходом у захищений режим необхідно заборонити всі зовнішні апаратні як маскуємі, так і немаскуємі. Обробка маскуємих переривань мікропроцесором не виконується, якщо скинутий прапор IF регістра FLAFS/EFLAFS. Скидання прапора IF виконує команда CLI. Для заборони немаскуємих переривань необхідно в порт 70h занести байт даних, що містить у старшому розряді одиницю.
1.9. Збереження в пам'яті регістрів мікропроцесора.
Оскільки при скиданні МП значення його регістрів губляться, те необхідно попередньо здійснити запис значень сегментних регістрів і регістра покажчика стека в пам'ять.
1.10. Переклад мікропроцесора в захищений режим.
Для того щоб перевести МП у захищений режим, необхідно установити 0-й біт регістра керування CR0 (Control Register) в одиницю.
Регістр CR0 включає 10 розрядів для керування роботою мікропроцесора і визначення його стану (біти CD, NW, AM, WP і NE з'явилися в МП починаючи з i486):
PE (Protection Enable) - біт дозволу захисту встановлюється в “1” для переключення МП у захищений режим. Якщо РЕ скинутий - МП працює в реальному режимі; МР (Monitor coProcessor) - біт керування співпроцесором - блоком FPU (Floating Point Unit) використовується разом з битому TS для генерації переривання 7 (“FPU недоступний”) при обробці команди WAIT : якщо MP=1 і TS=1, то команда WAIT викликає переривання;
EM (Emulation) - біт емуляції співпроцесора: коли він установлений викликається переривання 7 при виконанні команд FPU чи переривання 6 при виконанні команд MMX (для МП, що виконує набір команд MMX). Значення EM не впливає на команду WAIT;
TS (Task Swiched) - біт переключення задач: біт TS установлюється при переключенні задач. Якщо TS=1 і виконується команда FPU чи MMX (якщо MP=1, то і команда WAIT), те викликається переривання 7;
NE (Numeric Error) - біт керування обробкою помилок FPU : якщо NE=0, то встановлюється схема обробки помилок, використовувана в МП 80286 і 80386 - через зовнішнє переривання IRQ 13 (переривання від співпроцесора). При цьому на вхід IRQ 13 контролера переривань надходить сигнал FERR# від МП, що приймає активний (низький) рівень при помилці FPU. Вхідний сигнал МП IGNNE# низьким рівнем дозволяє заборонити обробку помилок FPU. Якщо NE=1, помилки співпроцесора обробляються як внутрішні переривання з номером 16;
WP (Write Protection) - біт захисту від запису забороняє запис у сторінки, потрібні тільки для читання для всіх програм;
AM (Alignment Mask) - біт маски вирівнювання: при AM=0 забороняється перевірка невирівняності операндів;
NW (Not Write through) - біт заборони запису в кеш-пам'ять;
CD (Cache Disable) - біт заборони кэшировання, тобто заповнення рядка кеш-пам'яті;
PG (PaGing) - біт дозволу сторінкової організації. Установка PG=1 дозволена тільки в захищеному режимі, тобто при PE=1.
Занесення даних у регістр CR0 для мікропроцесорів починаючи с 80386 виконується спеціальною командою MOV, що здійснює промін із системними регістрами.
У МП 80286 замість 32-розрядного регістра CR0 мається 16-розрядний регістр MSW (Machine Status Word). Занесення даних у MSW виконується командою LMSW. Для сумісності молодші 16 розрядів CR0 збігаються з MSW і запис у них може здійснюватися також і командою LMSW.Установка біта PE здійснюється для мікропроцесора 80286 за допомогою команди LMSW, що заносить значення перемінної msw у регістр MSW: db 0fh,01h,36h { LMSW }
dw msw
jmp @prot
Для МП починаючи з 80386 установка біта PE CR0 без зміни інших розрядів регістра керування здійснюється за допомогою команди MOV:
db $0f,$20,0c0h { MOV EAX,CR0 }
db 66h,0dh { OR EAX,1 }
dd 1h
db $0f,22h,0c0h { MOV CR0,EAX }
jmp @prot
Відразу після переходу МП у захищений режим необхідно виконати програмний перехід для очищення буфера предвиборки від команд, занесених туди в реальному режимі. Перехід здійснюється на мітку @prot, з яким і починається робота МП у захищеному режимі. Помітимо, що оскільки в програмі P_MODE не було потрібно перевантажувати сегментний регістр коду (у захищеному режимі використовувалися ті ж базова адреса і розмір сегмента і того ж права доступу), те використовується внутрісегментний перехід і завантаження регістра
CS не відбувається. Потім у сегментні регістри DS, SS і ES завантажуються відповідні селектори:
@prot:mov ax,data_sel
mov ds,ax
mov ax,stack_sel
mov ss,ax
mov ax,video_sel
mov es,ax
На цьому переклад мікропроцесора в захищений режим завершується.
1.11. Повернення в реальний режим.
Для повернення в реальний режим для МП 80286 використовується процедура RESET , що встановлює ознаку виконання скидання мікропроцесора (res=1), за допомогою команди контролера клавіатури здійснює скидання МП : mov al,$fe
out $64,al
і очікує завершення скидання мікропроцесора:
@wait_res:
hlt
jmp @wait_res.
Після скидання МП BIOS виконує перехід на крапку входу, адреса яке зберігається в осередку $40:$67. Для МП починаючи з 80386 повернення в реальний режим виконується за допомогою команди MOV, що здійснює скидання біта PE регістра CR0. Перед цим необхідно виконати наступні дії :
а) заборонити апаратні переривання командою CLI;
б) передати керування сегменту коду з R=1 і FFFFh;
в) завантажити в сегментні регістри DS, SS, ES селектори сегмента, що має атрибути, відповідні реальному режиму: границю сегмента, рівну 64ДО-1, ED=0 і W=1;
г) за допомогою команди LIDT завантажити в IDTR базова адреса (0) і границю (1Кб - 1) таблиці векторів реального режиму;
д) очистити біт PE регістра CR0;
е) здійснити межсегментний перехід.
З перерахованих вище дій у даній програмі потрібно виконати тільки пункти а), в), і д). Пункт б) не потрібно виконувати оскільки сегмент виконуваного коду уже володіє зазначенними параметрами. Пункт г) не потрібно, тому що в захищеному режимі не оброблялися і таблиця векторів (тобто IDT) і її розташування в пам'яті не були змінені.
Нарешті, пункт е) не потрібний через те, що не було завантаження регістра CS при вході в захищений режим.
Для завантаження сегментних регістрів DS, SS і ES використовується
селектор сегмента даних data_sel, що задовольняє перерахованим у пункті в) умовам : mov ax,data_sel
mov es,ax
mov ds,ax
mov ss,ax.
Очищення біта PE регістра CR0 виконуються командою MOV: