Засоби
апаратної підтримки управління пам'яттю і багатозадачного середовища в
мікропроцесори Intel 80386, 80486 і Pentium
Процесори Intel 80386, 80486 і Pentium з точки зору розглянутих в цьому розділі питань мають аналогічні засоби, тому для стислості в
тексті використовується термін "процесор i386", хоча вся інформація цього розділу в рівній мірі відноситься до трьох моделей процесорів фірми
Intel. p>
Процесор i386 має два режими роботи - реальний (real mode) і захищений (protected mode). У реальному режимі процесор i386 працює як швидкий
процесор 8086 з дещо розширеним набором команд. У захищеному режимі процесор i386 може використовувати всі механізми 32-х розрядної організації
пам'яті, у тому числі механізми підтримки віртуальної пам'яті і механізми перемикання завдань. Крім цього, у захищеному режимі для кожного завдання
процесор i386 може емулювати 86 і 286 процесори, які в цьому випадку називаються віртуальними процесорами. Таким чином, при роботі в багатозадачному
захищеному режимі процесор i386 працює як кілька віртуальних процесорів, що мають загальну пам'ять. На відміну від реального режиму, режим
віртуального процесора i86, який називається в цьому випадку режимом V86, підтримує сторінкову організацію пам'яті та засоби багатозадачності. Тому
завдання, що виконуються в режимі V86, використовують ті ж засоби межзадачной захисту та захисту ОС від призначених для користувача завдань, що й завдання, що працюють в
захищеному режимі i386. Однак максимальний розмір віртуального адресного простору складає 1 Мб, як і у процесора i86. p>
Переключення процесора i386 з реального режиму в захищений і назад здійснюється просто шляхом виконання команди MOV, що змінює біт режиму
в одному з керуючих регістрів процесора. Перехід процесора в режим V86 відбувається схожим чином шляхом зміни значення певного біта в іншому
регістрі процесора. p>
Засоби підтримки сегментації пам'яті
Фізичне адресний простір процесора i386 становить 4 ГБ, що визначається 32-розрядної шиною адреси. Фізична пам'ять є лінійної з
адресами від 00000000 до FFFFFFFF в шістнадцятковому поданні. Віртуальний адреса, що використовується в програмі, представляє собою пару - номер сегмента і
зміщення всередині сегменту. Зсув зберігається у відповідному полі команди, а номер сегмента - в одному з шести сегментних регістрів процесора (CS, SS, DS,
ES, FS або GS), кожен з яких є 16-бітним. Засоби сегментації утворюють верхній рівень засобів управління віртуальною пам'яттю процесора
i386, а кошти сторінкової організації - нижній рівень. Засоби сторінкової організації можуть бути як включені, так і вимкнені (за рахунок установки
певного біта в керуючому регістрі процесора), і залежно від цього змінюється сенс перетворення віртуального адреси, яке виконують засоби
сегментації. Спочатку розглянемо випадок роботи засобів сегментації при відключеному механізмі управління сторінками. p>
p>
Рис. 2.19. Підтримка сегментів h2>
На малюнку 2.19 показано віртуальний адресний простір процесора i386 при відключеному механізмі управління сторінками. 32-бітне зміщення визначає
розмір віртуального сегмента в 232 = 4 Гб, а кількість сегментів визначається розміром поля, відведеного в сегментному регістрі під номер сегмента.
На малюнку 2.20, а показана структура даних в сегментному регістрі. Ця структура називається селектором, тому що призначена для вибору дескриптора
певного сегмента з таблиць дескрипторів сегментів. Дескриптор сегмента описує всі характеристики сегмента, необхідні для перевірки правильності
доступу до нього і його перебування у фізичному адресному просторі. Процесор i386 підтримує дві таблиці дескрипторів сегментів - глобальну (Global
Descriptor Table, GDT) і локальну (Local Descriptor Table, LDT). Глобальна таблиця призначена для опису сегментів операційної системи і сегментів
межзадачного взаємодії, тобто сегментів, які в принципі можуть використовуватися всіма процесами, а локальна таблиця - для окремих сегментів
завдань. Таблиця GDT один, а таблиць LDT повинно бути стільки, скільки в системі виконується завдань. При цьому активною в кожний момент часу може бути тільки
одна з таблиць LDT. p>
p>
Рис. 2.20. Формати селектора і дескрипторів даних та коду:
а - формат селектора; б - формат регістра GDTR;
в - формат дескриптора сегмента даних або коду p>
З малюнку 2.20 видно, що селектор складається з трьох полів - 13-бітного поля індексу (номера сегмента) у таблицях GDT і LDT, 1-бітного поля - вказівника типу
використовуваної таблиці дескрипторів і двухбітного поля поточних прав доступу завдання - CPL. Розрядність поля індексу визначає максимальне число глобальних
і локальних сегментів завдання - по 8K (213) сегментів кожного типу, всього 16 K. З урахуванням максимального розміру сегмента - 4 Гб - кожна завдання
при чисто сегментної організації віртуальної пам'яті працює у віртуальному адресному просторі в 64 Тбайт. p>
Тепер простежимо, як віртуальний простір відображається на фізичний простір розміром в 4 Гб при чисто сегментному механізмі відображення.
Отже, коли завданні необхідно отримати доступ до осередку фізичної пам'яті, то для вибору дескриптора віртуального сегмента використовується значення селектора з
відповідного (в залежності від команди і стадії її виконання - вибірка коду команди або даних) сегментного регістра процесора. Значення поля типу
таблиці вказує на те, яку таблицю потрібно використовувати - GDT чи LDT. Розглянемо спочатку випадок використання таблиці GDT. Для збереження таблиць GDT і
LDT використовується оперативна пам'ять (використання швидкої асоціативної пам'яті процесора для зберігання елементів цих таблиць розглянемо пізніше). Для того,
щоб процесор зміг знайти у фізичній пам'яті таблицю GDT, її повний 32-бітний фізичну адресу (адреса початку таблиці), а також розмір (поле в 16 біт)
зберігаються в спеціальному регістрі процесора GDTR (рисунок 2.20, б). Кожен дескриптор у таблицях GDT і LDT має розмір 8 байт, тому максимальний
розмір цих таблиць - 64 К (8 (8 До дескрипторів). Для отримання потрібного дескриптора з таблиці процесор складає базовий адреса таблиці GDT з
регістра GDTR з зрушеним на 3 розряду вліво (множення на 8, у відповідності з числом байтів в елементі таблиці GDT) значенням поля індексу з сегментного
регістра і отримує фізичний лінійний адресу потрібного дескриптора у фізичній пам'яті. Таблиця GDT постійно присутня у фізичній пам'яті, тому
процесор витягує за цією адресою потрібний дескриптор сегменту і поміщає його у внутрішній (програмно недоступний) регістр процесора. (Таких регістрів
шість і кожен з них відповідає певному сегментному регістру, що значно прискорює роботу процесора). p>
Дескриптор віртуального сегмента (рисунок 2.20, в) складається з декількох полів, основними з яких є поле бази - базового 32-розрядного
фізичної адреси початку сегменту, поле розміру сегменту і поле прав доступу до сегмента - DPL (Descriptor Privilege Level). Спочатку процесор визначає
правильність адреси, порівнюючи зміщення і розмір сегмента (у разі виходу за межі сегменту відбувається переривання типу виняток - exсeption). Потім
процесор перевіряє права доступу завдання до даного сегменту, порівнюючи значення полів CPL селектора і DPL дескриптора сегмента. У процесорі i386 мандатної
спосіб визначення прав доступу (званий також механізмом кілець захисту), при якому є кілька рівнів прав доступу, і об'єкти будь-якого рівня мають
доступ до всіх об'єктів однакового рівня або більш низьких рівнів, але не має доступу до об'єктів більш високих рівнів. У процесорі i386 існує чотири
рівня прав доступу - від 0-го, який є найвищим, до 3-го - найнижчого. Очевидно, що операційна система може використовувати механізм рівнів
захисту на свій розсуд. Однак передбачається, що нульовий рівень буде використаний для ядра операційної системи, а третій рівень - для прикладних
програм, проміжні рівні - для утиліт і підсистем операційної системи, менш привілейованих, ніж ядро. p>
Таким чином, доступ до віртуального сегменту вважається законним, якщо рівень прав селектора CPL вище або дорівнює рівню прав сегмента DPL (CPL (DPL).
При порушенні прав доступу відбувається переривання, як і у випадку недотримання меж сегменту. Далі перевіряється наявність сегмента у фізичній пам'яті по
значенням біта P дескриптора, і якщо сегмент відсутній у фізичній пам'яті, то відбувається переривання. За наявності сегмента в пам'яті обчислюється фізичний
лінійний адреса шляхом складання бази сегмента і зміщення і виробляється доступ до елемента фізичної пам'яті за цією адресою. p>
У випадку, коли селектор вказує на таблицю LDT, віртуальний адреса перетворюється у фізичний аналогічним чином, але для доступу до самої таблиці
LDT додається ще один етап, тому що в процесорі регістр LDTR вказує на розміщення таблиці LDT не прямо, а опосередковано. Сам регістр LDTR має розмір 16
біт і містить селектор дескриптора таблиці GDT, який описує розташування цієї таблиці у фізичній пам'яті. Тому при доступі до елемента фізичної
пам'яті через таблицю LDT відбувається дворазове перетворення віртуальної адреси в фізичний, причому обидва рази по описаній вище схемі. Спочатку по
значенню селектора LDTR визначається фізичну адресу дескриптора з таблиці GDT, що описує початок розташування таблиці LDT у фізичній пам'яті, а потім
за допомогою селектора завдання обчислюється зсув в таблиці LDT і визначається фізичну адресу потрібного дескриптора. Далі процес аналогічний перетворенню
віртуального адреси за допомогою таблиці GDT. p>
p>
Рис. 2.21. Типи дескрипторів h2>
Дескриптор сегмента містить ще кілька полів. Однобітних полі G визначає одиницю вимірювання розміру сегменту, при G = 0 розмір визначається в
байтах, і тоді сегмент не може бути більше 64 К, а при G = 1 розмір визначається в 4К-байтних сторінках, при цьому максимальний розмір сегмента
досягає зазначених 4 Гбайт. Поле D визначає тип адресації сегменти: при D = 0 сегмент є 16-бітним (для режиму емуляції 16-бітових процесорів i86 і
i286), а при D = 1 сегмент є 32-бітним. Крім цього в дескриптор є поле типу сегмента, яке в свою чергу ділиться на декілька полів
(малюнок 2.21). Поле S визначає, чи є сегмент системним (S = 1) або користувача (S = 0). У свою чергу користувацькі сегменти поділяються на
сегменти даних (E = 0) і сегменти коду (E = 1). Для сегменту даних визначаються однобітних поля: p>
ED b> - напрямки розповсюдження сегмента (ED = 0 для звичайного сегмента даних, що поширюється в бік збільшення адрес, ED = 1 для
стекові сегмента даних, що поширюється в бік зменшення адрес), p>
W b> - поле дозволу запису в сегмент (при W = 1 запис дозволена, при W = 0 - заборонена), p>
A b> - поле доступу до сегмента (1 означає, що після очищення цього поля до сегмента було звернення з читання або запису, це поле може використовуватися
операційною системою в її стратегії заміни сторінок в оперативній пам'яті). p>
Для сегменту коду використовуються однобітних ознаки: p>
A b> - має сенс, аналогічний полю A сегмента даних, p>
R b> - дозволяє або забороняє читання з кодового сегмента, p>
C b> - біт підпорядкування, дозволяє або забороняє виклик даного кодового сегмента з іншого кодового сегмента з більш низькими правами доступу. p>
У процесорі i386 існує велика кількість системних сегментів, до яких зокрема відносяться системні сегменти типу LDT, шлюзи виклику
підпрограм і задач і сегменти стану задачі TSS. p>
Таким чином, для використання чисто сегментного механізму процесора i386 операційній системі необхідно сформувати таблиці GDT і LDT, завантажити їх у
пам'ять (для початку достатньо завантажити тільки таблицю GDT), завантажити покажчики на ці таблиці в регістри GDTR і LDTR і вимкнути сторінкову
підтримку. Якщо ж операційна система не хоче використовувати сегментну організацію віртуальної пам'яті, то їй достатньо створити таблицю дескрипторів
з одного входу (дескриптора) і завантажити базові значення сегмента в дескриптор. Віртуальне адресний простір завдання буде складатися з одного
сегмента довжиною максимум в 4 Гбайт. p>
Сегментно-сторінковий механізм
Коли системі управління сторінками працює як описаний вище сегментний механізм, так і механізм управління сторінками, однак при цьому
сенс роботи сегментного механізму змінюється. У цьому випадку віртуальний адресний простір завдання має розмір в 4 Гб, в якому розміщуються всі сегменти
(малюнок 2.22). Як і раніше селектор завдання визначає номер віртуального сегмента, а зсув в команді завдання - зміщення всередині цього сегменту. Так як
тепер всі сегменти розділяють один адресний простір, то можливо їх накладення, але процесор не контролює такі ситуації, залишаючи цю проблему
операційній системі. Перший етап перетворення віртуального адреси, пов'язаний з перетворенням зміщення і селектора з використанням таблиць GDT і LDT,
містять дескриптори сегментів, в точності збігається з етапом перетворення цих даних при відключеному механізмі управління сторінками. Всі структури
даних цих таблиць такі ж. Однак, якщо раніше дескриптор сегмента містив його базовий адреса в фізичному адресному просторі, і при складанні його з
зміщенням з команди програми виходив лінійний шуканий адреса у фізичній пам'яті, то тепер дескриптор містить базова адреса сегмента у віртуальному
адресному просторі. Тому в результаті його складання із зсувом виходить лінійний віртуальну адресу, котру на другому етапі (сторінковому)
перетвориться в номер фізичної сторінки. Для реалізації механізму управління сторінками як фізичний, так і віртуальний адресний простору розбиті на
сторінки розміром 4 К. Загалом в цих адресних просторах налічується 1 М сторінок. Незважаючи на наявність декількох віртуальних сегментів, все віртуальне
адресний простір завдання має загальне розбивка на сторінки, так що нумерація віртуальних сторінок наскрізна. p>
Лінійний віртуальну адресу містить у своїх старших 20 розрядах номер віртуальної сторінки, а в молодших 12 розрядах зміщення всередині сторінки. Для
відображення віртуальної сторінки у фізичну досить побудувати таблицю сторінок, кожен елемент якої - дескриптор віртуальної сторінки - містив би
номер відповідної їй фізичної сторінки і її атрибути. У процесорі i386 так і зроблено, і структура дескриптора сторінки показано на малюнку 2.23. 20-ти
розрядів номера сторінки достатньо для визначення фізичної адреси початку сторінки, тому що при її фіксованому розмірі 4 До молодші 12 розрядів цієї адреси
завжди дорівнюють нулю. Дескриптор сторінки також містить наступні поля, близькі за змістом відповідних полях дескриптора сегменти: p>
P b> - біт присутності сторінки у фізичній пам'яті, p>
W b> - біт дозволу запису в сторінку, p>
U b> - біт користувач/супервізор p>
A b> - ознака того, чи був доступ до сторінки, p>
D b> - ознака модифікації вмісту сторінки, p>
PWT b> і PCD b> - керують механізмом кешування сторінок (введені, починаючи з процесора i486), p>
AVL b> - резерв для потреб операційної системи (available for use). p>
p>
Рис. 2.22. Сегментно-сторінковий механізм h2>
p>
Рис. 2.23. Формат дескриптора сторінки h2>
При невеликому розмірі сторінки процесора i386 щодо розмірів адресних просторів, таблиця сторінок повинна займати в пам'яті вельми
значне місце - 4 байти (1М = 4 Мбайта. Це занадто багато для нинішніх моделей персональних комп'ютерів, тому в процесорі i386 використовується
поділ всієї таблиці сторінок на розділи за 1024 дескриптора. Розмір розділу обраний так, щоб один розділ займав одну фізичну сторінку (1024 (4 байти = 4
Кбайта). Всього виходить 1024 розділу (1024 (1024 = 1М). Для того, щоб не зберігати всі розділи таблиці сторінок одночасно у фізичній пам'яті,
іспользуетс?? каталог розділів таблиці сторінок, що використовує такі ж за структурою дескриптори сторінок, що і в таблиці сторінок. Тому для зберігання
інформації про дескрипторах 1024 розділів необхідна пам'ять 4 К, тобто одна фізична сторінка. Сукупність дескрипторів, що описують стан і
характеристики віртуальних сторінок розділів таблиці сторінок, називається каталогом розділів або таблиць. Віртуальна сторінка, що зберігає вміст
каталогу, завжди знаходиться у фізичній пам'яті, і номер її фізичної сторінки зазначений у спеціальному керуючому регістрі CR3 процесора (точніше, в одному з
полів цього регістра). p>
Перетворення лінійного віртуального адреси у фізичний відбувається наступним чином (малюнок 2.24). Поле номера віртуальної сторінки (старші 20
розрядів) ділиться на дві рівні частини по 10 розрядів - поле номера розділу і поле номера сторінки в розділі. За допомогою номера фізичної сторінки, що зберігає
каталог та зміщення в цій сторінці, що задається полем номера розділу, процесор знаходить дескриптор віртуальної сторінки розділу. У відповідності з атрибутами
цього дескриптора визначаються права доступу до цієї сторінки, а також наявність її у фізичній пам'яті. У разі її відсутності відбувається сторінкове
переривання, і операційна система повинна в цьому випадку перемістити її в пам'ять. Після того, як потрібна сторінка знаходиться в пам'яті, для визначення адреси
елемента даних використовується зміщення, яке визначається полем номера сторінки лінійного віртуального адреси. p>
Таким чином, під час доступу до сторінки в процесорі використовується дворівнева
схема адресації сторінок, що уповільнює перетворення, але дозволяє використовувати сторінковий механізм і для зберігання самої таблиці сторінок, і
суттєво зменшити обсяг фізичної пам'яті для її зберігання. Для прискорення сторінкових перетворень в блоці керування сторінками використовується
асоціативна пам'ять, в якій кешується 32 комбінації "номер віртуальної сторінки - номер фізичної сторінки". Ця спеціальна
кеш-пам'ять (додаткова по відношенню до 8 Кбайтному кешу даних процесорів i486 і Pentium) значно прискорює перетворення адрес, тому що у випадку
попадання в кеш тривалий процес, описаний вище, виключається. p>
p>
Рис. 2.24. Перетворення лінійного віртуального адреси в фізичну адресу h2>
Організація віртуальної пам'яті в процесорі i386 дозволяє захистити адресні простору різних процесів за рахунок двох механізмів: p>
Ізоляція адресних просторів процесів у фізичній пам'яті шляхом
призначення їм різних фізичних сторінок або сегментів (якщо сторінковий
механізм відключений).
Захист сегментів від несанкціонованого доступу за допомогою
привілеїв чотирьох рівнів.
Засоби виклику підпрограм і задач
Операційна система, як однозадачная, так і багатозадачна, повинна надавати завданням засоби виклику підпрограм операційної системи,
бібліотечних підпрограм, а також мати кошти для запуску завдань, а при багатозадачного роботі засоби швидкого переходу з задачі на задачу. Виклик
підпрограми відрізняється від запуску завдання тим, що в першому випадку адресний простір залишається тим же (таблиця LDT залишається колишньою), а при виклику
завдання адресний простір повністю змінюється. p>
Виклик підпрограм без зміни кодового сегмента в захищеному режимі процесора i386 проводиться аналогічно виклику в реальному режимі за допомогою команд JMP і
CALL. p>
Для виклику підпрограми, код якої знаходиться в іншому сегменті (який може належати бібліотеці, іншої задачі або операційній системі),
процесор i386 надає 2 варіанти виклику, причому обидва використовують захист за допомогою прав доступу. p>
Перший спосіб полягає у безпосередньому вказівці в поле команди JMP або CALL селектора сегмента, що містить код викликається підпрограми, а також
зсув у цьому сегменті адреси початку підпрограми. p>
p>
Рис. 2.25. Безпосередній виклик підпрограми h2>
Схема такого виклику наведена на малюнку 2.25. Тут і далі показаний тільки етап отримання лінійного адреси у віртуальному просторі, а наступний етап
(мається на увазі, що механізм підтримки сторінок включений) перетворення цієї адреси в номер фізичної сторінки пропущено, тому що він не містить нічого
специфічного у порівнянні з доступом до сегмента даних, розглянутому вище. Дозвіл виклику відбувається в залежності від значення поля C в дескриптор
сегмента викликається коду. При C = 0 викликається сегмент не вважається підлеглим, і виклик дозволяється, тільки якщо рівень прав викликає коду не менше рівня
прав викликається сегмента. При C = 1 викликається сегмент вважається підлеглим і допускає виклик з коду з будь-яким рівнем прав доступу, але при виконанні
підпрограма наділяється рівнем прав викликав коду. p>
p>
Рис. 2.26. Формат дескриптора шлюзу виклику підпрограми h2>
p>
Рис. 2.27. Виклик підпрограми через шлюз виклику h2>
Очевидно, що перший спосіб непридатний для виконання функцій операційної системи, що має звичайно нульовий рівень прав, з призначеної для користувача програми,
яка працює, як правило, на третьому рівні. Тому процесор i386 надає інший спосіб виклику підпрограм, заснований на тому, що заздалегідь
визначається набір точок входу в привілейовані кодові сегменти, і ці точки входу описуються за допомогою спеціальних дескрипторів - дескрипторів
шлюзів виклику підпрограм. Цей дескриптор належить до системних дескриптора, і його структура відрізняється від структури дескрипторів сегментів
коду і даних (малюнок 2.26). Схема його використання наведена на малюнку 2.27. Селектор з поля команди CALL використовується для вказівки на дескриптор
шлюзу виклику підпрограми в таблицях GDT чи LDT. Для використання цього дескриптора викликає код повинен мати не менший рівень прав, ніж дескриптор,
але якщо дескриптор шлюзу доступний, то він може вказувати на дескриптор сегмента викликається коду, що має більш високий рівень, ніж має шлюз, і дзвінок, коли
це відбудеться. При визначенні адреси входу в викликається сегменті зміщення з поля команди CALL не використовується, а використовується зміщення з дескриптора
шлюзу, що не дає можливості завдання самій визначати точку входу в захищений кодовий сегмент. p>
Коли Ви робите кодів, що володіють різними рівнями привілеїв, виникає проблема передачі параметрів між різними стеками, тому що для надійного
захисту завдання різного рівня привілеїв мають різні сегменти стеків. Селектори цих сегментів зберігаються в контексті завдання - сегменті TSS (Task State
Segment). Якщо викликається підпрограма, яка має інший рівень привілеїв, то з поточного стека в стек рівня доступу викликається сегмента копіюється стільки
32-розрядних слів, скільки вказано в полі лічильника слів дескриптора шлюзу. p>
Структура сегмента TSS задачі наведена на малюнку 2.28. Контекст завдання повинен
містити всі дані для того, щоб можна було відновити виконання перерваної в довільний момент часу завдання, тобто значення регістрів
процесора, покажчики на відкриті файли і деякі інші, що залежать від операційної системи, змінні. Швидкість перемикання контексту в
значній мірі впливає на швидкісні якості багатозадачного операційної системи. Процесор i386 виробляє апаратне перемикання контексту завдання,
що зберігається в сегменті TSS. Як видно з малюнка, сегмент TSS має фіксовані поля, відведені для значень регістрів процесора, як
універсальних, так і деяких керуючих (наприклад LDTR і CR3). Для опису можливостей доступу завдання до портів введення-виведення процесор використовує в
захищеному режимі поле IOPL (Input/Output Privilege Level) у своєму регістрі EFLAGS і карту бітових полів доступу до портів. Для отримання можливості
виконувати команди введення-виведення виконуваний код повинен мати рівень прав не нижче значення поля IOPL. Якщо ж ця умова дотримується, то можливість
доступу до порту з конкретною адресою визначається значенням відповідного біта в карті введення-виведення сегмента TSS (карта складається з 64 Кбіт для опису
доступу до 65536 портів). p>
Бітова карта введення/виводу (БКВВ)
(
(8 Кбайт
Додаткова інформація ОС
Відносний адреса БККВ
0
. . . b> 0 T 64
0
. . . b>
0
Селектор LDT
60
0
. . . b>
0
GS 5C
0
. . . b>
0
FS 58
0
. . . b>
0
DS 54
0
. . . b>
0
SS 50
0
. . . b>
0
CS 4C
0
. . . b>
0
ES 48
EDI
44
ESI
40
EBP
3C
ESP
38
EBX
34
EDX
30
ECX
2C
EAX
28
EFLAGS
24
EIP
20
CR3
1C
0
. . . b>
0
SS рівня 2
18
ESP2
14
0
. . . b>
0
SS рівня 1
10
ESP1
C
0
. . . b>
0
SS рівня 0
8
ESP0
4
0
. . . b>
0
Селектор TSS повернення
0
Рис. 2.28. Структура сегмента TSS h2>
Крім цього, сегмент TSS може включати додаткову інформацію, необхідну для роботи завдання і залежить від конкретної операційної системи
(наприклад, покажчики відкритих файлів або покажчики на іменовані конвеєри мережевого обміну). Включення в цей сегмент інформація автоматично замінюється
процесором при виконанні команди CALL, селектор якої вказує на дескриптор сегмента TSS в таблиці GDT (дескриптори цього типу можуть бути
розташовані тільки в цій таблиці). Формат дескриптора сегмента TSS аналогічний формату дескриптора сегменту даних. p>
p>
Рис. 2.29. Безпосередній виклик завдання h2>
Як і у разі виклику підпрограм, є дві можливості виклику завдання - безпосередній виклик через вказівку селектора сегмента TSS потрібної завдання в
полі команди CALL і непрямий виклик через шлюз виклику завдання. Як і при виклику підпрограм, безпосередній виклик можливий тільки у випадку, якщо викликає
код володіє рівнем привілеїв, не меншим, ніж викликається завдання. Коли Ви робите через шлюз (який може розташовуватися і в таблиці LDT) достатньо лише мати права
доступу до шлюзу. Безпосередній виклик завдання показаний на малюнку 2.29. При перемиканні задач процесор виконує наступні дії: p>
1) Виконується команда CALL, селектор якої вказує на дескриптор сегмента типу TSS. p>
2) У TSS поточного завдання зберігаються значення регістрів процесора. На даний сегмент TSS вказує регістр процесора TR, що містить селектор
сегмента. p>
3) У TR завантажується селектор сегмента TSS задачі, на яку перемикається процесор. p>
4) З нового TSS в регістр LDTR переноситься значення селектора таблиці LDT в таблиці GDT завдання. p>
5) Відновлюються значення регістрів процесора (з відповідних полів нового сегменту TSS). p>
6) У полі селектора повернення заноситься селектор сегмента TSS знімається з виконання завдання для організації повернення до перерваного завдання в майбутньому. p>
Виклик завдання через шлюз відбувається аналогічно, додається лише етап пошуку дескриптора сегмента TSS по значенню селектора дескриптора шлюзу виклику.
p>
Використання всіх можливостей, що надаються процесорами Intel 80386, 80486 і Pentium, дозволяє організувати операційній системі високонадійну
багатозадачного середовища. p>