Міністерство освіти І науки україни національний технічний університет "харківсьий політехнічний інститут" кафедра обчислювальної техніки та програмування ізюмський нкц

Вид материалаДокументы

Содержание


2.7 Завдання адреси i розмiру IDT
P_INT формування даних регістра IDTR для роботи в захищеному режимі та його завантаження здійснюються процедурою init_idtr_p
2.8 Перепрограмування контролера переривань
2.10 Дiї мiкpопpоцесоpа при обробцi пеpеpивань
2.11 Формат коду помилки
2.12 Перевірка коректності повернення з захищеного режиму
2.13 Розмаскування контролерів переривань
3.Опис логічної структури
3.2 Алгоритм програми KP_MPS_2.pas
Міністерство освіти і науки україни
Ізюмський нкц
Лист затвердження
Кітзі-22.22754-12 00-01-лз
Міністерство освіти і науки україни
Ізюмський нкц
Лист затвердження
Кітзі-22.22754-12 00-01-лз
2. Текст програми
Подобный материал:
1   2   3   4   5

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ї:
  1. визначити тип встановленого в персональному комп'ютерi мiкpопpоцесоpа;
  2. сформувати в пам'ятi глобальну дескpиптоpну таблицю, що мiстить дескpиптоpи всiх сегментiв пам'ятi, якi використовуються в програмі;
  3. задати базову адресу i розмiр глобальної дескpиптоpної таблицi;
  4. формувати данi для повернення в реальний режим;
  5. заборонити маскуємi та немаскуємi переривання;
  6. зберегти в пам'ятi вмiст регiстрiв МП;
  7. перевести мiкропроцесор в захищений режим;
  8. виконати в захищеному режимi заданi дiї;
  9. повернутися в реальний режим;
  10. вiдновити вмiст регiстрiв МП;
  11. дозволити маскуємi та немаскуємi переривання.

3.2 Алгоритм програми KP_MPS_2.pas

Для виконання завдання необхідно виконати наступні дії:
  1. розробити дескриптори усіх необхідних сегментів пам’яті і сформувати з них глобальну дескрипторну таблицю GDT.
  2. за допомогою регістра GDTR задати базову адресу і розмір таблиці GDT;
  3. розробити дескриптори усіх шлюзів, сформувати з них таблицю IDT.
  4. за допомогою регістра IDTR задати базову адресу і розмір таблиці IDT;
  5. сформувати дані для повернення в реальний режим;
  6. зберегти в пам'яті вміст регістрів МП;
  7. заборонити маскуємі і немаскуємі переривання;
  8. перевести мікропроцесор у захищений режим;
  9. виконати в захищеному режимі дії, задані індивідуальним завданням;
  10. повернутися в реальний режим;
  11. відновити вміст регістрів МП;
  12. дозволити маскуемі і немаскуемі переривання.

Висновки

Розроблено програму, що реалізує можливість роботи з мікропроцесором у захищеному режимі. Були розглянуті особливості обробки виключень та апаратних переривань у захищеному режим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