Вiдразу пiсля переходу МП в захищений режим необхiдно виконати програмний перехiд для очистки буфера передвиборки вiд команд, занесених туди в реальному режимi. Перехiд здiйснюється на мiтку @prot, з якої i починається робота МП в захищеному режимi: jmp @prot.
Помiтимо, що оскiльки в програмi P_MODE не вимагалося перевантажувати сегментний регiстр коду (в захищеному режимi використовувались тi ж базова адреса i розмiр сегмента i тi ж права доступу), замiсть вимагаємого для цього мiжсегментного переходу використовується короткий перехiд. Мiжсегментний перехiд використовується в програмах P_INT i P_MULTI.
Пiсля цього в сегментнi регiстри DS, SS i ES завантажуються вiдповiднi селектори:
@prot: mov ds,data_sel
mov ss,stack_sel
mov es,video_sel
На цьому переведення мiкpопpоцесоpа в захищений режим завершується.
4.8. Повернення в реальний режим
Для повернення в реальний режим в програмi P_MODE для МП 80286 (cpu_type = 2) використовується команда контpолера клавiатури яка здiйснює скидання МП:
mov al, $fe
out $64, al
Пiсля цього треба очiкувати завершення скидання мiкpопpоцесоpа:
@wait_res: hlt
jmp @wait_res
Пiсля скидання МП BIOS виконує перехiд на точку входу, адреса якої зберiгається в комipцi $40: $67, тобто на мiтку ret_r.
Для МП, починаючи з 80386, (при cpu_type>2) повернення в реальний режим виконується за допомогою команди MOV, яка здiйснює скидання біта PE регістра CR0. Перед цим необхiдно виконати наступнi дiї:
a) апаратнi пеpеpивання командою CLI;
b) передати управлiння сегмента коду з R = 1 i гpаницею FFFFh;
c) завантажити в сегментнi регiстри DS, SS, ES селектори сегмента, що заборонити має атрибути, що вiдповiдають реальному режиму: гpаниця сегмента, дорiвнює 64К-1, ED = 0 i W = 1;
d) за допомогою команди LIDT завантажити в IDTR базову адресу (0) i гpаницю (1 кбайт - 1) таблицi векторiв реального режиму;
e) очистити бiт PE регістра CR0;
f) здiйснити мiжсегментний перехiд.
З перерахованих дiй в данiй програмi вимагається виконати тiльки пункти "a", "c", i "e". Пункт "b" не вимагається виконувати, оскiльки сегмент коду, що виконується вже володiє означеними параметрами. Пункт "d" не вимагається, бо в програмi P_MODE пеpеpивання в захищеному режимi не оброблялися i таблиця векторiв (тобто IDT) i її розташування в пам'ятi не були змiненi.
Нарештi, пункт "f" не потрiбний iз-за того, що не було завантаження регістра CS при входi в захищений режим.
Для завантаження сегментних регiстрiв DS, SS i ES використовується селектор сегмента даних data_sel, що задовольняє перерахованим в пунктi "c" умовам:
mov ds,data_sel
mov es, data_sel
mov ss, data_sel
Очистка біта PE регістра CR0 виконується командою MOV:
db $0f,$20,0c0h { MOV EAX,CR0 }
db 66h,25h { AND EAX,FFFFFFFEh }
dd 0fffffffeh
db $0f,22h,0c0h { MOV CR0,EAX }
jmp ret_r
Перехiд на мiтку ret_r необхiдний для очистки буфера передвиборки команд.
Пiсля повернення в реальний режим програма виконує вiдновлення сегментних регiстрiв i регістра покажчика стека.
4.9. Вiдновлення регiстрiв МП
Вiдновлення регiстрiв МП в програмi P_MODE виконується таким чином:
ret_r: xor ax,ax { Вiдновлення регiстрiв МП пiсля }
mov ds,ax { повернення в реальний режим: }
mov ds,ds:[4*$60] { DS, }
mov ss,real_ss { SS, }
mov es,real_es { ES і }
mov sp,real_sp { SP }
4.10. Дозвiл маскуємих i немаскуємих переривань
Дозвiл маскуємих i немаскуємих переривань в програмi P_MODE здiйснюється за допомогою процедури en_int (модуль PROT). Ця процедура також виконує скидання стану управляючих клавiш клавiатури.
4.11. Приклад органiзацiї роботи МП в захищеному режимi
4.11.1. Робота програми P_MODE
Як приклад органiзацiї роботи мiкpопpоцесоpа в захищеному режимi розглянемо програму P_MODE, яка вирiшує задачу визначення ємності розширеної пам'ятi комп'ютера (адреси понад 1 Мбайта). При цьому програма виконує такi функцiї:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.