Обробка критичних помилок і переривань у середовищі OS

Розгляд поняття та правил складання програми обробки критичних помилок. Опис апаратних переривань в порядку пріоритету, умов їх заборони та дозволу. Вивчення основних функцій та кодів з метою написання власного переривання і доповнення до нього.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык украинский
Дата добавления 17.06.2010
Размер файла 24,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Лабораторна робота

"Обробка критичних помилок і переривань у середовищі OS"

Мета роботи:

Вивчити можливі критичні помилки апаратури і шляхи їхньої обробки.

Теоретичні відомості:

Операційна система MS-DOS дозволяє програмам встановлювати власний оброблювач критичних помилок апаратури. Ми вже говорили про те, що вектор 0000:0090, що відповідає перериванню INT 24h, містить адреси оброблювача критичних помилок. Цей оброблювач одержує керування від операційної системи, коли драйвер якого-небудь пристрою виявляє помилку апаратури.

Зверніть увагу на те, що оброблювач критичних помилок не викликається при роботі з диском через переривання MS-DOS INT 25h/26h,і тим більше при роботі з диском на рівні переривання INT 13h BIOS.

При запуску програми MS-DOS копіюється адреса оброблювача в префікс сегмента програми PSP, а після завершення роботи програми - відновлює його з PSP.

Стандартний оброблювач MS-DOS виводить на екран повідомлення: Abort, Retry, Fail.

Якщо ваша програма повинна сама обробляти помилки апаратури, вона може встановити свій власний оброблювач критичних помилок.

Коли оброблювач одержує керування, регістри процесора містять інформацію, необхідну для визначення причини й місця появи помилки:

АН - інформація про помилку:

Біти:

0 тип операції:

0 - читання, 1 - запис

1...2 - область диску, де відбулася помилка:

00 - системні файли;

01 - область FAT

10 - область каталогу;

11 - область даних

3 1 - можливий вихід з кодом FAIL

4 1 - можливий вихід з кодом RETRY

5 1 - можливий вихід з кодом IGNORE

6 зарезервований, дорівнює 0

7 тип пристрою:

0 - диск;

1 - символьний пристрій

AL - номер диску (якщо біт 7 регістра АН дорівнює 0)

DI - код помилки (біти 0...7, інші біти не визначені)

ВР:SI - адреса заголовка драйвера пристрою, на якому виникла помилка.

Біти 3, 4, 5 визначені тільки для DOS версії 3.0 та старіше. Оброблювач критичних помилок не повинен користуватися функціями MS-DOS з кодами, більшими чим 0Ch (через те, що функції MS-DOS не реентерабельні).

Програма може вивести на екран повідомлення про помилку й запитати в оператора про необхідні дії. Їй дозволено також отримати додаткову уточнюючу інформацію про помилку за допомогою функції 59h переривання INT 21h або довідатися версію DOS за допомогою функції 30h цього ж переривання. Додаткову інформацію про пристрій, у якому відбулася помилка, можна одержати, використовуючи адресу заголовка драйверу пристрою, що передається операційною системою при виклику оброблювача в регістрах BP:SI.

Для визначення номера функції DOS, у якій відбулася критична помилка, програма-оброблювач може виконати аналіз стека. Коли оброблювач одержує керування, стек має наступну структуру: Адреса повернення в DOS для команди IRET

IP

CS

FLAGS

Зміст регістрів програми перед викликом INT 21h

AX, BX, CX, DX, SI, DI, BP, DS, ES

Адреси повернення в програму, що викликала функцію DOS

IP

CS

FLAGS

Виконавши аналіз регістра АН, можна визначити номер функції DOS, при виклику якої відбулася помилка, а знаючи вміст інших регістрів - і всі параметри цієї функції.

Після виконання всіх необхідних дій програма обробки критичних помилок повинна повернути в регістрі AL код дії, що повинна виконати операційна система для обробки даної помилки:

0 - ігнорувати помилку;

1 - повторити операцію;

2 - аварійно закінчити завдання, використовуючи адресу завершення, записану у векторі переривання INT 23h;

3 - повернути програмі керування з відповідним кодом помилки (цей код можна задавати тільки для DOS версії 3.0 та старіше).

Якщо ви користуєтеся операційною системою MS-DOS версії 4.0, та при відкритті файлів за допомогою функції 6Сh програма може заблокувати виклик оброблювача критичних помилок.

Для складання програми обробки критичних помилок ви можете скористатися мовою асемблера або функціями стандартних бібліотек трансляторів Microsoft QC 2.5 і C 6.0 dos setvect(), chain intr(). Однак найкраще використовувати спеціально призначені для цього (і ті що входять до складу стандартних бібліотек зазначених трансляторів) функції harderr(), hardresume() і hardretn().

Функція harderr() призначена для встановлення нового оброблювача критичних помилок, вона має наступний прототип: void harderr(void (far *handler)()); Параметр handler - покажчик на нову функцію обробки критичних помилок. Функції hardresume() і hardretn() повинні бути використані в оброблювачі критичних помилок, встановленому функцією harderr().

Функція hardresume() повертає керування операційній системі, вона має прототип:

hardresume(int result);

Параметр result може мати наступні значення (у відповідності з необхідними діями):

HARDERR ABORT - аварійно завершити програму;

HARDERR FAIL - повернути код помилки;

HARDERR IGNORE - ігнорувати помилку;

HARDERR RETRY - повторити операцію.

Ці параметри записані у файлі dos.h.

Функція hardretn() повертає керування безпосередньо програмі, передаючи їй код помилки, зумовлений параметром функції error:

void hardretn(int error);

При цьому програма одержує після повернення з викликаної їй функції DOS код помилки error. Якщо помилка відбулася при виконанні функції з номером, більшим чим 38h, додатково встановлюється в 1 прапор переносу. Якщо номер функції був менше вказаного значення, у регістр AL записується величина FFh.

Функція обробки критичних помилок handler має наступні параметри:

void far handler(unsigned deverror, unsigned errcode, unsigned far *devhdr);

Перший параметр - код помилки пристрою. Він дорівнює змісту регістра АХ при виклику оброблювача переривання INT 24h. Аналогічно параметр errcode відповідає вмісту регістра DI - код помилки. Третій параметр - devhdr - це покажчик на заголовок драйверу пристрою (переданий у регістрах BP: SI).

Для демонстрації використання функцій встановлення оброблювача критичних помилок приведемо програму, що намагається створити каталог на диску А:. Ця програма сама обробляє критичні помилки, запитуючи в оператора інформацію про необхідні дії.

// Цю програму можна запускати тільки з командного рядка.

// При запуску з інтегрованого середовища QC або PWB

// можливий конфлікт із використовуваним у цих

// середовищах оброблювачем критичних помилок.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <direct.h>

#include <string.h>

#include <dos.h>

#include <bios.h>

void main(void);

void far hhandler(unsigned deverr, unsigned doserr, unsigned

far *hdr);

void bios str(char *p);

void main() {

// Встановлюємо оброблювач критичних помилок

harderr(hhandler);

// Моделюємо критичну помилку. Виконуємо спробу створити

// каталог на диску А:. Якщо ми "забудемо" вставити в дисковод

// дискету, буде викликаний оброблювач критичної помилки

printf (" \ nвставьте (або не вставляйте) дискету"

" у дисковод А:"

" \ nта натисніть будь-яку клавішу..."

" \ n");

getch();

// Створюємо каталог

if (mkdir("a:\test ctl")) {

printf(" \nпомилка при створенні каталогу");

exit(-1);

}

else {

printf(" \nуспішне створення каталогу");

// Видаляємо тільки що створений каталог

rmdir("a:test ctl");

exit(0);

}

}

// Новий оброблювач критичних помилок

void far hhandler(unsigned deverr, unsigned dosser, unsigned

far *hdr) {

int ch;

static char buf[200], tmpbuf[10];

// Виводимо повідомлення про критичну помилку

sprintf(buf, " \n\r"

" \n\rкод помилки пристрою: %04.4X"

" \n\rкод помилки DOS: %d"

" \n\r\n\r"

" \n\rвиконувані дії:"

" \n\r 0 - повторити"

" \n\r 1 - скасувати"

" \n\r 2 - завершити"

" \n\ r-r--і-> ?",

deverr,

doserr);

bios str(buf);

// Вводимо відповідь із клавіатури

ch = bios keybrd( KEYBRD READ) & 0x00ff;

bios str(" \n\r");

switch(ch) {

case '0':

// Намагаємося повторити операцію

default:

hardresume( HARDERR RETRY);

case '2': // Завершуємо роботу програми

hardresume( HARDERR ABORT);

case '1': // Повернення в DOS з кодом помилки

hardretn(doserr);

}

}

// Програма для виводу рядка символів на екран

// за допомогою функції BIOS 0Eh

void bios str(char *ptr) {

union REGS inregs, outregs;

char *start = ptr;

inregs.h.ah = 0x0e;

for(; *ptr; ptr++) {

inregs.h.al = *ptr;

int86(0x10, &inregs, &outregs);

}

}

Переривання це готові процедури, які комп'ютер викликає для виконання певного завдання. Існують апаратні й програмні переривання. Апаратні переривання ініціюються апаратурою, або із системної плати, або з карти розширення. Вони можуть бути викликані сигналом мікросхеми таймера, сигналом від принтера, натисканням клавіші на клавіатурі й безліччю інших причин. Апаратні переривання не координуються з роботою програмного забезпечення. Коли викликається переривання, то процесор залишає свою роботу, виконує переривання, а потім вертається на колишнє місце. Для того щоб мати можливість повернутися точно в потрібне місце програми, адреса цього місця (CS:IP) запам'ятовується на стеці, разом з регістром прапорів. Потім в CS:IP завантажується адреса програми обробки переривання і їй передається керування. Програми обробки переривань іноді називають драйверами переривань. Вони завжди завершуються інструкцією IRET (повернення з переривання), яка завершує процес, що почався перериванням, повертаючи старі значення CS:IP і регістра прапорів, тим самим даючи програмі можливість продовжити виконання з того ж стану.

З іншого боку, програмні переривання насправді нічого не переривають. Насправді це звичайні процедури, які викликаються Вашими програмами для виконання рутинної роботи, такий як прийом натискання клавіші на клавіатурі або вивід на екран. Однак ці підпрограми містяться не всередині Вашої програми, а в операційній системі й механізм переривань дає Вам можливість звернутися до них. Програмні переривання можуть викликатися одне з одного. Наприклад, всі переривання обробки введення із клавіатури DOS використовують переривання обробки введення із клавіатури BIOS для отримання символу з буфера клавіатури. Відзначимо, що апаратне переривання може одержати керування при виконанні програмного переривання. При цьому не виникає конфліктів, тому що кожна підпрограма обробки переривання зберігає значення всіх використовуємих нею регістрів і потім відновлює їх при виході, тим самим не залишаючи слідів того, що вона займала процесор.

Адреси програм переривань називають векторами. Кожний вектор має довжину чотири байти. У першому слові зберігається значення IP, а у другому - CS. Молодші 1024 байт пам'яті містять вектора переривань, у такий спосіб є місце для 256 векторів. Разом узяті вони називаються таблицею векторів. Вектор для переривання 0 починається з чарунки 0000:0000, переривання 1 - з 0000:0004, 2 - з 0000:0008 і т.д. Якщо подивитися на чотири байти, починаючи з адреси 0000:0020, у яких утримується вектор переривання 8H (переривання часу доби), то Ви виявите там A5FE00F0. Маючи на увазі, що молодший байт слова розташований спочатку й що порядок IP:CS, це 4-байтне значення переводиться в F000:FEA5. Це стартова адреса програми ПЗУ, що виконує переривання 8H. На мал. 1-2 показана схема виконання програмою переривання 21H.

Програмування контролера переривань 8259

Для керування апаратними перериваннями у всіх типах IBM PC використовується мікросхема програмувального контролера переривань Intel 8259. Оскільки в кожний момент часу може надійти не один запит, мікросхема має схему пріоритетів. Є 8 рівнів пріоритетів, крім AT, у якого їх 16, і звертання до відповідних рівнів позначаються скороченнями від IRQ0 до IRQ7 (від IRQ0 до IRQ15), що означає запит на переривання. Максимальний пріоритет відповідає рівню 0. Додаткові 8 рівнів для AT проробляються другою мікросхемою 8259; цей другий набір рівнів має пріоритет між IRQ2 і IRQ3. Запити на переривання 0-7 відповідають векторам переривань від 8H до 0FH; для AT запити на переривання 8-15 обслуговуються векторами від 70H до 77H. Нижче приведені призначення цих переривань:

Апаратні переривання в порядку пріоритету

IRQ 0 таймер.

1 клавіатура.

2 канал введення/виведення.

8 годинники реального часу (тільки AT).

9 програмно переводяться в IRQ2 (тільки AT).

10 резерв.

11 резерв.

12 резерв.

13 мат. співпроцесор (тільки AT).

14 контролер фіксованого диску (тільки AT).

15 резерв.

3 COM1 (COM2 для AT).

4 COM2 (модем для PCjr, COM1 для AT).

5 фіксований диск (LPT2 для AT).

6 контролер дискет.

7 LPT1.

Перериванню часу доби даний максимальний пріоритет, оскільки якщо воно буде постійно губитися, то будуть невірними показання системних годин. Переривання від клавіатури викликається при натисканні або відпусканні клавіші; воно викликає ланцюг подій, який звичайно закінчується тим, що код клавіші заноситься в буфер клавіатури (звідки він потім може бути отриманий програмними перериваннями). Мікросхема 8259 має три однобайтних регістри, які керують вісьмома лініями апаратних переривань. Регістр запиту на переривання (IRR) встановлює відповідний біт коли лінія переривання сигналізує про запит. Потім мікросхема автоматично перевіряє чи не обробляється інше переривання. При цьому вона запитує інформацію регістра обслуговування (ISR). Додатковий ланцюг відповідає за схему пріоритетів. Нарешті, перед викликом переривання, перевіряється регістр маски переривань (IMR), щоб довідатися чи дозволено в цей момент переривання даного рівня. Як правило програмісти звертаються тільки до регістра маски переривань через порт 21H і командного регістру переривань через порт 20H.

Заборона/дозвіл окремих апаратних переривань

Програми на асемблері можуть заборонити апаратні переривання, перераховані в [1]. Це масковані переривання; інші апаратні переривання, що виникають при деяких помилках (таких як ділення на нуль) не можуть бути масковані. Є дві причини для заборони апаратних переривань. У першому випадку всі переривання блокуються для того щоб критична частина коду була виконана цілиною перш ніж машина зробить яку-небудь іншу дію. Наприклад, переривання забороняють при зміні вектора апаратного переривання, уникаючи виконання переривання коли вектор змінений тільки навпіл. У другому випадку маскуються тільки певні апаратні переривання. Це робиться коли деякі певні переривання можуть взаємодіяти з операціями, критичними до часів. Наприклад, точно розрахована за часом процедура введення/виведення не може собі дозволити бути перерваної тривалим дисковим перериванням. Виконання переривань залежить від значення прапора переривання (біт 9) у регістрі прапорів. Коли цей біт дорівнює 0, те дозволені всі переривання, які дозволяє маска. Коли він дорівнює 1, те всі апаратні переривання заборонені. Щоб заборонити переривання, встановивши цей прапор в 1, використовується інструкція CLI. Для очищення цього прапора й відновлення переривань - інструкція STI. Уникайте відключення переривань на тривалий період. Переривання часу доби відбувається 18.2 рази в секунду і якщо до цьому перериванню був більш ніж один запит у той час, коли апаратні переривання були заборонені, то зайві запити будуть відкинуті й системний час буде визначатися неправильно. Майте на увазі, що машина автоматично забороняє апаратні переривання при виклику програмних переривань і автоматично дозволяє їх при поверненні. Коли Ви пишете свої програмні переривання, то Ви можете почати програму з інструкції STI, якщо Ви можете допустити апаратні переривання. Відзначимо також, що якщо за інструкцією CLI не треба STI, то це призведе до зупинки машини, тому що введення з клавіатури буде заморожений. Для маскування певних апаратних переривань потрібно просто послати необхідний ланцюжок бітів у порт з адресою 21H, який відповідає регістру маски переривань (IMR). Регістр маски на другій мікросхемі 8259 для AT (IRQ 8-15) має адресу порту A1H. Встановіть ті біти регістра, які відповідають номерам переривань, які Ви хочете маскувати. Цей регістр можна тільки записувати.

Написання власного переривання

Функція 25H переривання 21H встановлює вектор переривання на зазначену адресу. Адреси мають розмір два слова. Старше слово містить значення сегмента (CS), молодше містить зсув (IP). Щоб встановити вектор, що вказує на одну з Ваших процедур, потрібно помістити сегмент процедури в DS, а зсув в DX (слідуючи порядку нижчеподаного приклада). Потім помістить номер переривання в AL і викличте функцію. Будь-яка процедура переривання повинна завершуватися не звичайною інструкцією RET, а IRET. (IRET виштовхує зі стека три слова, включаючи регістр прапорів, у той час як RET поміщає на стек тільки два. Якщо Ви спробуєте тестувати таку процедуру як звичайну процедуру, але що кінчається IRET, то Ви вичерпаєте стек.) Відзначимо, що функція 25H автоматично забороняє апаратні переривання в процесі зміни вектора, тому не існує небезпеки, що посередині дороги відбудеться апаратне переривання, що використовує даний вектор.

Наприкінці коду кожного з Ваших апаратних переривань Ви повинні включити наступні 2 рядки коду:

MOV AL,20H

OUT 20H,AL

Це простий збіг, що числа (20H) ті самі в обох рядках. Якщо апаратне переривання не закінчується цими строками, то мікросхема 8259 не очистить інформацію регістра обслуговування, для того щоб була дозволена обробка переривань із більш низькими рівнями, чим тільки що оброблене. Відсутність цих рядків легко може призвести до краху програми, тому що переривання від клавіатури швидше за все виявляться замороженими й навіть Ctrl-Alt-Del виявиться марним. Відзначимо, що ця добавка не потрібна для тих векторів переривань, які є розширеннями існуючих переривань, таким як переривання 1CH, що додає код до переривання часу доби. Коли програма завершується, повинні бути відновлені оригінальні вектори переривань. У противному випадку наступна програма може викликати дане переривання й передати керування на те місце в пам'яті, у якому Вашої процедури вже немає. Функція 35 переривання 21H повертає поточне значення вектора переривання, поміщаючи значення сегмента в ES, а зсув в BX. Перед встановлення свого переривання одержите поточне значення вектора, використовуючи цю функцію, збережете ці значення, і потім відновите їх за допомогою функції 25H (як вище) перед завершенням своєї програми. Є пара пасток, яких варто уникати при написанні переривання. Якщо нова процедура переривання повинна мати доступ до даних, то необхідно подбати, щоб DS був правильно встановлений (звичайне переривання може використовувати стек викликаючої програми). Інша неприємність може полягати в тім, що при завершенні програми по Ctrl-Break вектор переривання не буде відновлено, якщо тільки Ви не передбачите, щоб програма реакції на Ctrl-Break виконувала цю процедуру.

Доповнення до існуючого переривання

Звичайно, модифікувати переривання BIOS і DOS непросто, оскільки BIOS розташований в ПЗУ, а DOS надходить без лістингу й вони обмежені розмірами відведеної для них пам'яті. Але Ви можете написати процедуру, що передує й/або йде за відповідним перериванням, і ця процедура може викликатися при виклику переривання DOS або BIOS. Наприклад, у випадку переривання 16H, Вам потрібно написати процедуру й вказати на неї вектором переривання для 16H. Оригінальне значення вектора 16H тим часом переноситься в який-небудь не використовуваний вектор, скажемо, 60H. Нова процедура просто викликає переривання 60H, щоб використовувати оригінальне переривання 16H; тому коли програма викликає переривання 16H, керування передається Вашій процедурі, що потім викликає оригінальне переривання 16H, що по завершенні знову повертає керування Вашій процедурі, а з неї вже Ви повертаєтесь в те місце програми, з якого був виклик переривання 16H. Після того як це зроблено, у новій процедурі може міститися будь-який код, як до, так і після виклику переривання 60H. Ось стисле зведення необхідних дій:

1. Створити нову процедуру, що викликає переривання 60H.

2. Перенести вектор переривання для 16H в 60H.

3. Змінити вектор 16H, щоб він вказував на нову процедуру.

4. Завершити програму, залишаючи її резидентною.

Порядок виконання роботи:

1. Вивчити основні теоретичні відомості й додаткову літературу, присвячену даному питанню.

2. Вивчити коди критичних помилок.

3. Написати найпростіший оброблювач критичних помилок.

4. Зробити звіт.

Контрольні питання:

1. Що таке переривання ?

2. Як обробляється переривання в середовищі MS-DOS ?

3. Як завершується обробка переривання ?

4. Які відмінності в завершенні обробки апаратного й програмного переривань ?

5. Що таке масковані й немасковані переривання ?

6. Як замаскувати немасковані переривання ?

7. Що таке маскування переривань ?

8. Що таке критична помилка ?

9. Що таке вектор переривання і як його перехопити ?

10. Які відмінності обробки переривання в реальному й захищеному режимі процесора ?


Подобные документы

  • Поняття обчислювального процесу і ресурсу. Планування і диспетчеризація процесів і задач в ОС. Розподіл переривань по рівнях пріоритету. Способи виділення пам’яті під новий розділ. Дисципліни заміщення сегментів. Призначення таблиць ідентифікаторів.

    реферат [68,7 K], добавлен 13.06.2010

  • Опис задуму та мети складання програми. Порядок створення контролюючої програми-тесту "Пори року" в програмному середовищі Delphi для перевірки знань молодших школярів про пори року. Написання кодів, алгоритм реалізації роботи та лістинг програми.

    курсовая работа [4,3 M], добавлен 14.06.2010

  • Порівняльна характеристика структури мов програмування Assembler та C. Вивчення поняття "об'єктного файлу" та "виконуваного модуля". Розгляд функцій переривання, введення/виведення символу та стрічки, екранного режиму та малювання крапки і прямої.

    курс лекций [348,8 K], добавлен 18.06.2010

  • Аналіз предметної області і постановка задачі на розробку програми для автоматизації роботи автопідприємства. Перелік та опис використаних компонентів та основних процедур програми. Опис структур та методів обробки даних. Інструкція для користувача.

    курсовая работа [2,3 M], добавлен 15.02.2012

  • Модель обробки файлів растрових зображень. Середній квадрат яскравості. Фільтри для виділення перепадів і границь. Опис та обґрунтування вибору складу технічних та програмних засобів. Опис інтерфейсу програми. Зображення діалогового вікна програми.

    курсовая работа [664,3 K], добавлен 30.06.2009

  • Призначення ігрової програми "Змійка" для розвитку уваги та логічного мислення гравців. Розробка програми в середовищі C++ Builder 6, її функціонування в ОС Windows. Опис алгоритму та основних функцій програми. Основні переваги та недоліки мови С++.

    реферат [1,7 M], добавлен 17.12.2014

  • Розробка та дослідження алгоритмів і програм кодування даних з виявленням помилок на основі циклічних CRC-кодів. Аналіз циклічних кодів. Розробка та тестування програмних модулів. Розрахунок економічних показників. Вирішення питань охорони праці.

    дипломная работа [5,4 M], добавлен 22.06.2010

  • Вибір засобу виконання поставленої задачі. Функції переривання INT 21h MS DOS, що використані при роботі програм. Функції роботи із DTA та інші функції переривання INT 21h. Функція завершення програми. Розробка програми на Pascal. Допоміжні процедури.

    дипломная работа [89,0 K], добавлен 20.01.2009

  • Перевірка коду на парність. Формула для підрахунку парності або непарності одиниць в інформаційних розрядах. Побудова групових кодів і їх вживання для виявлення і виправлення помилок. Правила формування перевірочних символів. Використання кодів Хемминга.

    лабораторная работа [639,7 K], добавлен 17.12.2010

  • Розробка програми GameBox, яка включає в себе дві гри, судоку та пятнашки. Опис структури даних та вимоги до них, процедур і функцій користувача, стандартних процедур і функцій, які використовувались в програмі, та файлів. Результати роботи програми.

    курсовая работа [5,3 M], добавлен 12.11.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.