
- •Лабораторна робота n7
- •Зміст роботи.
- •Довідкові дані.
- •Суть захищеного режиму
- •Захист від взаємного впливу програм.
- •Елементи організації захищеного режиму
- •Елементи системи привілеїв
- •Переривання в захищеному режимі.
- •Етап 1. Переключення в захищений режим та повернення в режим реальних адрес.
- •Перевірка поточного режиму процесора
- •Підготовка системних структур даних для роботи в захищеному режимі
- •Переключення процесора в захищений режим
- •Виведення повідомлення на екран
- •Послідовність дій для переводу процесора в режим реальних адрес.
- •Переформувати дескриптори сегментів даних і стека згідно вимог:
- •Завантажити селектори обновлених дескрипторів
- •Переключення в режим реальних адрес, вихід в dos, (припускаємо, що логічний сегмент нашої програми - code)
- •Int 21h ; чекать введення з клавіатури
- •Int 10h ; переключить відеоконтролер
- •Етап 2. Підготовка системних структур даних для забезпечення функціонування механізму переривань
- •Формування процедур обробки переривань
- •Розміщення та формування дескриптора сегмента Int_code в gdt.
- •Формування таблиці векторів переривань (idt)
- •Формування та запис вказівника таблиці векторів переривань.
- •Відновлення стандартної таблиці переривань при переключенні в реальний режим
- •Завдання на лабораторну роботу
- •Ускладнені завдання.
- •Питання для перевірки.
Переключення процесора в захищений режим
Перед переключенням у захищений режим потрібно заборонити переривання, а також зберегти логічну адресу вершини стека реального режиму, наприклад, в сегменті даних:
Top_real_mode dd ?
Переключення у захищений режим виконується установкою в 1 молодшого біта регістра управління CR0:
Cli
Mov word ptr Top_real_mode,sp
Mov word ptr Top_real_mode+2,ss
mov eax,cr0
or al,1
mov cr0,eax
Після переходу в захищений режим необхідно в сегментні регістри завантажити селектори. Завантаження селектора в регістр CS може відбутися тільки з допомогою між сегментної команди переходу. В захищеному режимі сегментна складова логічної адреси є селектором сегмента і транслятором TASM не генерується. Тому команда між сегментної передачі управління формується "вручну" по-байтно:
db 0eah ;машинний код команди jmp
dw offset protect ;зміщення мітки переходу в сегменті кодів
dw offset deskr_cs ;селектор сегмента кодів
protect:
;завантажити селектори для інших дескрипторів
; припускаємо, що RPL=0
mov ax,offset deskr_ss
mov ss,ax
mov sp,Top_stp
mov ax,offset deskr_ds
mov ds,ax
mov ax,offset deskr_es
mov es,ax
Виведення повідомлення на екран
В захищеному режимі шляхом прямого запису в сторінку відео буфера вивести коротке повідомлення. Приклад виведення повідомлення mess довжиною 20 байт:
mov cx,20
mov si,offset mess
mov di,1640 ;початкова адреса виведення
mov ah,07h ;атрибут символів
outmes:
mov al,[si]
mov es:[di],ax
inc si
add di,2
loop outmes
Послідовність дій для переводу процесора в режим реальних адрес.
Переформувати дескриптори сегментів даних і стека згідно вимог:
розмір - 0ffffh
атрибути - дані, не стек(і для стека!),дозволити запис
Наприклад:
return_dos:
assume ds:GDT;
cli
mov ax, offset deskr_GDT
; в режимі реальних адрес в цьому випадку виконували команду mov ax,GDT
mov ds,ax
mov deskr_cs.limit_1,0ffffh
mov deskr_ds.limit_1,0ffffh
mov deskr_ss. attrib, data_seg
і т. д.
ЗАУВАЖЕННЯ. Атрибути сегмента кодів не чіпати.
Завантажити селектори обновлених дескрипторів
; пере завантаження тіньових регістрів
mov ax,offset deskr_ds
mov ds,ax
mov ax,offset deskr_es
mov es,ax
mov ax,offset deskr_ss
mov ss,ax
db 0eah
dw offset jumpt
dw offset deskr_cs ; TASM не забезпечує
jumpt:
Переключення в режим реальних адрес, вихід в dos, (припускаємо, що логічний сегмент нашої програми - code)
; переключення в режим реальних адрес
mov eax,cr0
and al,0feh
mov cr0,eax
db 0eah
dw offset r_mode
dw CODE
r_mode:
assume ds:_DATA
mov ax,_data
mov ds,ax
lss sp,Top_real_mode
sti
mov ah,01h