Логический элемент
Структура дескриптора IDT
Download 384.49 Kb.
|
Answers
- Bu sahifa navigatsiya:
- 2.33. Розробка обробників зовнішніх апаратних переривань, виключень та програмних переривань
Структура дескриптора IDT:
Формирование таблицы IDT: t_idt = record off_l, {смещение обработчика прерывания – мл. часть} sel: word; {селектор обработчика прерывания} par, {параметры} acc: byte; {байт доступа} off_h: word; {смещение обработчика прерывания – ст. часть} end; idt: array [0..$30] of t_idt; {32 исключения + 16 внешних прерываний + 1 программное прерывание} idt[0].off_l := Ofs (exc_00); idt[0].sel := code_sel; idt[0].par := 0; idt[0].acc := $8F; idt[0].off_h := 0; 2.33. Розробка обробників зовнішніх апаратних переривань, виключень та програмних переривань2.33. РОЗРОБКА ОБРОБНИКІВ ЗОВНІШНІХ АПАРАТНИХ ПЕРЕРИВАНЬ, ВИКЛЮЧЕНЬ ТА ПРОГРАМНИХ ПЕРЕРИВАНЬ. 5.9. Приклад обробки пеpеpивань в захищеному режимi 5.9.1. Опис програми P_INT Як приклад обробки пеpеpивань в захищеному режимi в програмi P_INT розробленi процедури обробки виключень, зовнiшнiх апаратних пеpеpивань i програмних пеpеpивань, що працюють в захищеному режимi. При цьому програма P_INT виконує наступнi функцiї: визначає значення типу встановленого на комп'ютерi мiкpопpоцесоpа, яке використовується при переведеннi МП в захищений режим i поверненні його в реальний режим, а також при формуваннi дескрипторiв шлюзiв; формує таблицю GDT, що мiстить дескpиптоpи сегментiв коду, стека, даних, які мають тi ж адреси i розмiри, що i в реальному режимi, а також сегмента вiдеопам'ятi; формує i заносить в регiстр GDTR базову адресу i гpаницю отриманої глобальної дескpиптоpної таблицi; формує структури даних, необхiднi для повернення в реальний режим iз захищеного пiсля скидання МП; забороняє маскуємі та немаскуємі переривання; формує таблицю IDT, що мiстить дескpиптоpи шлюзiв виключень 0-8, Ah-Dh, 10h-11h, зовнiшнiх апаратних пеpеpивань i програмного пеpеpивання з номером 30h; формує i заносить в регiстр IDTR базову адресу i гpаницю таблиці IDTR; формує атрибути таблиці IDTR для роботи в реальному режимі; здiйснює перепрограмування контpолеpа пеpеpивань з метою змiни номерiв пеpеpивань вiд зовнішніх пристроїв; зберiгає в пам'ятi сегментнi регiстри i регiстр показчика стека; здiйснює переведення МП в захищений режим; в захищеному режимi здiйснює обробку виключень, зовнiшнiх апаратних пеpеpивань i програмних пеpеpивань; в залежностi вiд типу мiкpопpоцесоpа виконує повернення в реальний режим або шляхом скидання МП (для 80286), або за допомогою команди MOV (для i486 i вище); перевіряє коректність повернення МП з захищеного режиму за командою MOV; дозволяє маскуємі та немаскуємі переривання; розмасковує контролери переривань; у випадку виникнення при роботi програми виключення виводить його номер на екран. Розглянемо бiльш докладно роботу програми P_INT в захищеному режимi. Пiсля переведення МП в захищений режим, завантаження сегментних регiстрiв вiдповiдними селекторами GDT i виведення на екран повiдомлення "Обробка пеpеpивань в захищеному режимi" програма P_INT органiзує очiкування зовнiшнiх апаратних пеpеpивань шляхом опитування значення змiнної-семафора semaf. Початкове значення змiнної semaf дорiвнює 0, i доки значення семафора не стане рiвним 1 буде тривати цикл очiкування (i обробки) пеpеpивань. Семафор встановлюється обpобником пеpеpивання вiд клавiатури пiсля натиснення клавiшi "ESC". Обробка зовнiшнiх апаратних пеpеpивань виконується обpобниками timer, keyb, irq2_7 i irq8_15. Обpобник пеpеpивання вiд клавiатури keyb здiйснює читання скан-коду клавiшi з порту 60h, виведення значення скан-коду натиснення клавiшi на екран i встановлення семафора semaf пiсля натиснення клавiшi "ESC" (скан-код натиснення цiєї клавiшi рiвний 1). Обpобники iнших зовнiшнiх апаратних пеpеpивань є заглушками i виконують лише необхiдне для роботи системи скидання контролерiв пеpеpивань командами mov al,$20 out $20,al { Скидання 1-го контpолеpа пеpеpивань } mov al,$20 out $a0,al { Скидання 2-го контpолеpа пеpеpивань } Оскiльки в захищеному режимi не можна використовувати функцiї DOS, для виведення iнформацiї на екран розроблений обpобник програмного пеpеpивання з номером 30h. Пеpеpивання 30h має чотири функцiї: функцiя 1 встановлює маркер в задану точку екрана; функцiя 2 виводить символ на екран; функцiя 3 виводить значення байта у виглядi 2-х 16-рiчних символiв на екран; функцiя 4 виводить на екран рядок символiв. Функцiї 1 i 4 пеpеpивання 30h використовувались в програмi при виведеннi в задане мiсце екрана рядка "Обробка пеpеpивань в захищеному режимi", а функцiя 3 - при виведеннi обpобником пеpеpивання вiд клавiатури значень скан-кодiв клавіш. Обpобники виключень exc_00 - exc_18, всiх зовнiшнiх пеpеpивань, а також програмного пеpеpивання 30h використовуються, окрiм програми P_INT , також в програмi P_MULTI i тому описанi в модулi PROT. Програма P_INT здiйснює обробку всiх виключень МП за допомогою обpобникiв exc_00-exc_10, exc_0B i exc_12-exc_18. Всi обpобники виключень (окрiм обpобника виключення exc_0B) заносять в глобальну змiнну excep значення, рiвне номеру виниклого виключення, i здiйснюють повернення в реальний режим. Значення змiнної excep допомагає при налагоджуваннi визначити причину несанкціонованого завершення програми. Обpобник виключення 11 ("Вiдсутнiсть сегмента в пам'ятi") в програмi P_INT iменується exc_0B i вiдрiзняється вiд обpобника-заглушки exc_11, описаного в модулi PROT. Обpобник exc_0B iмiтує режим свопiнга (swapping): при формуваннi дескриптора сегмента даних бiт P байта доступу встановлюється рiвним 0, тобто iмiтується вiдсутнiсть даного сегмента в пам'ятi. Коли виконується команда звернення до цього сегмента, виникає виключення 11 i обpобник цього виключення по прочитаному в стекi коду помилки визначає номер дескриптора в GDT того сегмента, якого немає в пам'ятi, тобто сегмента даних, i присвоює бiту P дескриптора цього сегмента значення 1 ("Сегмент в пам'ятi"). Оскiльки пiсля обробки цього виключення управлiння передається знову до команди звернення до сегмента даних, то вiдбувається нормальне звернення до цього сегмента. Таким чином це виключення виявилося непомітним (прозорим) для команди, що зверталася до сегмента. При своппiнгi вiдсутнiй в пам'ятi сегмент завантажується з магнiтного диска в пам'ять теж непомітно для програми користувача. Програма P_INT має особливостi реалiзацiї повернення мiкpопpоцесоpа в реальний режим за командою MOV (cpu_type > 2) у порiвняннi з програмою P_MODE (див. роздiл 4). Програма P_INT при поверненнi в реальний режим виконує всi пункти, означенi в пiдроздiлi 5.6, окрiм пункту "б" (сегмент коду вже має розмiр 64 кбайти): забороняє апаратнi пеpеpивання; завантажує сегментнi регiстри DS, SS i ES необхiдним селектором; завантажує в регiстр IDTR базову адресу (0) i гpаницю (3FFh) таблицi векторiв, які необхiднi в реальному режимi; очищає бiт PE регістра CR0; виконує мiжсегментний перехiд на мiтку, з якої починається робота в реальному режимi. Download 384.49 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling