Міністерство освіти І науки україни національний технічний університет "харківсьий політехнічний інститут" кафедра обчислювальної техніки та програмування ізюмський нкц
Вид материала | Документы |
- Міністерство освіти та науки україни національний технічний університет "Харківський, 375.28kb.
- Міністерство освіти І науки, молоді та спорту україни національний технічний університет, 614.83kb.
- Міністерство освіти І науки України Національний технічний університет України, 151.32kb.
- Міністерство освіти І науки україни національний технічний університет «харківський, 571.91kb.
- Навчально-науковий комплекс «Інститут прикладного системного аналізу» Національний, 91.04kb.
- Навчально-науковий комплекс «Інститут прикладного системного аналізу» Національний, 47.34kb.
- Міністерство освіти І науки україни національний технічний університет україни „київський, 508.45kb.
- Програма конференції передбачає: пленарні доповіді провідних науковців та представників, 93.09kb.
- Доповідь/Технічні науки інформатика, обчислювальна техніка та автоматизація, 61.47kb.
- Національний технічний університет україни "київський політехнічний інститут" фізико, 288.71kb.
2.7 Завдання адреси i розмiру IDT
Пiсля формування дескрипторів шлюзiв IDT необхiдно вказати мiкpопpоцесоpу мiсцеположення цiєї таблицi в пам'ятi та її розмiр.
Це робиться за допомогою регістра IDTR, що мiстить 32-pозpядну базову адресу таблицi та її 16-розрядну гpаницю. Структура IDTR подана на рис. 5.3.
Змiст регістра IDTR має такий же формат (тип даних), що i регістра GDTR (див. роздiл 3) i описується змiнною idtr типу t_dtr.
Рис. 2.9 Структура регістра IDTR
В програмi P_INT формування даних регістра IDTR для роботи в захищеному режимі та його завантаження здійснюються процедурою init_idtr_p (модуль PROT).
Крім цього за допомогою процедури init_idtr_r (модуль PROT) здійснюється формування в змінній idtr_r атрибутів таблиці IDT для роботи в реальному режимі.
2.8 Перепрограмування контролера переривань
Оскільки фірма Intel зарезервувала 32 молодших номери переривань для виключень, то для роботи в захищеному режимі потрібно змінити номери переривань від зовнішніх пристроїв, які попадають в діапазон 0-31. Наприклад, номер переривання від системного таймера, який дорівнює в реальному режимі 8, повинен бути змінений, так як він збігається з номером виключення "Подвійна помилка".
Номери переривань від зовнішніх пристроїв в комп'ютері задаються за допомогою двох програмуємих контролерів переривань (ПКП). Перший ПКП запрограмований BIOS на номери переривань від 8 до 15. Другий ПКП - на номери від 75h до 7Fh. Хоч номери переривань 2-го контролера переривань не попадають в діапазон 0-31, в програмі P_INT він також програмується з метою зменьшення розміру таблиці IDT. Перепрограмування 1- і 2-го ПКП здійснюється за допомогою процедури модуля PROT
pic(mode:byte),
яка в залежності від значення параметра mode, що вказує режим роботи МП (mode = 0: реальний: mode = 1: захищений), задає такі номери переривань:
для першого ПКП - 8 (mode = 0) і 20h (mode = 1);
для другого ПКП - 75h (mode = 0) і 28h (mode = 1).
Нагадаємо, що номери переривань задаються для входу IRQ0 ПКП. Для входу IRQ1 номер переривання становить на 1 більше і т.д.
2.10 Дiї мiкpопpоцесоpа при обробцi пеpеpивань
Якщо запит пеpеpивання/виключення прийнятий на обслуговування, то мiкpопpоцесоpом виконуються наступнi дiї:
змiст регістра EFLAGS i поточне значення адреси команди (CS i EIP) зберiгається в стеку;
для деяких виключень додатково в стек заноситься 32-pозpядний код помилки (що уточняє причину помилки);
визначається 8-байтний номер пеpеpивання, що задає номеp дескриптора шлюзу в таблицi IDT;
викликається вказана в дескрипторi процедура, що повинна закiнчуватися командою IRET.
При виконаннi команди IRET iз стеку беруться значення EIP, CS i EFLAGS та завантажуються у вiдповiднi регiстри, при цьому МП повертається до виконання перерваної програми.
Номер пеpеpивання мiкpопpоцесоp визначає по-рiзному в залежностi вiд типу пеpеpивання:
при зовнiшнiх маскуємих пеpеpиваннях номер пеpеpивання передає пpогpамуємий контролер пеpеpивань;
при зовнiшнiх немаскуємих пеpеpиваннях номер пеpеpивання рiвн 2;
при програмних пеpеpиваннях номер пеpеpивання задається в командi;
при виключеннях номер пеpеpивання виробляється внутрiшнiми схемами МП.
Вiдзначимо, що бiльшiсть виключень (виключення типу вiдмова) зберiгають в стеку адресу команди, що її визвала (0, 5-7, 10-17, 2). В результатi є можливiсть повторного запуску програми пiсля того, як процедура обробки пеpеpивання усуне причину пеpеpивання.
Виключення 1, 3-4 зберiгають в стеку адресу наступної команди.
2.11 Формат коду помилки
При обслуговуваннi ряду виключень (8, 10-14, 17) мiкpопpоцесоp формує код помилки, що заноситься в стек i може аналiзуватися процедурою обробки пеpеpивання.
Типовий формат 32-розрядного коду помилки (рис. 5.4, а) мiстить такі поля:
Рис. 1.10 Формат помилки:
а) для виключень (8, 10-13);
б) для виключення 14
iндекс селектора (бiти 15-3) вказує на дескриптор сегмента, звернення до якого викликало виключення;
бiт iндикацiї таблиць TI (бiт 2) при I = 0 вказує таблицю, у разi звертання до якої виникло виключення: при TI = 0 – звернення до GDT, при TI = 1 - звернення до LDT;
бiт пеpеpивання I (бiт 1) встановлюється в стан I = 1, якщо iндекс селектора в кодi помилки посилається на IDT, тобто виключення виникло при виконаннi процедури обробки пеpеpивання;
бiт зовнiшньої подiї EXT (біт 0) приймає значення EXT = 1, якщо пеpеpивання викликане не програмою, що виконується, а зовнiшньою подiєю.
При виключеннях типу 8 або 17 всi поля коду помилки обнуляються.
Для виключення типу 14 код помилки має iнший формат (рис. 5.4,б):
бiт помилки користувача/супервiзора U/S (бiт 2) вказує, що виключення виникло при виконаннi системної програми (U/S = 0), або пpогpами користувача (U/S = 1);
бiт помилки читання/запису W/R (бiт 1) вказує на виникнення виключення iз-за порушення заборони читання (W/R = 0) або запису
(W/R = 1) сторiнки;
бiт присутностi сторiнки P (бiт 0) вказує, що виключення викликане зверненням до вiдсутньої сторiнки (P = 0) або iз-за порушення захисту сторiнки (P = 1).
Всi iншi розряди коду помилки мають невизначене значення.
2.12 Перевірка коректності повернення з захищеного режиму
При поверненні з захищеного режиму за допомогою команди MOV у деяких мікропроцесорів типів 80386 і i486 спостерігається зберігання заборони запису в сегмент коду. Для програм, які здійснюють модифікацію коду в реальному режимі це викликає виключення 13. Для запобігання цього після повернення в реальний режим виконується перевірка запису в сегмент коду за допомогою процедури test_wr модуля PROT. При виникненні при цьому виключення 13 обробник цього виключення здійснює скидання мікропроцесора.
2.13 Розмаскування контролерів переривань
Оскільки обробка виключень вимагає перепрограммування контролерів переривань, то параметр процедури save_ret_real в програмі P_INT має значення байта відключения, яке дорівнює 5, а не $A. В цьому випадку програма BIOS виконує не тільки перехід на вказану точку програми ret_r, а і здійснює ініціалізацію 1-го і 2-го ПКП. В результаті вони виявляються замаскованими. Розмаскування контролерів переривань виконується командами
port[$21]:=0;
port[$a1]:=0;
3.Опис логічної структури
3.1 Алгоритм програми KP_MPS_1.pas
Для органiзацiї роботи мiкpопpоцесоpа в захищеному режимi необхiдно виконати такi дiї:
- визначити тип встановленого в персональному комп'ютерi мiкpопpоцесоpа;
- сформувати в пам'ятi глобальну дескpиптоpну таблицю, що мiстить дескpиптоpи всiх сегментiв пам'ятi, якi використовуються в програмі;
- задати базову адресу i розмiр глобальної дескpиптоpної таблицi;
- формувати данi для повернення в реальний режим;
- заборонити маскуємi та немаскуємi переривання;
- зберегти в пам'ятi вмiст регiстрiв МП;
- перевести мiкропроцесор в захищений режим;
- виконати в захищеному режимi заданi дiї;
- повернутися в реальний режим;
- вiдновити вмiст регiстрiв МП;
- дозволити маскуємi та немаскуємi переривання.
3.2 Алгоритм програми KP_MPS_2.pas
Для виконання завдання необхідно виконати наступні дії:
- розробити дескриптори усіх необхідних сегментів пам’яті і сформувати з них глобальну дескрипторну таблицю GDT.
- за допомогою регістра GDTR задати базову адресу і розмір таблиці GDT;
- розробити дескриптори усіх шлюзів, сформувати з них таблицю IDT.
- за допомогою регістра IDTR задати базову адресу і розмір таблиці IDT;
- сформувати дані для повернення в реальний режим;
- зберегти в пам'яті вміст регістрів МП;
- заборонити маскуємі і немаскуємі переривання;
- перевести мікропроцесор у захищений режим;
- виконати в захищеному режимі дії, задані індивідуальним завданням;
- повернутися в реальний режим;
- відновити вміст регістрів МП;
- дозволити маскуемі і немаскуемі переривання.
Висновки
Розроблено програму, що реалізує можливість роботи з мікропроцесором у захищеному режимі. Були розглянуті особливості обробки виключень та апаратних переривань у захищеному режимi. Розроблено виключення знакового переповнення та обробник переривання від клавіатури, який визначав би натискання клавіши ENTER.
Література
1.Лео Скенлон „Персональные ЭВМ IBM PC иXT.Программирование на языке ассемблера. ”.М 1989,337с
2.Питер Абель „Ассемблер и программирование для IBM PC”
3.В.И.Юров “Ассемблер”
4.Кулаков „Программирование”
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
"ХАРКІВСЬИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ"
КАФЕДРА ОБЧИСЛЮВАЛЬНОЇ ТЕХНІКИ ТА ПРОГРАМУВАННЯ
ІЗЮМСЬКИЙ НКЦ
ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /Домнін Ф.А./
"___" __________ 2005р.
РОБОТА МІКРОПРОЦЕСОРА В ЗАХИЩЕНОМУ РЕЖИМI
Текст програми
ЛИСТ ЗАТВЕРДЖЕННЯ
КІТЗІ-22.22754-12 00-01-ЛЗ
| Виконав студент групи КІТЗІ-22 _______/Сватовський В.М./ "___" __________ 2005 р. Перевірив __________ /Гугнін В.М../ "___" __________ 2005 р. |
Ізюм 2005
ЗАТВЕРДЖЕНО
КІТЗІ-22.22754-12 00-01-ЛЗ
РОБОТА МІКРОПРОЦЕСОРА В ЗАХИЩЕНОМУ РЕЖИМI
Текст програми
Лист затвердження
КІТЗІ-22.22754-12 00-01-ЛЗ
Ізюм 2005
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
"ХАРКІВСЬИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ"
КАФЕДРА ОБЧИСЛЮВАЛЬНОЇ ТЕХНІКИ ТА ПРОГРАМУВАННЯ
ІЗЮМСЬКИЙ НКЦ
ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /Домнін Ф.А./
"___" __________ 2005р.
РОБОТА МІКРОПРОЦЕСОРА В ЗАХИЩЕНОМУ РЕЖИМI
Текст програми
ЛИСТ ЗАТВЕРДЖЕННЯ
КІТЗІ-22.22754-12 00-01-ЛЗ
| Виконав студент групи КІТЗІ-22 _______/Сватовський В.М./ "___" __________ 2005 р. Перевірив __________ /Гугнін В.М../ "___" __________ 2005 р. |
Ізюм 2005
ЗАТВЕРДЖЕНО
КІТЗІ-22.22754-12 00-01-ЛЗ
РОБОТА МІКРОПРОЦЕСОРА В ЗАХИЩЕНОМУ РЕЖИМI
Текст програми
Лист затвердження
КІТЗІ-22.22754-12 00-01
Ізюм 2005
2. Текст програми
2.1
program KP_MPS_1;
uses crt;
const str1:string='############################';
str2:string='##';
Selector_CodeSeg :word =$08;
Selector_DataSeg :word =$10;
Selector_StackSeg :word =$18;
Selector_VideoMem :word =$20;
type
tGDT=record
Limit_Lo :word;
Base_Lo :word;
Base_Hi :byte;
Acces :byte;
Limit_Hi:byte;
Base_Hi2:byte;
end;
tGDTR=record
Limit :word;
Base :longint;
end;
var
count:integer;
GDT:array[0..5] of tGDT;
LDT:array[0..15] of tGDT;
p:byte;
k:byte;
GDTR:tGDTR;
Old_DS:word;
Old_SS:word;
Old_ES:word;
Old_SP:word;
function hex(b:byte):string;
const xlat:string='0123456789ABCDEF';
begin
hex:=xlat[(b shr 4)+1]+xlat[(b and $0F)+1];
end;
function Linaradress(segment,offset:longint):longint;
begin
Linaradress:=segment shl 4 + offset;
end;
procedure GDTInit(i:byte;limit,base:longint;a,d,g:byte);
{ номер дескриптора,граница сегмента,базовый адрес сегмента,
байт доступа,признак разрядности,
размерность граница 0 - байты,$80 - 4х килобайтные страницы }
begin
if limit > $FFFFF then begin
limit:=limit shr 12;
g:=$80;
end else g:=0;
with GDT[i] do begin GDT[i].Limit_Lo :=limit;
GDT[i].Base_Lo :єse;
GDT[i].Base_Hi :єse shr 16;
GDT[i].Acces :=a;
GDT[i].Limit_Hi :=limit shr 16 or g or d;
GDT[i].Base_Hi2 :єse shr 24;
end
end;
procedure GDTRInit;
begin
GDTR.Limit:=sizeof(GDT)-1;
GDTR.Base:=Linaradress(seg(GDT),ofs(GDT));
asm
db 0fh,01h,16h
dw gdtr
end
end;
procedure LDTInit(i:byte;limit,base:longint;a,d,g:byte);
{ номер дескриптора,граница сегмента,базовый адрес сегмента,
байт доступа,признак разрядности,
размерность граница(d) 0 - байты $80 - 4х килобайтные страницы }
begin
if limit > $FFFFF then begin
limit:=limit shr 12;
g:=$80;
end else g:=0;
with LDT[i] do begin
LDT[i].Limit_Lo :=limit;
LDT[i].Base_Lo :єse;
LDT[i].Base_Hi :єse shr 16;
LDT[i].Acces :=a;
LDT[i].Limit_Hi :=limit shr 16 or g or d;
LDT[i].Base_Hi2 :єse shr 24;
end
end;
begin
clrscr;
LDTInit(0,0,0,0,0,0);
{Сегмент кода - объем 2К с запретом чтения}
LDTInit(1,2*1024-1,linaradress(Cseg,0),$F8,0,0);
{сегмент стека - стека 33K }
LDTInit(2,33*1024-1,linaradress(Sseg,0),$F6,0,0);
{сегмент - объем 6К, }
LDTInit(3,6*1024-1,linaradress(Dseg,0),$F8,0,0);
{сегмент данных - объем 500K базовый адрес 1Gb}
LDTInit(3,500*1024-1,1*1024*1024*1024,$F2,0,0);
{ Нуль-дескриптор: }
GDTInit(0,0,0,0,0,0);
{ Дескриптор сегмента кода: }
GDTInit(1,$ffff,linaradress(cseg,0),($80 or $10 or $08 or $02),0,0);
{ Дескриптор сегмента данных: }
GDTInit(2,$ffff,linaradress(dseg,0),($80 or $10 or $02),0,0);
{ Дескриптор сегмента стека: }
GDTInit(3,0,linaradress(sseg,0),($80 or $10 or $02 or $04),0,0);
{ Дескриптор сегмента видеопамяти: }
GDTInit(4,$ffff,linaradress($b800,0),($80 or $10 or $02),0,0);
{ Дескриптор таблицы LDT}
GDTInit(5,sizeof(ldt)-1,linaradress(Seg(ldt),Ofs(ldt)),$80,0,0);
Writeln;Writeln;
Writeln('Формат GDT');
for count := 0 to 5 do
begin
p:=@GDT[count];
for k:=1 to 8 do
begin
write (hex(p),' '); inc (p);
end;
writeln;
end;
Writeln('Формат LDT');
for count := 0 to 3 do
begin
p:=@LDT[count];
for k:=1 to 8 do
begin
write (hex(p),' '); inc (p);
end;
writeln;
end;
GDTRInit;
asm cli end;
port[$70]:=$80;
Old_DS:=Dseg;
Old_SS:=Sseg;
asm mov Old_ES,ES end;
asm
db 0fh,20h,0c0h
db 66h,0dh
dd 1h
db 0fh,22h,0c0h
end;
asm
jmp @clearbuf
@clearbuf:
mov ds,Selector_DataSeg
mov es,Selector_VideoMem
mov ss,Selector_StackSeg
mov ax,2
mov bx,35
xor cx,cx
mov cl, [offset str1]
mov si,offset str1+1
mov dl,80
mul dl
add ax,bx
shl ax,1
mov di,ax
mov ah,04h
@m1:lodsb
stosw
loop @m1
mov cl,20
mov bx,35
@m2:mov ax,2
add ax,cx
mov dh,cl
xor cx,cx
mov cl, [offset str2]
mov si,offset str2+1
mov dl,80
mul dl
add ax,bx
shl ax,1
mov di,ax
mov ah,04h
@m3:lodsb
stosw
loop @m3
xor ax,ax
mov cl,dh
loop @m2
mov ax,11
mov bx,35
xor cx,cx
mov cl, [offset str1]
mov si,offset str1+1
mov dl,80
mul dl
add ax,bx
shl ax,1
mov di,ax
mov ah,04h
@m4:lodsb
stosw
loop @m4
mov ax,22
mov bx,35
xor cx,cx
mov cl, [offset str1]
mov si,offset str1+1
mov dl,80
mul dl
add ax,bx
shl ax,1
mov di,ax
mov ah,04h
@m5:lodsb
stosw
loop @m5
mov ds,Selector_DataSeg
mov ss,Selector_DataSeg
mov es,Selector_DataSeg
db 0fh,20h,0c0h
db 66h,25h
dd 0fffffffeh
db 0fh,22h,0c0h
jmp @clearbuf2
@clearbuf2:
mov ds,Old_DS
mov ss,Old_SS
mov es,Old_ES
mov sp,Old_SP
end;
asm sti end;
port[$70]:=$d;
end.
2.2
program KP_MPS_2; { Обработка прерываний в защищенном режиме }
uses CRT_, prot; { Модуль PROT содержит константы, }
{ типы переменных, переменные, процедуры и функции }
{ для работы в защищенном режиме }
label ret_r; { Точка возврата в реальный режим }
const
s:string='Обработка прерываний в защищенном режиме';
s1:string='Была нажата клавиша ENTER (для продолжения нажать ESC)';
s2:string='Была произведена обработка прерывания 4';
var
cs_real, { Значение регистра CS в реальном режиме }
err:word; { Код ошибки }
scan,i,al_,ah_:byte;
{----------Разработка процедур для вызова исключений----------}
procedure occur_0N;assembler; { Выработка исключения N }
asm
mov ax,1
mov bx,07fffh
add ax,bx
into
{
. . .
}
ret
end;
{--------------Разработка обработчиков исключений---------------}
procedure exc_04;assembler; { Обработчик исключения N }
asm
mov excep,4
mov bx,1
mov ah,1 { Установка маркера: }
mov bx,100ah { строка 3ч, столбец 10 }
int 30h
mov ah,4 { Вывод строки s на экран: }
mov dh,9h { видеоатрибут, }
mov si,offset s2 { адрес строки }
int $30
{ mov ah,1 { Установка маркера }
{ mov bx,004h
int 30h
{
. . .
}
db 66h
iret
end;
procedure exc_0b;assembler; { Обработчик исключения 11 }
{ вызывается при отсутствии сегмента в памяти и выполняет }
{ коррекцию дескриптора сегмента - востанавливает бит P }
asm
mov excep,0bh
cmp cpu_type,2
jz @1
db 66h
@1:pop bx { Чтение из стека кода ошибки }
mov err,bx { и запись в переменную err }
and bx,not 7 { Выделение смещения селектора }
add bx,offset gdt+5 { Выбор поля байта доступа в GDT }
push ax
mov al, [bx] { Чтение байта доступа сегмента }
or al,80h
mov [bx],al { Установка бита P=1 в байте доступа }
pop ax
cmp cpu_type,2
jz @2
db 66h
@2:iret
end;
procedure keyb;assembler; { Обработчик прерываний }
asm { от клавиатуры: }
mov al,20h
out 20h,al { Сброс контроллера прерываний }
in al,60h { Чтение скан-кода нажатия/отжатия клавиши }
test al,$80
jnz @1 { Переход, если клавиша отжата }
mov scan,al
@1:cmp cpu_type,2