Обробка переривань у контексті поточної задачі.
Розглянемо мал. 3.13, що пояснює обробку переривання в контексті поточної задачі. При виникненні переривання процесор по номеру перериванняіндексує таблицю IDT, тобто адреса відповідного комутатора визначається шляхом додавання вмісту поля адреси в регістрі IDTR і номера переривання, помноженого на 8 (праворуч до номера переривання додаються три нулі). Отриманий дескриптор аналізується, і якщо його тип відповідає комутатору trap gate чи комутатору interrupt gate, то виконуються наступні дії.
1.У стек на рівні привілеїв поточного сегмента коду поміщаються:
· значення SS і SP, якщо рівень привілеїв у комутаторі вище рівня привілеїв раніше виповнювався коду;
· регістр флагів EFLAGS;
· регістри CS і IP.
2. Якщо розглянутому перериванню відповідав комутатор interrupt gate, то забороняються переривання (флаг IF:=0 у регістрі EFLAGS). У випадку комутатора trap gate флаг переривань не скидається й обробка нових переривань на період обробки поточного переривання тим самим не забороняється.
3. Поле селектора з дескриптора переривань використовується для індексування таблиці дескрипторів задачі. Дескриптор сегмента заноситься в тіньовий регістр, а зсув відносно початку нового сегмента коду визначається полем зсуву з дескриптора переривання.
Мал. 8.2 Схема передачі управління при перериванні в контексті поточної задачі.
Таким чином, у випадку обробки переривань, коли дескриптором переривань є комутатор interrupt gate чи trap gate, ми залишаємося в тому же віртуальному адресному просторі, і повної зміни контексту поточної задачі не відбувається.Просто ми переключаємося на виконання іншого (як правило, більш привілейованого) коду, але також приналежного (або, вірніше сказати, доступного) задачі, що виконується. Цей код створюється системними програмістами, і прикладні програмісти його просто використовують. У той же час механізми захисту мікропроцесора дозволяють забезпечити неприступність цього коду для його виправлення (з боку додатків, які його викликають) і неприступність самої таблиці дескрипторів переривань. Зручніше за все код оброблювачів переривань розташовувати в загальному адресному просторі, тобто селектори, що вказують на такий код, повинні розташовуватися в глобальній таблиці дескрипторів.
Дата добавления: 2016-07-27; просмотров: 1576;