1.3 Програмна модель мікропроцесорів


Регістри

Регістри загального призначення.

Для виконання обчислень і адресація процесори мають 8 регістрів загального призначення. В процесорах 8086/88 і 80286 ці регістри мають розрядність 16 біт. Регістри АХ, ВХ, DX і СХ припускають звертання як до всього регістру, так і до їхніх молодших і старших частин. Регістри SP, BP, SI і DI припускають звертання тільки до всього регістру. В 32-розрядних процесорах всі ці регістри мають 32 розряди і містять в молодшій частині регістри попередніх процесорів. Імена 32-разрядных регістрів починаються з символу “Е” ((ЕАХ, ЕВХ і т. Д.). Кожний регістр має своє призначення, але як правило може використовуватися і в інший ролі.

(Е) АХ - аккумулятор;

(Е) СХ - лічильник;

(Е) DX - регістр даних;

(Е) ВХ - регістр базової адреси;

(Е) SP - покажчик стека;

(Е) ВР - додатковий покажчик стека;

(Е) SI - індекс операнда-джерела;

(E) DI - індекс операнда-приймальника;

В 16-разрядных процесорах для адресації застосовуються регістри ВХ, ВР, SI і DI в різноманітних комбінаціях, причому регістри ВХ і ВР містять базову адресу, а SI і DI - індекс. В 32-розрядних процесорах в якості базового або індексного може виступати будь-який регістр.

Сегментні регістри.

Для надання гнучкості програмам в процесорах є сегментні регістри. Адресація пам'яті завжди виконується відносно якого-небудь сегменту, параметри якого зберігаються в сегментном регістрі. В процесорі 8086/88 є 4 16-разрядных сегментних регістра, що зберігають сегментну адресу. У разі звертання до операнду в пам'яті формується його лінійна адреса шляхом підсумовування зміщення операнда в сегменті з сегментною адресою, зсунутою на 4 розряди ліворуч. В підсумку одержується 20-розрядна лінійна адреса, по якій процесор виробляє вибірку. В процесорі 8086/88 не застосовується жодний захист пам'яті, тому до всіх сегментів розв'язаний доступ як по запису так і по читанню. Сегмент може розташуватися по будь-якій адресі кратній 16 і має розмір 64 Кб. Кожному сегментному регістру відведена своя роль.

DS - сегмент даних;

CS - сегмент коду;

SS - сегмент стека;

ES - додатковий сегмент даних.

При адресації даних за замовчанням завжди застосовується регістр DS, однак додавши перед командою відповідний префікс, можна звернутися до будь-якого сегменту.

Процесор 80286 підтримує захист пам'яті, тому його сегментні регістри були істотно перероблені і доповнені. Тепер сегментний регістр перебує з двох основних частин:

Селекторна частина в режимі реальних адрес містить сегментну адресу, а в захищеному режимі - селектор сегменту, індикатор дескрипторнї таблиці і пріоритет запитання. Має 16 розрядів і відповідає сегментному регістру процесора 8086/88 в усіх операціях по завантаженню/вивантаженню;

Дескрипторна частина містить базову лінійну адресу (24 розряди) початку сегменту, розмір (16 розрядів) і атрибути.

Формування лінійної адреси операнда зводиться до підсумовування зміщення з базовою лінійною адресою сегменту з відповідної дескрипторной частини. В режимі реальних адрес при завантаженні сегментного регістру значення сегментної адреси зсувається ліворуч на 4 розряди і записується в поле базової адреси. Розмір сегменту встановлюється рівним 64 Кб, а атрибути дозволяють використати сегмент як для запису так і для читання. В захищеному режимі вся дескрипторна частина завантажується з таблиці дескрипторів в відповідності з селектором. В будь-якому режимі розмір сегменту не перевищує 64 Кб.

В 32-розрядних процесорах була доопрацьована дескрипторна частина сегментних регістрів. Поле базової лінійної адреси поширене до 32 розрядів, поле розміру сегменту поширене до 20 розрядів. В атрибутах з'явилося два нових біти: біт розрядності сегменту і біт дрібності (дрібніше ці біти будуть описані в розділі, присвяченому захищеному режиму). Крім того з'явилося два нових сегментних регістра FS і GS. Вони використовуються наряду з регістрами DS і ES для зберігання параметрів сегментів даних.

Регістр прапорів.

Регістр прапорів використовується для зберігання результатів арифметичних операцій і керування процесором. В процесорах 8086/88 і 80286 регістр прапорів має 16 розрядів.



Призначення прапорів наступне:

CF - прапор перенесення;

PF - прапор паритету;

AF - прапор половинного перенесення;

ZF - прапор нуля;

SF - прапор знаку;

TF - прапор трасировки;

IF - прапор переривання;

DF - прапор направлення;

OF - прапор переповнення.

Прапори CF, PF, AF, ZF, SF і OF відображають результат виконання арифметичної операції і використовуються для організації ветвленнь в програмах шляхом виконання переходу при певному стані якого-або прапора.

Настанова прапора TF наводить до того, що після виконання кожної інструкції процесор буде генерувати переривання 1. Скид прапора IF призведе до забороні обробки апаратних перериваннь, що маскуються. Прапор DF вказує направлення при виконанні строковых команд.

В процесорі 80286 додалися два нових поля, що використовуються в захищеному режимі.

Прапор NT (біт 14) задає поведінку команди IRET (повернення з переривання), якщо він скинут, адреса повернення буде вибиратися з стека, а якщо встановлен - відбудеться переключення задачі. Даний прапор встановлюється всякий раз, коли відбувається переключення задачі шляхом виконання команд передачі керування або виклика переривання і скидається при поверненні до попередньої задачі шляхом виконання команди IRET. Все описане вище відноситься тільки до захищеного режиму.

Поле IOPL (біти 13-12) задає рівень привілей введення-виведення. Команда введення-виведення буде виконана тільки якщо значення в цьому полі чисельно більше значення поточного рівня пріоритету. Дане поле також має сенс тільки в захищеному режимі.

В процесорі 80386 регістр прапорів поширений до 32 розрядів і містить два нових прапора:

RF (біт 16) - прапор поновлення, використовується спільно з регістрами крапок останова;

VM (біт 17) - прапор виртуальної машини. В захищений режим 32-разрядных процесорів введений новий подрежим. Настанова даного прапора наводить до того, що формування лінійної адреси в захищеному режимі здійснюється також, як і в режимі реальних адрес, але при цьому зберігається робота механізму захисту задач і введення-виведення.

В процесор 80486 був доданий тільки один новий прапор - AC (біт 18). Настанова цього прапора наводить до включення механізму контролю за вирівнюванням операндів.

В останніх моделях 80486, а також в процесорах Pentium з'явилися три нових прапора:

ID (біт 21) - якщо вдається встановити цей прапор, значить процесор підтримує команду CPUID, що закликана повідомляти програмі користувача інформацію про процесор;

VIP (біт 20) - віртуальне запитання переривання;

VIF (біт 19) - віртуальний прапор переривання.

В процесорах Pentium Pro і Pentium II регістр прапорів не змінився у порівнянні з процесорами Pentium.

Системні регістри.

Системні регістри передвизначені для завдання режимів роботи процесора, а також для зберігання покажчиків на системні області даних.

В процесорі 8086/88 є тільки один регістр, що можна лічити системним. Це регістр покажчика команд IP. Даний регістр має 16 розрядів і містить зміщення наступної команди в сегменті коду. Програма не може напряму працювати з цим регістром, однак виконуючи переходи, вона побічним образом змінює вміст регістру IP.

В процесорі 80286 в зв'язку з підтримкою захищеного режиму був введений цілий ряд системних регістрів для зберігання покажчиків на системні області пам'яті і керування процесором.

Регістр GDTR зберігає покажчик на таблицю глобальних дескрипторів і її розмір. Має два поля: поле лінійної адреси початку таблиць (24 біти) і поле розміру таблиці (16 біт). Доступ до цього регістру здійснюється з допомогою команд LGDT і SGDT для завантаження і збереження вмісту регістру відповідно.

Регістр IDTR по внутрішньому формату відповідає регістру GDTR і зберігає покажчик і довжину таблиці перериваннь. В попередньому процесорі таблиця перериваннь завжди розташувалася в початку фізичної пам'яті. В процесорі 80286 вона може розташуватися в будь-якому місці пам'яті.

Регістр LDTR по внутрішньому формату нагадує сегментний регістр і зберігає базову адресу, розмір і атрибути локальної дескрипторної таблиці.

Регістр TR по внутрішньому формату нагадує сегментний регістр і зберігає базову адресу, розмір і атрибути сегменту стану поточної задачі.

Регістр MSW - слово стану машини. Має 16 розрядів і містить чотири прапора:

PE (біт 0) - дозвіл захисту. Настанова цього прапора переводить процесор в захищений режим, повернення в реальний режим можливе тільки по сигналу RESET;

MP (біт 1) - моніторінг сопроцесора, дозволяє викликати виключення 7 по кожній команді WAIT;

EM (біт 2) - емуляція сопроцесора. Настанова цього прапора викликає появу виключення 7 при кожній команді, стосовній до сопроцесору, що дозволяє здійснювати його програмну емуляцію.

TS (біт 3) - переключення задач. Встановлюється процесором після кожного переключення задачі. Скидається командою CLTS. При встановленому прапорі, команда, стосовна до сопроцесору, викличе виключення 7, що дозволяє програмно визначити, відноситься чи контекст сопроцесора до поточної задачі.

Починаючи з процесора 386 змінилася розрядність полів системних регістрів. Так поле базової адреси регістрів GDTR, IDTR, LDTR і TR поширилося до 32 розрядів. Регістр MSW поширився до 32 розрядів і називається тепер CR0. В ньому з'явилися нові прапори:

WP (біт 16) дозвіл захисту від запису на рівні привілей супервізора в сторінки тільки для читання;

PG (біт 31) включення механізму трансляції сторінок.

В зв'язку з підтримкою механізму трансляції сторінок з'явилися також два нових регістри: CR2 - містить 32-битну лінійну адресу, по якій була отримана остання відмова сторінки пам'яті і CR3, старші 20 розрядів якого зберігають фізичну адресу каталога сторінок.

В процесорі 80486 регістр CR0 був доповнений декількома новими прапорами:

ET (біт 4) - індикатор підтримки інструкцій математичного сопроцесора;

NE (біт 5) - дозвіл стандартного (для Intel) механізму повідомлення про помилку FPU через генерацію виключення. При NE=0 і активному сигналі IGNNE# помилки FPU ігноруються. При NE=0 і пасивному сигналі IGNNE# при виникненні помилки FPU процесор зупиняється і чекає переривання, вводимого зовнішньою логікою по сигналу на висновку FERR#. Таким чином емулюється обробка помилок FPU, прийнята в РС зі часів сопроцесорів 80287 і 80387;

AM (біт 18) - дозвіл контролю вирівнювання (контроль виконується тільки на рівні привілей 3 при АМ=1 і прапорі АС=1);

NW (біт 29) - заборона наскрізна запису кеша і циклів анулювання;

CD (біт 30) - заборона заповнення кеша (кеш-попадания в раніше заповнені рядки при цьому не забороняються).

В регістр CR3 були додані два нових б: PCD (б 4) - заборона кешування і PWT (б 3) - кешування сторінки зі наскрізним записом.

В останні моделі 80486 і процесори Pentium був доданий регістр CR4, що містить біти дозволу архітектурних рішень. В даному регістрі визначені наступні біти:

VME (біт 0) - дозвіл механізму віртуальних перериваннь;

PVI (біт 1) - дозвіл використання віртуального прапора перериваннь в захищеному режимі;

TSD (біт 2) - перетворення інструкції RDTSC в привілейовану (тільки Pentiun+);

DE (біт 3) - дозвіл крапок останова по звертанню до портів введення-виведення;

PSE (біт 4) - дозвіл сторінок розміром 4 Мб (тільки Penium+);

PAE (біт 5) - дозвіл 36-розрядної фізичної адреси (тільки Pentium Pro+).


Захищений режим

Сегментація пам'яті.

Захищений режим почав вперше підтримуватися процесором 80286. Наступні процесори тільки доповнювали режим новими можливостями, але основні поняття і механізми залишилися.

При роботі процесора в захищеному режимі кожний з сегментів команд, даних, стека характеризується відповідними атрибутами, що визначають локалізацію даного сегменту в адресном просторі пам'яті і правила звертання до нього. Атрибути сегменту уявлені в вигляді 8-байтной структури даних, що називається дескриптором.

Дескриптори сегментів зберігаються в пам'яті масивів даних, що сформувалися в вигляді таблиць. Процесор використає три типу таблиць дескрипторів: GDT - глобальна таблиця дескрипторів; LDT - локальна таблиця дескрипторів; IDT - таблиця дескрипторів перериваннь.

Таблиця GDT містить будь-які типи дескрипторів, окрім тих, що використаються при обробці перериваннь. В GDT заносяться дескриптори сегментів, що можуть використовуватися системою при виконанні різноманітних задач. Таблиці LDT містять дескриптори сегментів, що використаються при рішенні поточної задачі. Кількість таблиць, що створюються LDT визначається операційною системою і залежить від числа задач, що реалізуються. В принципі кожна задача може мати окрему LDT, що включає дескриптори сегментів, що використаються при її рішенні. Крім того, LDT можуть містити спеціальні дескриптори шлюзів - крапок входу в програми або задачі. В випадку спільного використання сегментів таблиці LDT можуть повністю або частково перекривати друг друга. Таблиця IDT використовується для реалізації перериваннь. Таблиці можуть мати розміри від 8 байт до 64 Кб, т. є. Містити до 8192 дескрипторів.

Звертання до необхідного дескриптору здійснюється з допомогою селектора, що міститься в відповідному сегментном регістрі. Селектор подає собою 16-разрядный покажчик, що має три поля (рисунок 1.13.).

Поле RPL (біти 1-0) визначає рівень привілей запитання. Це двухрозрядний код, що вказує допустимий рівень захисту сегменту, що може бути вибраний з допомогою даного селектора.



Поле TI (біт 2) служить індикатором таблиці. Його значення вказує таблицю, що вибирається: GDT при TI=0, LDT при TI=1.

Поле ІНДЕКС (біти 15-3) служить індексом для вибору одного з 8192 дескрипторів.

Селектор з нульовим значенням називається нуль-індикатором. Він забезпечує звертання до першого дескриптору в таблиці GDT. Цей дескриптор не використовується при роботі процесора, тому при його вибірці виконується переривання.

Кожна з таблиць має відповідний регістр: GDTR, LDTR, IDTR. Регістр GDTR містить 48 розрядів (40 в 80286), з яких 32 (24 в 80386) задають базову адресу таблиці, а 16 розрядів вказують її обсяг в байтах мінус 1. Якщо подставити в молодші 3 розряду селектора нулі, то отримається зміщення дескриптора в таблиці. Це зміщення порівнюється з межею таблиці. В випадку, якщо зміщення виходить за межі таблиці, виробляється виключення. Якщо порушення межі немає, зміщення підсумовується з базовою адресою таблиці, в результаті утвориться лінійна адреса дескриптора. Дана перевірка і наступне формування адреси справедливі для всіх таблиць.

Регістр LDTR містить 16-разрядный покажчик, що визначає розміщення в GDT дескриптора таблиці, що використається LDT. Дескриптор LDT містить 32-розрядний (24-розрядний в 80286) базову адресу таблиці і її 16-розрядний розмір, що при завантаженні регістру LDTR вибираються з GDT і зберігаються в внутрішніх програмно недосяжних регістрах процесора.

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

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



В процесорі 80286 біти 63-48 зарезервовані і повинні бути рівним нулю.

В поле “доп. Атрибути” присутнє 4 біти:

Біт дрібності G (біт 55) вказує, в яких одиницях заданий розмір сегменту: в байтах при G=0 або сторінках обсягом по 4 Кб при G=1. Таким чином, в процесорах 80386+ сегмент може мати розмір до 220*4Кб= 4Гб;

Біт розрядність D (біт 54). Даний біт має сенс тільки для сегментів коду і стека. Для сегменту коду він задає розрядність операндів і адреси за замовчанням. Для сегменту стека він задає розрядність осередків стека, при D=1 для стекових операцій використовується регістр ESP, і осередок стека має 32 розряди, т. є. Навіть при вталкуванні в стек 16-розрядного слова ESP зменшиться на 4;

Біт 53 передвизначений для майбутніх розширеннь і повинен містити 0;

Біт 52 не використовується.

Байт доступу дескриптора визначає права доступу до сегменту ,що вибирається. В залежності від вмісту сегменту байт доступу має різноманітні формати (малюнок 1.15), хоча призначення ряду полів залишається однаковим. Однакове призначення мають наступні поля:

Біт присутності Р визначає наявність відповідного сегменту в пам'яті. Якщо Р=0 (сегмент буде відстуній), те даний дескриптор не використовується для формування адрес. В цьому випадку вміст інших розрядів дескриптора може бути довільним. Якщо в регістр сегменту надходить селектор дескриптора, що є Р=0, те процесор генерує виключення “відсутність сегменту”. Обработчик даного виключення може підвантажити необхідний сегмент з диску;

Поле DPL вказує рівень привілей дескриптора. В залежності від співвідношення значень DPL, CPL (поточний рівень привілей) і RPL, що задається в молодших бітах селектора, дозволяється або забороняється звертання до даного сегменту. Таким чином забезпечується рівень ,що вимагається захисту сегменту;

Системний біт S визначає роль що вибирається дескриптора в системі. При S=1 дескриптор забезпечує звертання до сегментів кодів або даних. Дескрипторы, що є S=0, служать для звертання до таблиць LDT, сегментів TSS, або шлюзів для входу в інші задачі або програми, включаючи обработчики перериваннь. Такі дескриптори називаються системними.



Поле типу системного дескриптора визначає його тип. Типи системних дескрипторов наведені в таблиці 1.1.


Таблиця 1.1 Типи системних дескрипторов.


Тип Визначення Тип Визначення

0

1

2

3

Не використовується

Доступний TSS 286

Таблиця LDT

Зайнятий TSS 286

8

9

A

B

Не використовується

Доступний TSS 386+

Зарезервирован

Зайнятий TSS 386+

4

5

6

7

Шлюз виклика 286

Шлюз задачі

Шлюз перериваннь 286

Шлюз ловушки 286

C

D

E

F

Шлюз виклика 386+

Зарезервирован

Шлюз перериваннь 386+

Шлюз ловушки 386+


В процесорі 80286 доступні тільки типи з 0 по 7.

Можна виділити три основних класу системних дескрипторів.

Дескриптори таблиць LDT (тип 2) забезпечують звертання до локальної таблиці дескрипторів для вибору сегментів.

Дескрипторы сегментів TSS (типи 1 3 9 В) використовуються при переключенні задач в багатозадачному режимі. Біт 1 в байті доступу сегменту TSS пазиваеться бітом зайнятості і вказує, є чи задача, що викликається зайнятой. Цей біт дескриптора встановлюється в одиницю, коли процесор виконує виклик задачі, і скидається в нуль при виконанні повернення до попередньої задачі. Б зайнятості використовується для запобігання повторного виклика вже працюючої задачі. Переключення на зайняту задачу наводить до генерації виключення 13.

Відзначимо, що дескриптори LDT і TSS завжди повинні мати значення біта розрядності D=0.

Дескриптори шлюзів (типи 4-7, C, E, F) використовуються для звертання до програм і задач, а також при обробці перериваннь і ловушек.

Формати байта доступу для дескрипторів кодів і даних (S=1) показані на рисунку 1.15. Вони відрізняються значеннями б виконавчості Е: Е=1 для сегментів кодів і Е=0 для сегментів даних і стека.

Біт звертання А встановлюється в одиницю у разі звертання до сегменту т. є. При завантаженні відповідного дескриптора в сегментний регістр. Цей біт періодично перевіряється операційною системою, що реалізує віртуальну пам'ять, що таким чином виявляє незапитані сегменти, що є А=0. Сегменти, довгий час що залишаються незапитаними, виводяться з оперативної пам'яті на диск, звільняючи місце для інших сегментів.

Біт дозволу читання R вводиться для сегменту кодів і дозволяє при R=1 виробляти читання його вмісту. При R=0 допускається тільки вибірка вмісту цього сегменту для виконання через регістр CS. Спроба читання в цьому випадку викличе виключення 13. Відзначимо, що виключення цього типу виникне також при спробі запису в сегмент програм незалежно від значення біту R.

Біт підпорядкування З визначає додаткові правила звертання, що забезпечують захист сегментів програм.

Біт дозволу запису W вводиться для сегментів даних. Дозволяє при W=1 або забороняє при W=0 зміна вмісту цих сегментів. Читання з сегментів даних розв'язане завжди.

Біт направлення розширення ED визначає розміщення сегменту даних відносно базової адреси. При ED=0 (розширення вверх) дані в сегменті розміщуються в направленні зростання адрес від базової адреси до межі. При ED=1 (розширення вниз) дані в сегменті розташуються в направленні зменшення адрес. Таким чином, при розширенні вверх відносна адреса осередка сегменту повинна бути менш або рівна значенню розміру сегменту, при розширенні вниз відносна адреса повинна бути більше розміру сегменту.

Захист пам'яті.

Процесор має спеціальні засоби, що забезпечують в захищеному режимі захист пам'яті від несанкціонованого доступу. Для захисту інформації, що зберігається в сегментах пам'яті, використовується система привілей, що регулює доступ до того або іншого сегменту в залежності від рівня його захищеності і від ступеню важливості запитання. В процесорі встановлені чотири рівня привілей PL, що задаються номерами від 0 до 3. Найбільш привілейованим є рівень з меншим номером. Ступінь захищеності сегменту також має чотири рівня, що схематичні подаються в вигляді вкладених колець захисту (малюнок 1.16).



Відповідні рівні захищеності ілюструються на прикладі сегментів кодів. Наименее захищеними є програми користувача, для яких виділяється рівень з номером 3. Рівні з 0 по 2 відводяться для системних програм.

В відповідності з рівнями привілей і захищеності встановлені наступні правила доступу для сегментів кодів і даних.

Дані з сегменту, що є рівень захисту PL можуть бути вибрані програмою, що є такий же або більш високий рівень привілей.

Сегмент кодів (процедура), рівень ,що є захисту PL, може бути викликаний програмою, що є такий же або більш низький рівень привілей.

Необхідно відзначити, що правило 2 не виконується при викликові сегментів кодів, що є встановлений біт підпорядкованості С=1 в байті доступу дескриптора.

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

Рівень привілей дескриптора DPL задається бітами 5 і 6 в байті доступу дескриптора. Значення DPL вказує рівень захищеності сегменту, т. є. Номер кільця захисту, до якого він відноситься.

Рівень привілей запитання RPL задається бітами 0 і 1 селектора. Значення RPL визначає рівень привілей, ініціатора запитання-звертання до сегменту. Ініціатором є програма або влаштування, що з допомогою селектора буде в обігу до пам'яті системи.

Поточний рівень привілей CPL задається бітами 0 і 1 селектора, розміщеного в регістрі CS. Визначає рівень привілей в нинішній момент сегменту ,що виконується програми.

Процесор має спеціальну команду ARPL, що використається для корекції значення RPL селектора. При цьому селектор служить першим операндом команди. В якості другого операнда в регістр завантажується поточне значення CS. При виконанні команди порівнюються значення двох молодших бітів операндів, що містять RPL і CPL. Поле RPL селектора приймає максимальне з значень RPL і CPL, т. Е. Встановлюється мінімальний рівень привілей запитання. Якщо значення RPL при цьому змінилося, те встановлюється ознака ZF.

Звертання до сегментів кодів і даних в захищеному режимі виробляється з урахуванням описаної вище системи привілей. При цьому правила залежать від типу сегменту.

Звертання до сегментів даних виробляється з допомогою селекторів, що завантажуються в регістри DS, ES, FS, GS. При звертанні аналізується значення RPL селектора і CPL програми. Ефективний рівень привілей (EPL) для запитання даних в цьому випадку визначається як максимальне з значень RPL і CPL. Звертання до сегменту ,що запрошується даних дозволяється, якщо його рівень захисту DPL EPL. Порушення цього правила викликає прерывание типу 13.

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

Звертання до підлеглих сегментів допускається тільки з програм, що є такий же або більш низький рівень привілей. Таким чином, в програмах з поточним рівнем привілей CPL можуть виконуватися міжсегментні команди JMP, CALL з передачею керування підлеглому сегменту, що є DPL CPL. При такій передачі керування зберігається рівень вихідної (викликаючої) програми.

Звертання до непідлеглих сегментів з допомогою команд JMP і CALL допускається тільки в випадку, якщо значення CPL поточної програми рівно DPL сегменту. Крім того, команда CALL може викликати сегменти програм з більш високим рівнем привілей, використовуючи механізм шлюзів (або вентилів).

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




В процесорі 80286 бвти з 48 по 63 не використовуються і повинні бути рівні 0.

П'ятибайтове поле WC вказує кількість параметрів, що переносяться в стек нової програми. Параметри подають собою 16-разрядные слова для 16-разрядных програм (в тому числі і для процесора 80286) і 32-разрядные слова для 32-разрядных програм.

При викликові програм через шлюз повинні виконуватися наступні правила. Значення RPL селектора шлюзу і CPL викликаючої програми повинні бути менш або рівним значенню DPL в байті доступу шлюзу.

Якщо програма, що викликається має інший (більш високий) рівень привілей для неї створюється новий стек. При цьому в регістри SS і (E)SP з сегменту TSS завантажується новий вміст, що визначає початкова адреса нового стека. В цей стек послідовно вводяться старі значення SS і (E) SP; параметри, переносимі з старого стека; старі значення CS і (E) IP. Число переносимих параметрів визначається полем WC, причому вибираються останні з завантажених в старий стек параметрів. Стать команді RET виробляється відновлення з стека старого вмісту регістрів SS, (E)SP і CS, (E)IP.

Реалізація введення-виведення в захищеному режимі виробляється з урахуванням CPL програми, що виконується. Величина CPL порівнюється зі значенням поля IOPL в регістрі (E)FLAGS. Введення-виведення виробляється тільки при виконанні умови CPL менш або рівно IOPL.

Багатозадачність.

Багатозадачністю називається такий засіб організації роботи системи, при якому в її пам'яті водночас містяться програми і дані для виконання декількох процесів обробки інформації (задач). При цьому повинен забезпечуватися взаємний захист програм і даних, стосовних до різноманітних задач, а також можливість переходу від виконання однієї задачі до другий (переключення задач). Процесори починаючи з 80286 мають ефективні засоби підтримки багатозадачного режиму. В якості таких засобів використовується структура даних, організована в вигляді сегменту, що називається сегментом стану задачі TSS. Апаратними засобами для підтримки багатозадачности служить регістр задачі TR, в що з GDT може бути завантажений дескриптор задачі.

Кожна задача має свій сегмент TSS, структура якого перебує з двох частин. Обов'язкова частина містить всю інформацію, необхідну процесору для рішення даної задачі. Додаткова частина може містити яку-або інформацію про задачу, що використається операційною системою, бітову карту, що визначає допустимі адреси приладів введення/висновку (тільки 80386+) і бітовую карту віртуальних перериваннь (тільки Pentium+). Розглянемо утримання обов'язкової частини TSS (таблиці 1.2 і 1.3).

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

Поля SS0, (E) SP0, SS1, (E) SP1, SS2, (E) SP2 служать джерелом нового покажчика стека при зміні поточного рівня привілей (передачі керування).

Біт ловушки T в TSS викликає при Т=1 переривання типу 1 при переключенні на дану задачу. Це переривання використовується при отладке програмного забезпечення.

Бітова карта перенаправлення перериваннь БКПП забезпечує можливість автоматичного перенаправлення програмного переривання в віртуальном режимі.

Бітова карта введення-виведення БКВВ забезпечує індивідуальний захист кожного порту введення-виведення. При записі в біті БКВВ нуля дозволяє при CPL>IOPL звертання до відповідного порту. За останнім байтом БКВВ повинен слідувати заключний байт, що містить 1 в усіх розрядах. Адреса цього байта повинна відповідати межі сегменту.

Дескриптор TSS повинен зберігатися тільки в GDT. Тому звертання до дескриптору TSS з допомогою селектора, що є біт TI=1, викликає виключення 10.

Для переключення задач процесор використає звичайні команди міжсегментного переходу JMP, виклика CALL і повернення IRET. Якщо селектор команди JMP або CALL вибирає з таблиці GDT системний дескриптор, у якого поле типу рівно 1 (для 80286) або 9 (для 80386+), виконується переключення задач. При цьому селектор заноситься в TR. Слідує відзначити, що команди передачі керування містять зміщення. Однак при переключенні задач воно ігнорується.

При переключенні задач з допомогою команд JMP або CALL повинні виконувати правила привілей, встановлені для доступу до даних: максимальне з CPL і RPL повинно бути менш або рівно DPL. Таким Чином допускається переключення на задачі, чий ступінь захисту менш або рівному рівню привілей поточної задачі.


Таблиця 1.2. Сегмент стану задачі 80286


Зміщення Вміст
0 Селектор повернення
2

SP0

4

SS0

6

SP1

8

SS1

0A

SP2

0C

SS2

0E

IP

10

FLAGS

12

AX

14

CX

16

DX

18

BX

1A

SP

1C

BP

1E

SI

20

DI

22

ES

24

CS

26

SS

28

DS

2A

LDTR

2C

Інформація ОС

При використанні команди CALL можливо звертання до задач з більш високим ступенем захисту, ніж рівень привілей поточної програми, з допомогою шлюзу задачі. Використання шлюзу задачі аналогічно використанню шлюзів виклика. В дескрипторе шлюзу задачі визначені тільки два поля: поле селектора, в якому знаходиться селектор TSS, і поле прав доступу.

Режим V86.

Починаючи з процесора 80386 стало можливим виконання в захищеному режимі програм, написаних для 8086/88, забезпечуючи при цьому ряд засобів захисту і можливість страничной організації пам'яті. Такий варіант захищеного режиму називається режимом віртуального 8086 і реалізується при настанові в регістрі EFLAGS значення ознаки VM=1.


Таблиця 1.3. Сегмент стану задачі 80386+


Зміщення Вміст
0 Селектор повернення
4

ESP0

8

SS0

ESP1

10

SS1

14

ESP2

18

SS2

CR3

20

EIP

24

EFLAGS

28

EAX

ECX

30

EDX

34

EBX

38

ESP

EBP

40

ESI

44

EDI

48

ES

CS

50

SS

54

DS

58

FS

GS

60

LDTR

64

66

Відносна адреса БКПП (б 15-1). Т (б 0)

Відносна адреса БКВВ

68 Інформація ОС

БКПП

БКВВ

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

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

Надходження команд, що виконуються тільки при рівні CPL=0, в режимі V86 викликає виключення 13.

Надходження команд, що виконуються тільки в захищеному режимі, викликає виключення 6 (недозволений код команди).

Команди PUSHF, POPF, CLI, STI, INT, IRET дошкульні до значення поля IOPL. Вони виконуються тільки при IOPL=3.

Виконання команд введення/висновку не залежить від значення поля IOPL. Однак захист може здійснюватися з допомогою БКВВ.



Информация о работе «Керiвництво программиста»
Раздел: Информатика, программирование
Количество знаков с пробелами: 97603
Количество таблиц: 5
Количество изображений: 0

0 комментариев


Наверх