Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БІКС 2015_1 / Лек 6 Захист інформації на рівні операційної системи.doc
Скачиваний:
76
Добавлен:
12.02.2016
Размер:
3.66 Mб
Скачать

4. Особливості архітектури процесорів Intel х86

У цьому підрозділі мова йтиме про 32-розрядні процесори Intel, здатні працюва­ти в захищеному режимі: 80386,80486, різні процесори Pentium і Celeron. Ці про-цесори підтримують зворотну сумісність і мають багато спільних рис. Саме під час проектування процесора 80386 близько 20 років тому компанія Intel розроби­ла програмну модель процесора, яку використовують і дотепер. Кожна нова мо­дель процесора має суттєві відмінності, які здебільшого стосуються розширення його можливостей завдяки додаванню нових наборів команд, арифметичних при­строїв, груп регістрів. Ці процесори можуть мати кардинально змінену внутріш­ню будову, що дає змогу з більшими швидкістю та інтелектом виконувати задану послідовність команд, але мало торкаються зовнішньої, доступної програмісту структури процесора, яка, власне, і становить його програмну модель. У цьому розділі ми розглянемо лише ті функції процесорів х86, які забезпечують захист областей пам'яті та підтримують ізоляцію процесів під час їх квазіпаралельного виконання, а також наведемо необхідні для їх розуміння відомості, що стосують­ся набору і структури регістрів процесора. Детальнішу інформацію про процесо­ри Intel х86 можна знайти, наприклад, у [63, 92, 94].

4.1. Регістри процесорів х86

Сучасні процесори Pentium, як відомо, мають потужне «серце» з усіма ознаками архітектури RISC: великим регістровим файлом із 40 універсальними регістрами, механізмом перевпорядкування команд і перейменування регістрів. Арифметич­ні та логічні виконуючі пристрої процесора фактично працюють зовсім з іншою системою команд — це мікрокоманди, на які спеціальні пристрої декодування «розбирають» вихідний програмний код. Але все це недоступне ззовні, а програм­на модель процесора визначає набір команд, що має типові ознаки архітектури CISC, зокрема, порівняно невелику кількість доступних програмісту регістрів процесора, багато способів адресації операндів і команди, що поєднують ариф­метичні та логічні операції з адресацією операндів у пам'яті.

Регістри процесора х86 поділено на групи, і майже кожен із них має своє специфічне призначення. Далі перелічено основні такі групи:

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

  • покажчик інструкцій (або програмний лічильник) і регістр прапорців;

  • регістри сегментів;

  • регістри системних адрес;

  • регістри керування;

  • регістри налагодження і тестування;

  • регістри математичного сопроцесора;

  • регістри розширень (ММХ, ХММ).

У табл. 10.1 наведено основні відомості про деякі з регістрів [63, 94].

Таблиця 10.1.

Регістри процесорів Intel х86

Позначення

Назва

Особливості використання

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

eax/ax/ah/al

Акумулятор

Основний регістр для зберігання операндів

(Accumulator

арифметичних і логічних команд; у деяких командах

register)

адресується неявно, тому його використання

обов'язкове

ebx/bx/bh/bl

Базовий регістр

Використовується для зберігання базової адреси

(Base register)

деякого об'єкта в пам'яті

ecx/cx/ch/cl

Лічильник

Використовується в командах, які виконують дії,

(Counter register)

що повторюються, наприклад для організації циклів

(команда loop); такі команди можуть аналізувати

значення есх (есх~0 — умова виходу з циклу)

і автоматично зменшувати есх на одиницю

за кожного проходження

Таблиця іо.і [продовження)

Позначення

Назва

Особливості використання

edx/dx/dh/dl

Регістр даних

Використовується разом із акумулятором для

(Data register)

зберігання операндів; у деяких командах його використання обов'язкове, позаяк адресація може здійснюватися неявно

esi/si

Індекс джерела

Ці два регістри використовуються в так званих

(Source Index

ланцюгових операціях, коли здійснюється

register)

послідовне оброблення елементів, що утворюють

edi/4i

Індекс одержувача

ланцюг або неперервний ряд (наприклад, копіювання рядка символів або масиву значень

(Destination Index register)

з одної області пам'яті до іншої); при цьому початкова адреса області-джерела заноситься в esi, початкова адреса області-одержувача — в edi, а кількість елементів, що копіюються — в есх

esp/sp

Покажчик стека

Показує вершину стека в поточному сегменті стека;

(Stack Pointer

значення цього регістра автоматично змінюється

register)

після виконання операцій записування у стек і зчитування із стеку (push/pushf/pop/popf)

ebp/bp

Покажчик бази

Може показувати на довільні дані всередині стека

(Base Pointer

й активно використовується для передавання даних

register)

через стек, наприклад під час виклику процедури; ebp може також показувати на будь-які дані, зокрема в сегменті даних (в останньому випадку його часто використовують разом з ebx)

Покажчик інструкцій і регістр прапорців

еір/ір

Покажчик

Вказує на команду, яку процесор має виконати

інструкцій

наступною (точніше, яку він наступною має

(Instruction

завантажити на конвеєр оброблення). Заміна вмісту

Pointer register)

цього регістра викликає переключення процесора на іншу команду або послідовність команд. Таку заміну не можна виконувати явно, проте її може бути здійснено автоматично після виконання деяких команд: команд переходу jmp (а також численних команд умовних переходів), команд виклику процедур call, команд організації циклів loop. Залежно від того, яку адресацію використано у програмі — 32- або 16-розрядну — процесор працює з 32-розрядним регістром еір або з його молодшою половиною ір, сумісною із програмним

eflags/ flags

кодом для процесорів 8086

Регістр прапорці* (Flag register)

t Окремі біти цього регістра — прапорці — мають

певне функціональне призначення. Вони апаратно встановлюються в результаті виконання певних команд та (або) умов. Значення прапорців перевіряються під час виконання майже всіх команд і можуть впливати як на результат їх виконання, так і на режим роботи процесора. Молодша половина регістра eflags повністю аналогічна регістру flags процесора 8086

Таблиця 10.1 {продовження)

Позначення

Назва

Особливості використання

Регістри сегментів

CS

Сегмент коду

Адресує сегмент коду, який виконується

(Code Segment

процесором. Для переходу в інший сегмент коду

register)

необхідно завантажити нове значення в регістр cs, причому явних команд для цього не існує: це здійснюється автоматично під час виконання процесором команд jmp або call

SS

Сегмент стека

Адресує сегмент стека, з яким у поточний момент

(Stack Segment

працює процесор. Для організації іншого стека

register)

необхідно завантажити в ss нове значення, при цьому потрібно зберегти поточне значення ss, щоб мати змогу повернутися назад

ds

Сегмент даних

Адресує дані в оперативній пам'яті, з якими працює

(Data Segment

процесор; сегмент ds є основним і адресується неявно

Адресують дані в оперативній пам'яті, з якими

register)

es, gs, fs

Додаткові

сегменти даних

працює процесор; ці сегменти даних потребують

(Extension Data

явної адресації за допомогою спеціальних префіксів

Segment register)

у командах

Регістри системних адрес

Має 48 розрядів, з-поміж яких 32 старших розряди становлять лінійну базову адресу глобальної таблиці

gdtr

Регістр глобальної

таблиці

дескрипторів

дескрипторів у пам'яті, а 16 молодших розрядів

(Global Descriptor

задають розмір таблиці

Table Register)

Idtr

Регістр локальної

16-розрядний регістр, що містить селектор, який

таблиці

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

дескрипторів

(Local Descriptor

Table Register)

момент

idtr

Регістр таблиці

48-розрядний регістр, за будовою аналогічний

дескрипторів

регістру gdtr

переривань

(Interrupt

Descriptor Table

Register)

tr

Регістр задачі

16-розрядний регістр, що містить селектор, який

(Task Register)

вказує на дескриптор у глобальній таблиці, що описує спеціальний сегмент (сегмент стану задачі (TSS)), який містить контекст поточного процесу

Регістри керування

crO

Містить прапорці, які суттєво впливають на роботу процесора і відображають глобальні (не залежні від конкретної задачі) ознаки його функціонування. Деякі важливі системні прапорці з цього регістра: ре (Protect Enable), біт 0 — вмикає захищений режим роботи процесора; cd (Cache Disable), біт ЗО — вмикає використання внутрішно!"*-кеш-пам'яті (кеш першого рівня); pg (Paging), біт 31 — вмикає сторінкову трансляцію адрес

Таблиця 10.1 {закінчений)

Позначення Назва

Особливості використання

Призначений для роботи сторінкового механізму

Віртуальної пам'яті. Містить лілійну віртуальну адресу

команди, яка викликала виняткову ситуацію 14

(відсутність сторінки в пам'яті). Обробник цієї

виняткової ситуації після завантаження необхідної

сторінки в пам'ять має змогу відновити роботу

програми, передавши керування на адресу з сг2

Призначений для роботи сторінкового механізму

віртуальної пам'яті. Містить фізичну базову адресу

каталогу сторінок

Містить прапорці-ознаки підтримки різних

архітектурних елементів, упроваджених у різних

моделях процесорів, наприклад, 36-розрядної

адресації, 4-мегаоайтових сторінок тощо

У регістрах загального призначення зберігаються операнди арифметичних і логічних операцій, компоненти адрес і покажчики на комірки пам'яті. Всього є вісім 32-розрядних регістрів загального призначення: еах, ebx, есх, edx, esi, edi, esp, ebp. Для сумісності з програмами, написаними для попередніх 16-розрядних моделей процесорів, підтримуються звернення за іменами до молодших 16 роз­рядів кожного з цих регістрів і до окремих байтів із молодшої половини чотирьох арифметичних регістрів. Наприклад, еах — 32-розрядннй регістр, ах — його роз­ряди від 0 до 15, а) — його розряди від 0 до 7, ah — його розряди від 8 до 15. Пере­важну більшість цих регістрів програмісти можуть використовувати на свій роз­суд, але в окремих командах деякі регістри мають певне значення, що впливає на їх основне використання і назву.

Адресувати будь-який об'єкт у пам'яті можна лише через сегмент, якому він належить. У програмній моделі процесорів х86 передбачено шість сегментних регістри: cs, ss, ds, es, gs, is. Кожен із них адресує певний сегмент у пам'яті. Залеж­но від типу сегмента існують обмеження на методи доступу до нього, про які мова йтиме далі. Деякі з сегментів адресуються неявно через відповідний сегментний регістр.

Усі регістри сегментів 16-розрядні, такими вони були ще у процесорі 8086 (регістри gs і k було додано у пізніших моделях процесорів). У реальному режимі роботи процесора в ці регістри заносяться 16 старших розрядів 20-розрядних 6а-зових адрес сегментів, які є фізичними адресами початку відповідного сегмента в оперативній пам'яті. У захищеному режимі може підтримуватись як 16-, так і 32-розрядна адресація (починаючи з процесора Pentium Pro, реалізовано підтрим­ку 36-розрядної адресації, але її особливості мине розглядатимемо). Слід зазна­чити, що в сегментні регістри заносяться так звані селектори сегментів, які адре­сують не самі сегменти, а їхні дескриптори. Докладніше ці структури і роботу з ними буде розглянуто у підрозділі 10.4.2.

Регістри системних адрес містять покажчики на системні таблиці, призначені для керування пам'яттю та диспетчеризації процесів. Доступ до сегментів у па­м'яті здійснюється через дескриптори, розміщені у двох доступних процесу таб­лицях. Одну з них, яка містить дескриптори, що описують програмний код і дані, спільні для всіх процесів (бібліотеки, драйвери пристроїв тощо), та численні сис­темні об'єкти, називають глобальною (Global Descriptor Table, GDT). Друга таб­лиця, локальна (Local Descriptor Table, LDT), доступна лише тому процесу, який виконується в даний момент. Кожний процес має власну локальну таблицю. На ці таблиці вказують відповідно регістри gdtr і ldtr. Також окремий регістр (idtr) вказує на таблицю дескрипторів переривань (Interrupt Descriptor Table, IDT).

Для диспетчеризації процесів основною структурою даних є контекст проце­су, який знаходиться у спеціальному системному об'єкті та в обраній розробника­ми процесора х86 термінології називається сегментом стану задачі (Task Status Segment, TSS). Цей об'єкт описує дескриптор, на який вказує регістр ts.

Сегменти, що вказують на глобальні системні об'єкти (gdtr та idtr), містять базові лінійні адреси цих об'єктів, а також задають розмір об'єктів. Сегменти, що вказують на локальні для кожного процесу об'єкти (ldtr та tr), містять лише се­лектори, які адресують відповідні дескриптори у глобальній таблиці. Отже, таб­лиця GDT містить дескриптори, що описують сегменти стану задач і локальні таблиці дескрипторів усіх процесів, які виконуються в системі. Для переходу до виконання іншого процесу необхідно лише завантажити у регістри ldtr та tr від­повідні дескриптори.

Процесори х86 мають п'ять 32-розрядних регістрів, призначених для загаль­ного керування системою (сг0»сг4). З-поміж цих регістрів доступні 4, регістр сгі зарезервовано для подальшого застосування. Доступ до них мають лише програ­ми, які виконуються з рівнем привілеїв 0 (тобто в нульовому кільці захисту).

Регістри налагодження і тестування, регістри математичного сопроцесора, ре­гістри розширень, на кшталт ММХ (цілочислове мудатимедійне розширення), ХММ (мультимедійне розширення з плаваючою крапкою) та інші у цій книжці не розглядатимуться.