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 }
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.