Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Theme08.doc
Скачиваний:
9
Добавлен:
20.12.2018
Размер:
133.12 Кб
Скачать

Обробка переривань у контексті поточної задачі.

Розглянемо мал. 3.13, що пояснює обробку переривання в контексті поточної задачі. При виникненні переривання процесор по номеру переривання індексує таблицю IDT, тобто адреса відповідного комутатора визначається шляхом додавання вмісту поля адреси в регістрі IDTR і номера переривання, помноженого на 8 (праворуч до номера переривання додаються три нулі). Отриманий дескриптор аналізується, і якщо його тип відповідає комутатору trap gate чи комутатору interrupt gate, то виконуються наступні дії.

1. У стек на рівні привілеїв поточного сегмента коду поміщаються:

  • значення SS і SP, якщо рівень привілеїв у комутаторі вище рівня привілеїв раніше виповнювався коду;

  • регістр флагів EFLAGS;

  • регістри CS і IP.

  1. Якщо розглянутому перериванню відповідав комутатор interrupt gate, то забороняються переривання (флаг IF:=0 у регістрі EFLAGS). У випадку комутатора trap gate флаг переривань не скидається й обробка нових переривань на період обробки поточного переривання тим самим не забороняється.

  2. Поле селектора з дескриптора переривань використовується для індексування таблиці дескрипторів задачі. Дескриптор сегмента заноситься в тіньовий регістр, а зсув відносно початку нового сегмента коду визначається полем зсуву з дескриптора переривання.

Мал. 8.2 Схема передачі управління при перериванні в контексті поточної задачі.

Таким чином, у випадку обробки переривань, коли дескриптором переривань є комутатор interrupt gate чи trap gate, ми залишаємося в тому же віртуальному адресному просторі, і повної зміни контексту поточної задачі не відбувається. Просто ми переключаємося на виконання іншого (як правило, більш привілейованого) коду, але також приналежного (або, вірніше сказати, доступного) задачі, що виконується. Цей код створюється системними програмістами, і прикладні програмісти його просто використовують. У той же час механізми захисту мікропроцесора дозволяють забезпечити неприступність цього коду для його виправлення (з боку додатків, які його викликають) і неприступність самої таблиці дескрипторів переривань. Зручніше за все код оброблювачів переривань розташовувати в загальному адресному просторі, тобто селектори, що вказують на такий код, повинні розташовуватися в глобальній таблиці дескрипторів.

7. Обробка переривань з переключенням на нову задачу.

Зовсім інакше здійснюється обробка переривань у випадку, якщо дескриптором переривань є комутатор задачі. Формат комутатора задачі (task gate) відрізняється від комутаторів interrupt gate і trap gate, насамперед, тим, що в ньому замість селектора сегмента коду, на який передається керування, указується селектор сегмента стану задачі (TSS). Це ілюструється за допомогою мал. 3.14. У результаті здійснюється процедура переходу на нову задачу з повною зміною контексту, тому що сегмент стану задачі цілком визначає новий віртуальний простір і адресу початку програми, а поточний стан задачі, що переривається, апаратно (по мікропрограмі мікропроцесора) зберігається в її власному TSS.

Рис. 8.3 Схема передачі керування при перериванні з переключенням на нову задачу.

При цьому відбувається повне переключення на нову задачу з вкладенням, тобто виконуються наступні дії:

    • Зберігаються всі робочі регістри процесора в поточному сегменті TSS, базова адреса цього сегмента береться в регістрі TR.

    • Поточна задача відзначається як зайнята.

    • По селекторі з Task Gate вибирається новий TSS (поле селектора міститься в регістр TR) і завантажується стан нової задачі. Нагадаємо, що завантажуються значення регістра LDTR, EFLAGS, вісім регістрів загального призначення, покажчик команди регістр EIP і шість сегментних регістрів.

    • Установлюється біт NT (next task).

    • У поле зворотного зв'язку TSS міститься селектор перерваної задачі.

    • Значення CS:IP, узяті з нового TSS, дозволяють знайти і виконати першу команду оброблювача переривання.

Таким чином, комутатор task gate дає вказівку процесору зробити переключення задачі, і обробка переривання здійснюється під контролем окремої зовнішньої задачі. У кожнім сегменті TSS є селектор локальної дескрипторної таблиці LDT, тому при переключенні задачі процесор завантажує в регістр LDTR нове значення. Це дозволяє звернутися до сегментів коду, що абсолютно не перетинаються із сегментами коду будь-яких інших задач, оскільки саме локальні дескрипторні таблиці забезпечують ефективне ізолювання віртуальних адресних просторів. Нова задача починає своє виконання на рівні привілеїв, обумовленому полем RPL нового вмісту регістра CS, що завантажується із сегмента TSS. Перевагою цього комутатора є те, що він дозволяє зберегти всі регістри процесора за допомогою механізму переключення задач, тоді як комутатори trap gate і interrupt gate зберігають тільки вміст регістрів IFLAGS, CS і IP і збереження інших регістрів покладається на програміста, що розробляє відповідну програму обробки переривання.

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

7

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]