Слайд 1Системне програмування
Семестр 2. Лекція 1.
Лектор: доцент
Артамонов Євген Борисович
Слайд 2На сучасному комп'ютерному ринку спостерігається велика розмаїтість різних типів комп'ютерів.
Тому можливо припустити виникнення в споживача питання — як оцінити
можливості конкретного типу (чи моделі) комп'ютера і його відмінні риси від комп'ютерів інших типів (моделей).
Розгляду для цього однієї лише тільки структурної схеми комп'ютера недостатньо, тому що вона принципово мало чим розрізняється в різних машин: у всіх комп'ютерів є оперативна пам'ять, процесор, зовнішні пристрої.
Різними є способи, засоби і використовувані ресурси, за допомогою яких комп'ютер функціонує як єдиний механізм. Щоб зібрати воєдино всі поняття, що характеризують комп'ютер з погляду його функціональних програмно-керованих властивостей, існує спеціальний термін — архітектура ЕОМ.
Слайд 3До вивчення мови асемблера будь-якого комп'ютера має сенс приступати тільки
після з'ясування того, яка частина комп'ютера залишена видима і доступна
для програмування на цій мові. Це так називана програмна модель комп'ютера, частиною якої є програмна модель мікропроцесора, що містить 32 регістра тією чи іншою мірою доступних для використання програмістом. Дані регістри можна розділити на дві великі групи:
16 користувальницьких регістрів;
16 системних регістрів.
Слайд 4Користувальницькі регістри
Як випливає з назви, користувальницькими регістри називаються тому, що
програміст може використовувати їх при написанні своїх програм. До цих
регістрів відносяться:
вісім 32-бітних регістрів, що можуть використовуватися програмістами для збереження даних і адрес (їх ще називають регістрами загального призначення (РОН)):
eax/ax/ah/al; ebx/bx/bh/bl;
ecx/cx/ch/cl; edx/dx/dh/dl;
ebp/bp; esi/si;
edi/di; esp/sp.
шість регістрів сегментів: cs, ds, ss, es, fs, gs;
регістри стану та управління:
регістр прапорів eflags/flags;
регістр покажчика команди eip/ip.
Слайд 7Регістри загального призначення
Усі регістри цієї групи дозволяють звертатися до
своїх “молодшим” частинам. Розглядаючи цей малюнок, помітьте, що використовувати для
самостійної адресації можна тільки молодші 16 і 8-бітні частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні. Це зроблено, як ми відзначили вище, для сумісності з молодшими 16-розрядними моделями мікропроцесорів фірми Intel.
Слайд 8Регістри загального призначення
Ці регістри фізично знаходяться в мікропроцесорі усередині арифметико-логічного
пристрою (АЛП), тому їх ще називають регістрами АЛП:
eax/ax/ah/al (Accumulator
register) — акумулятор. Застосовується для збереження проміжних даних. У деяких командах використання цього регістра обов'язково;
ebx/bx/bh/bl (Base register) — базовий регістр. Застосовується для збереження базової адреси деякого об'єкта в пам'яті;
ecx/cx/ch/cl (Count register) — регістр-лічильник. Застосовується в командах, що робить деякі повторювані дії. Його використання найчастіше неявно і приховано в алгоритмі роботи відповідної команди. Приміром, команда організації циклу loop крім передачі керування команді, що знаходиться по деякій адресі, аналізує і зменшує на одиницю значення регістра ecx/cx;
edx/dx/dh/dl (Data register) — регістр даних. Так само, як і регістр eax/ax/ah/al, він зберігає проміжні дані. У деяких командах його використання обов'язкове; для деяких команд це відбувається неявно.
Слайд 9Регістри загального призначення
Наступні два регістри використовуються для підтримки так званих
ланцюгових операцій, тобто операцій, що роблять послідовну обробку ланцюгів елементів,
кожний з який може мати довжину 32, 16 чи 8 біт:
esi/si (Source Index register) — індекс джерела. Цей регістр у ланцюгових операціях містить поточна адреса елемента в ланцюгу-джерелі;
edi/di (Destination Index register) — індекс приймача (одержувача). Цей регістр у ланцюгових операціях містить поточна адреса в ланцюгу-приймачі.
Слайд 10Регістри загального призначення
В архітектурі мікропроцесора на програмно-апаратному рівні підтримується така
структура даних, як стек. Для роботи зі стеком у системі
команд мікропроцесора є спеціальні команди, а в програмній моделі мікропроцесора для цього існують спеціальні регістри:
esp/sp (Stack Pointer register) — регістр покажчика стека. Містить покажчик вершини стека в поточному сегменті стека.
ebp/bp (Base Pointer register) — регістр покажчика бази кадру стека. Призначений для організації довільного доступу до даних усередині стека.
Слайд 11Сегментні регістри
У програмній моделі мікропроцесора мається шість сегментних регістрів:
cs, ss, ds, es, gs, fs. Їхнє існування обумовлене специфікою
організації і використання оперативної пам'яті мікропроцесорами. Вона полягає в тім, що мікропроцесор апаратно підтримує структурну організацію програми у виді трьох частин, називаних сегментами. Відповідно, така організація пам'яті називається сегментною.
Слайд 12Сегментні регістри
Для того щоб указати на сегменти, до яких
програма має доступ у конкретний момент часу, і призначені сегментні
регістри. Фактично, з невеликим виправленням, як ми побачимо далі, у цих регістрах містяться адреси пам'яті з який починаються відповідні сегменти. Логіка обробки машинної команди побудована так, що при вибірці команди, доступі до даних чи програми до стеку неявно використовуються адреси в цілком визначених сегментних регістрах.
Слайд 13Сегментні регістри
Мікропроцесор підтримує наступні типи сегментів:
Сегмент коду. Містить
команди програми. Для доступу до цього сегмента служить регістр cs
(code segment register) — сегментний регістр коду. Він містить адресу сегмента з машинними командами, до якого має доступ мікропроцесор (тобто ці команди завантажуються в конвеєр мікропроцесора).
Слайд 14Сегментні регістри
Мікропроцесор підтримує наступні типи сегментів:
Сегмент коду.
Сегмент
даних. Містить оброблювані програмою дані. Для доступу до цього сегмента
служить регістр ds (data segment register) — сегментний регістр даних, що зберігає адресу сегмента даних поточної програми.
Слайд 15Сегментні регістри
Мікропроцесор підтримує наступні типи сегментів:
Сегмент коду.
Сегмент
даних.
Сегмент стека. Цей сегмент являє собою область пам'яті, називану стеком.
Роботу зі стеком мікропроцесор організує по наступному принципу: останній записаний у цю область елемент вибирається першим. Для доступу до цього сегмента служить регістр ss (stack segment register) — сегментний регістр стека, що містить адреса сегмента стека.
Слайд 16Сегментні регістри
Додатковий сегмент даних. Неявно алгоритми виконання більшості машинних
команд припускають, що оброблювані ними дані розташовані в сегменті даних,
адреса якого знаходиться в сегментному регістрі ds. Якщо програмі недостатньо одного сегмента даних, то вона має можливість використовувати ще три додаткових сегменти даних. Але на відміну від основного сегмента даних, адреса якого міститься в сегментному регістрі ds, при використанні додаткових сегментів даних їхньої адреси потрібно вказувати явно за допомогою спеціальних префіксів пере визначення сегментів у команді. Адреси додаткових сегментів даних повинні міститися в регістрах es, gs, fs (extension data segment registers).
Слайд 17Сегментні регістри
Мікропроцесор підтримує наступні типи сегментів:
Сегмент коду. cs
(code segment register)
Сегмент даних. ds (data segment register)
Сегмент
стека. ss (stack segment register)
Додатковий сегмент даних. es, gs, fs (extension data segment registers).
Слайд 18Регістри стану і керування
У мікропроцесор включені кілька регістрів, які
постійно містять інформацію про стан як самого мікропроцесора, так і
програми, команди якого в даний момент завантажені на конвеєр. До цих регістрів відносяться:
регістр прапорів eflags/flags;
регістр покажчика команди eip/ip.
Використовуючи ці регістри, можна одержувати інформацію про результати виконання команд і впливати на стан самого мікропроцесора.
Слайд 19Регістри стану і керування
eflags/flags (flag register) — регістр прапорів.
Розрядність eflags/flags — 32/16 біт. Окремі біти даного регістра мають
визначене функціональне призначення і називаються прапорами.
Слайд 21Регістри стану і керування
Виходячи з особливостей використання, прапори регістра
eflags/flags можна розділити на три групи:
8 прапорів стану. Ці
прапори можуть змінюватися після виконання машинних команд. Прапори стану регістра eflags відбивають особливості результату виконання арифметичних чи логічних операцій. Це дає можливість аналізувати стан обчислювального процесу і реагувати на нього за допомогою команд умовних переходів і викликів підпрограм;
Слайд 22Регістри стану і керування
1 прапор керування. Позначається df (Directory
Flag). Він знаходиться в 10-м біті регістра eflags і використовується
ланцюговими командами. Значення прапора df визначає напрямок заелементної обробки в цих операціях: від початку рядка до кінця (df = 0) або навпаки, від кінця рядка до його початку (df = 1). Для роботи з прапором df існують спеціальні команди: cld (зняти прапор df) і std (встановити прапор df). Застосування цих команд дозволяє привести прапор df у відповідність з алгоритмом і забезпечити автоматичне збільшення чи зменшення лічильників при виконанні операцій з рядками;
Слайд 23Регістри стану і керування
5 системних прапорів, керуючих вводом/вводом, маскируемыми
перериваннями, налагодженням, перемиканням між задачами і віртуальним режимом. Прикладним програмам
не рекомендується модифікувати без необхідності ці прапори, тому що в більшості випадків це приведе до переривання роботи програми.
Слайд 30Домашнє завдання
Вивчити зміст і призначення системних прапорів
Слайд 31Регістри стану і керування
eip/ip (Instraction Pointer register) — регістр-покажчик
команд. Регістр eip/ip має розрядність 32/16 біт і містить зсув
наступної підлягаючої виконанню команди щодо вмісту сегментного регістра cs у поточному сегменті команд. Цей регістр безпосередньо недоступний програмісту, але завантаження і зміна його значення робляться різними командами керування, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення з процедур. Виникнення переривань також приводить до модифікації регістра eip/ip.
Слайд 32Системні регістри мікропроцесора
Сама назва цих регістрів говорить про те,
що вони виконують специфічні функції в системі. Використання системних регістрів
жорстко регламентовано. Саме вони забезпечують роботу захищеного режиму. Їх також можна розглядати як частину архітектури мікропроцесора, що навмисно залишена видимої для того, щоб кваліфікований системний програміст міг виконати операції на найнижчім рівні.
Системні регістри можна розділити на три групи:
чотири регістра керування;
чотири регістра системних адрес;
вісім регістрів налагодження.
Слайд 33Регістри керування
У групу регістрів керування входять 4 регістри: cr0,
cr1, cr2, cr3.
Ці регістри призначені для загального керування системою.
Регістри керування доступні тільки програмам з рівнем привілеїв 0.
Хоча мікропроцесор має чотири регістри керування, доступними є тільки три з них — виключається cr1, функції якого поки не визначені (він зарезервований для майбутнього використання).
Регістр cr0 містить системні прапори, що керують режимами роботи мікропроцесора і відбивають його стан глобально, незалежно від конкретних задач, що виконуються. Призначення системних прапорів:
pe (Protect Enable), біт 0 — дозвіл захищеного режиму роботи. Стан цього прапора показує, у якому з двох режимів — реальному (pe=0) чи захищеному (pe=1) — працює мікропроцесор у даний момент часу.
mp (Math Present), біт 1 — наявність співпроцесора. Завжди 1.
Слайд 34Регістри керування
ts (Task Switched), біт 3 — переключення задач.
Процесор автоматично встановлює цей біт при переключенні на виконання іншої
задачі.
am (Aligment Mask), біт 18 — маска вирівнювання. Цей біт дозволяє (am = 1) чи забороняє (am = 0) контроль вирівнювання.
cd (Cache Disable), біт 30, — заборона кеш-пам'яті. За допомогою цього біта можна заборонити (cd = 1) чи дозволити (cd = 0) використання внутрішньої кеш-пам'яті (кеш-пам'яті першого рівня).
pg (PaGing), біт 31, — дозвіл (pg = 1) чи заборона (pg = 0) сторінкового перетворення. Прапор використовується при сторінковій моделі організації пам'яті.
Слайд 35Регістри керування
Регістр cr2 використовується при сторінковій організації оперативної пам'яті
для реєстрації ситуації, коли поточна команда звернулася за адресою, що
міститься в сторінці пам'яті, відсутньої в даний момент часу в пам'яті. У такій ситуації в мікропроцесорі виникає виняткова ситуація з номером 14, і лінійна 32-бітна адреса команди, що викликала це виключення, записується в регістр cr2. Маючи цю інформацію, оброблювач виключення 14 визначає потрібну сторінку, здійснює її підкачування в пам'ять і відновляє нормальну роботу програми;
Регістр cr3 також використовується при сторінковій організації пам'яті. Це так називаний регістр каталогу сторінок першего рівня. Він містить 20-бітну фізичну базову адресу каталогу сторінок поточної задачі. Цей каталог містить 1024 32-бітних дескриптора, кожний з який містить адресу таблиці сторінок другого рівня. У свою чергу кожна з таблиць сторінок другого рівня містить 1024 32-бітних дескриптора, що адресують сторінкові кадри в пам'яті. Розмір сторінкового кадру — 4 Кбайт.
Слайд 36Регістри системних адрес
Ці регістри ще називають регістрами керування пам'яттю.
Вони призначені для захисту програм і даних у мультизадачном режимі
роботи мікропроцесора.
При роботі в захищеному режимі мікропроцесора адресний простір поділяється на:
глобальне — загальне для всіх задач;
локальне — окреме для кожної задачі.
Цим поділом і пояснюється присутність в архітектурі мікропроцесора наступних системних регістрів:
регістра таблиці глобальних дескрипторів gdtr (Global Descriptor Table Register) розмір, що має, 48 біт і утримуючого 32-бітову (біти 16-47) базову адресу глобальної дескрипторної таблиці GDT і 16-бітове (біти 0-15) значення межі, що представляє собою розмір у байтах таблиці GDT;
Слайд 37Регістри системних адрес
регістра таблиці локальних дескрипторів ldtr (Local Descriptor
Table Register) розмір, що має, 16 біт і утримуючого так
називаний селектор дескриптора локальної дескрипторної таблиці LDT. Цей селектор є покажчиком у таблиці GDT, що і описує сегмент, що містить локальну дескрипторну таблицю LDT;
регістра таблиці дескрипторів переривань idtr (Interrupt Descriptor Table Register) розмір, що має, 48 біт і утримуючого 32-бітову (біти 16-47) базову адресу дескрипторної таблиці переривань IDT і 16-бітове (біти 0-15) значення межі, що представляє собою розмір у байтах таблиці IDT;
16-бітового регістра задачі tr (Task Register), що подібно регістру ldtr, містить селектор, тобто покажчик на дескриптор у таблиці GDT. Цей дескриптор описує поточний сегмент стану задачі (TSS — Task Segment Status). Цей сегмент створюється для кожної задачі в системі, має жорстко регламентовану структуру і містить контекст (поточний стан) задачі. Основне призначення сегментів TSS — зберігати поточний стан задачі в момент переключення на іншу задачу.
Слайд 38Регістри налагодження
Це дуже цікава група регістрів, призначених для апаратного
налагодження. Засоби апаратного налагодження вперше з'явилися в мікропроцесорі i486. Апаратно
мікропроцесор містить вісім регістрів налагодження, але реально з них використовуються тільки 6.
Регістри dr0, dr1, dr2, dr3 мають розрядність 32 біт і призначені для завдання лінійних адрес чотирьох крапок переривання. Використовуваний при цьому механізм наступний: будь-яка формована поточною програмою адреса порівнюється з адресами в регістрах dr0...dr3, і при збігу генерується виключення налагодження з номером 1.
Регістр dr6 називається регістром стану налагодження. Біти цього регістра установлюються відповідно до причин, що викликали виникнення останнього виключення з номером 1.
Слайд 39Регістри налагодження
Перелічимо ці біти і їхнє призначення:
b0 —
якщо цей біт встановлений у 1, то останнє виключення (переривання)
виникло в результаті досягнення контрольної крапки, визначеної в регістрі dr0;
b1 — аналогічно b0, але для контрольної крапки в регістрі dr1;
b2 — аналогічно b0, але для контрольної крапки в регістрі dr2;
b3 — аналогічно b0, але для контрольної крапки в регістрі dr3;
bd (біт 13) — служить для захисту регістрів налагодження;
bs (біт 14) — встановлюється в 1, якщо виключення 1 було викликано станом прапора tf = 1 у регістрі eflags;
bt (біт 15) встановлюється в 1, якщо виключення 1 було викликано переключенням на задачу з установленим бітом пастки в TSS t = 1.
Всі інші біти в цьому регістрі заповнюються нулями. Оброблювач виключення 1 по вмісту dr6 повинний визначити причину, по якій відбулося виключення, і виконати необхідні дії.
Слайд 40Регістри налагодження
Регістр dr7 називається регістром керування налагодженням. У ньому
для кожного з чотирьох регістрів контрольних крапок налагодження маються поля,
за допомогою яких можна уточнити наступні умови, при яких варто згенерувати переривання:
місце реєстрації контрольної крапки — тільки в поточній задачі чи в будь-якій задачі. Ці біти займають молодші вісім біт регістра dr7 (по двох біта на кожну контрольну крапку (фактично крапку переривання), що задається регістрами dr0, dr1, dr2, dr3 відповідно). Перший біт з кожної пари — це так називаний локальний дозвіл; його установка говорить про те, що крапка переривання діє якщо вона знаходиться в межах адресного простору поточної задачі. Другий біт у кожній парі визначає глобальний дозвіл, що говорить про те, що дана контрольна крапка діє в межах адресних просторів усіх задач, що знаходяться в системі;
тип доступу, по якому ініціюється переривання: тільки при вибірці команди, при записі чи при записі/читанні даних. Біти, що визначають подібну природу виникнення переривання, локалізуються в старшій частині даного регістра.
Більшість із системних регістрів програмно доступні. Не усі з них знадобляться в нашому подальшому викладі, але, проте, я коротко розглянув їх для того, щоб збудити в читача інтерес до подальшого дослідження архітектури мікропроцесора.