Смекни!
smekni.com

Програма модифікуюча команди, які використовуються в захищеному режимі (стр. 3 из 5)

При звертанні до пам'яті мікропроцесор на етапі сегментації формує лінійна адреса операнда чи команди, а потім на етапі сторінкової організації перетворить його у фізичну адресу. Якщо сторінкова організація не використовується, те лінійна адреса буде бути фізичним.

Лінійна адреса операнда чи команди дорівнює сумі базової адреси того сегмента, де знаходяться операнд чи команда, і їхньої відносної адреси. При цьому базова адреса сегмента береться мікропроцесором саме з дескрипторного регістра, а не з дескриптора сегмента в 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: