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

4.5. Заборона маскуємих i немаскуємих переривань

Перед переходом в защищений режим необхiдно заборонити усi зовнiшнi апаратнi переривання - як маскуємi, так i немаскуємi.

Обробка маскуємих переривань мiкропроцесором не виконується, якщо скинуто прапор IF регiстра FLAFS/EFLAFS. Скидання прапора IF виконує команда CLI. Для заборони немаскуємих переривань необхiдно в порт 70h занести байт даних, який мiстить в старшому розрядi одиницу. Описанi вище дiї, якi забороняють зовнiшнi переривання, виконує процедура not_int модуля PROT.

4.6. Зберiгання в пам'ятi регiстрiв мiкропроцесора

Оскількi при скиданнi МП значення його регiстрiв втрачаються, то необхiдно попереду виконати запис значень сегментних регiстрiв i регiстра показчика стека в пам'ять. В програмi P_MODE це робиться за допомогою процедури save_sreg (модуль PROT) i змiнної real_sp.

4.7. Переведення мiкpопpоцесоpа в захищений режим

Для того щоб перевести МП в захищений режим, необхiдно встановити 0-й бiт регістра упpавлiння CR0 в одиницю.

Регiстр CR0 (рис. 4.8) включає 10 розрядiв для упpавлiння роботою мiкpопpоцесоpа i визначення його стану (бiти CD, NW, AM, WP i NE з'явилися в МП починаючи з i486):

PE (Protection Enable) - бiт дозволу захисту встановлюється в стан '1' для переключення МП в захищений режим. Якщо РЕ скинутий - МП працює в реальному режимi;

МР (Monitor coProcessor) - бiт управлiння співпроцесором FPU (Floating Point Unit) використовується разом з бiтом TS для генерацiї пеpеpивання 7 ('FPU недосяжний' при обробцi команди WAIT: якщо MP = 1 i TS = 1, то команда WAIT викликає пеpеpивання;

EM (Emulation) - бiт емуляцiї співпроцесора: коли вiн встановлений викликається пеpеpивання 7 при виконаннi команд FPU або пеpеpивання 6 при виконаннi команд MMX (для МП, що виконує набiр команд MMX). Значення EM не впливає на команду WAIT;

 


                         Рис. 4.8. Формат регістра управління CR0

TS (Task Swiched) - бiт переключення задач: бiт TS встановлюється при переключеннi задач. Якщо TS = 1 i виконується команда FPU або MMX (якщо MP = 1, то i команда WAIT), то викликається пеpеpивання 7;

NE (Numeric Error) - бiт упpавлiння обробкою помилок FPU:

якщо NE = 0, то встановлюється схема обробки помилок, що використовується в МП 80286 i 80386 - через зовнiшні пеpеpивання IRQ13 (пеpеpивання вiд співпроцесора). При цьому на вхiд IRQ13 контpолера пеpеpивань надходить сигнал вiд МП FERR#, що приймає активний (низький) рiвень при помилцi FPU. Вхiдний сигнал МП IGNNE# низьким рiвнем дозволяє заборонити обробку помилок FPU.

Якщо NE = 1, помилки співпроцесора обробляються як внутрiшнi пеpеpивання з номером 16;

WP (Write Protection) - бiт захисту вiд запису забороняє запис в сторiнки, призначенi тiльки для читання для всiх програм;

AM (Alignment Mask) - бiт маски вирiвнювання: при AM = 0 забороняється перевiрка невирiвнюванностi операндiв;

NW (Not Write through) - бiт заборони запису в кеш-пам'ять;

CD (Cache Disable) - бiт заборони кешування, тобто заповнення рядка кеш-пам'ятi;

PG (PaGing) - бiт дозволу стоpiнкової органiзацiї. Установка PG = 1 дозволена тiльки в захищеному режимi, тобто при PE = 1.

Занесення даних в регiстр CR0 для мiкpопpоцесоpiв починаючи з 80386, виконується спецiальною командою MOV, яка здiйснює обмiн з системними регiстрами.

В МП 80286 замiсть 32-розрядного регістра CR0 є 16-розрядний регiстр MSW (Machine Status Word). Занесення даних в MSW виконується командою LMSW. Для сумiсностi молодшi 16 розрядiв CR0 спiвпадають з MSW i запис в них може здiйснюватися також i командою LMSW.

В програмi P_MODE установка біта PE CR0 здiйснюється для МП 80286 (при cpu_type = 2) за допомогою команд SMSW i LMSW:

db 0fh,01h,0e0h                { SMSW AX }

or ax,1

db 0fh,01h,0f0h             { LMSW AX }

Для МП, починаючи з 80386, установка біта PE CR0 здiйснюється за допомогою команди MOV:

@1: db $0f,$20,0c0h { MOV EAX,CR0 }

    db 66h,0dh { OR EAX,1 }

    dd 1h db $0f,22h,0c0h                                                     { MOV CR0,EAX }