Організація роботи мiкропроцесора в захищеному режимi, страница 11

В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ї: