Керiвництво программиста

1 АРХІТЕКТУРА ПРОЦЕСОРІВ INTEL

1.1 Історія розвитку процесорів

Історія мікропроцесорів почалася в 1971 році, коли фірма Intel випустила перший мікропроцесор i4004. Він мав розрядність 4 біта, спроможність адресувати 640 байт пам'яті, тактову частоту 108 кГц і продуктивність 0.06 MIPS. Такий процесор вже міг працювати в якості обчислювального ядра калькулятора. Він містив 2300 транзисторів і виконувався по технології з дозволом 10 мкм. Через рік з'явився його 8-бітный “родич” - i8008, що адресує вже 16 Кб пам'яті.

В 1974 році з'явився 8-разрядный процесор i8080, що став надто популярним влаштуванням. Він вже мав частоту 2 МГц і адресував 64 Кб пам'яті. 6000 транзисторів дозволила розмістити 6-мкм технологія виготовлення. Процесор вимагав трьох джерел живлення (+5, +12 та -5 В) і складної двухтактної синхронизації. На цьому процесорі будувалися різноманітні термінали, контролери і навіть перший ПК Altair. В нашій країні запізнилою луною 8080 стали процесори 580ИК80 і КР580ВМ80, на базі яких в початку і середині 80-х років будувалося багато “саморобних” ПК.

Наступним етапом став процесор i8085 (5 МГц, 0.37 MIPS, 6500 транзисторів, 3-мкм технологія). Він зберіг популярну рєгістрову архітектуру 8080 і програмну єдність, але в нього додали порт послідовного інтерфейсу, скасували спеціальні ІС підтримки (тактового генератора і системного контролера) і декілька змінили зовнішній інтерфейс. Головним подарунком розробникам апаратури стала тільки одна живлюща напруга +5 В.

Варіацію на тему 8080 і 8085 подає процесор Z80 фірми Zilog. Зберігши програмну єдність з 8080, в нього ввели додаткові регістри, що дозволило істотно підвищити продуктивність. Результат виявився вражаючим - ще нещодавно популярні комп'ютери Sinclair, побудовані на Z80, демонстрували на іграх графіку, не гіршу ніж у РС на 16-разрядном процесорі 286.

Перший 16-разрядный процесор 8086 фірма Intel випустила в 1978 році. Частота 5 МГц, продуктивність 0.33 MIPS, але інструкції вже з 16-розрядними операндами (пізніше з'явилися процесори 8 і 10 МГц). Технологія 3 мкм, 29 тис. транзисторів, що адресує пам'ять 1 Мб. Регістрова архітектура і система команд істотно відрізнялися від 8080, але, природно, просліджуються загальні ідеї. Через рік з'явився 8088 - той же процесор, але з 8-битной шиною даних. З нього почалася історія IBM PC, що наклала свій відбиток на подальший розвиток цієї лінії процесорів. Масове розповсюдження і відчинена архітектура РС призвели до лавиноподібній появі програмного забезпечення, що розробляється крупними, середніми і дрібними фірмами і ентузіастами-одинцями. Технічний прогрес вимагав (і зараз вимагає) розвитку процесорів, але вантаж програмного забезпечення РС, що повинно працювати і на більш нових процесорах, в свою чергу вимагав забезпечення зворотної єдності. Таким чином, всі нововведення в архітектурі наступних процесорів повинні були прибудовуватись до існуючого ядра. А тут ще і сама архітектура РС “підкинула”, наприклад, складнощі з використанням векторів перериваннь. Фірма Intel зарезервувала перші 32 вектору “для службового користування”, однак на них “наїхали” переривання BIOS. Один з результатів - додатковий засіб обробки виключень сопроцесора, застосовуваний в старших моделях РС.

Процесор 80286, що знаменує наступний етап архітектури, з'явився тільки в 1982 році. Він вже мав 134 тис. транзисторів (технологія 1.5 мкм) і адресував до 16 Мб фізичної пам'яті. Його принципові новшества - захищений режим і віртуальна пам'ять розміром до 1 Гб - не знайшли масового застосування, процесор більшою частиною використовувався як дуже швидкий 8086.

Клас 32-розрядних процесорів був відкритий в 1985 році моделлю 80386 (275 тис. транзисторів, 1.5 мкм). Разрядность шини даних (як і внутрішніх регістрів) досягла 32 біт, пам'ять ,що адресується фізична - 4 Гб. З'явилися нові регістри, нові 32-битные операції, істотно доопрацьований захищений режим, з'явився режим V86, сторінкове керування пам'яттю. Процесор знайшов широке застосування в РС, і на благодатному грунті його нових властивостей став розростатись “самый великий вірус” - MS Windows з додатками. З цього часу стала помітна тенденція “позитивного зворотного зв'язку”: на появу нового процесора виробники ПО реагують випуском нових привабливих продуктів, наступним версіям якого ставає тісно в рамках цього процесора. З'являється більш продуктивний процесор, але після нетривалого восторга і його ресурси “з'їдають” і т. д. Цей “вічний рух”, кінцево, природно, але є обгрунтована підозра, що більші ресурси розбещують (або, принаймні, розслаблюють) розробника ПО, не змушуючи його напружуватися в пошуках більш ефективних засобів рішення задачі. Прикладом ефективного програмування можна лічити іграшки на Sinclair ZX-Spectrum, що реалізуються на “іграшкових” ресурсах - 8-бітном процесорі і 64 (128) Кб ОЗП. З протилежними прикладами більшість користувачів РС стикаються регулярно, але з процесором Pentium 200 і 32 Мб ОЗП на них не завжди обертають увагу.

Історія процесора 386 нагадує історію 8086: першу модель з 32-бітной шиною даних (згодом названою 386DX) змінив 386SX з 16-розрядной шиною. Він досить легко вписувався а архітектуру РС АТ, шо раніше базувалася на процесорі 286.

Процесор Intel486DX з'явився в 1989 році. Транзисторів - 1.2 млн., технологія 1 мкм. Від 386-го істотно відрізняється розміщенням на кристалі первинного кеша і вбудованого математичного сопроцесора (попередні процесори мали можливість використання зовнішніх х87 сопроцесорів). Крім того, для підвищення продуктивності в цьому СІSC-процесорі (як і в наступних) застосоване RISC-ядро. Далі з'явилися його різновиди, що відрізняються наявністю або відсутністю сопроцесора, застосуванням внутрішнього множення частоти, політикою запису кеша і іншими. Позичилися енергозбереженням (з'явився режим SMM), що відбилося і в продовженні лінії 386 процесорів (з'явився процесор Intel386SL).

В 1993 році з'явилися перші процесори Pentium з частотою 60 і 66 МГц - 32-розрядные процесори з 64-розрядной шиною даних. Транзисторів 3.1 млн., технологія 8.0 мкм, живлення 5 В. Від 486-го принципово відрізняється суперскалярною архітектурою - спроможністю за один такт випускати з конвейєрів до двох інструкцій (що, кінцево, не означає можливості проходження інструкції через процесор за півтакта або за такт). Інтерес до процесора з боку виробників і покупців РС стримувався його дуже високою ціною. Крім того, з'явився скандал з виявленою помилкою сопроцесора. Хоча фірма Intel математично обгрунтувала невисоку імовірність її прояви (раз в декілька років), вона все-таки пішла на безкоштовну заміну вже проданих процесорів на виправлені.

Процесори Pentium з частотою 75, 90 і 100 МГц, що з'явилися в 1994 році, уявили вже другу ґенерацію процесорів Pentium. При майже тому же числі транзисторів вони виконувалися по технології 0.6 мкм, що дозволило знизити потужність ,що споживається. Від першої ґенерації вони відрізнялися внутрішнім множенням частоти, підтримкою мультипроцесорних конфігурацій і мали інший тип корпуса. З'явилися версії (75 МГц в мініатюрному корпусі) для мобільних застосуваннь (в блокнотних ПК). Процесори Pentium другої ґенерації стали надто популярними в РС. В 1995 році з'явилися процесори на 120 і 133 МГц, виконані вже по технології 0.35 мкм (перші процесори на 120 МГц робилися ще по технології 0.6 мкм). В 1996-й називають роком Pentium - з'явилися процесори на 150, 166 і 200 МГц, і Pentium став рядовим процесором для РС широкого застосування.

Паралельно з Pentium розвивався і процесор Pentium Pro, що відрізнявся новинками “динамічного виконання інструкцій”, направленими на збільшення числа паралельно виконуваних інструкцій. Крім того, в його корпусі розмістили і вторинний кеш, для початку обсягом 256 Кб. Однак на 16-бітных додатках, а також в середі Windows 95 його застосування не дасть переваг. Процесор містить 5.5 млн. транзисторів ядра і 15.5 млн. транзисторів для вторинного кеша обсягом 256 Кб. Перший процесор з частотою 150 МГц з'явився в початку 1995 року (технологія 0.6 мкм), а вже в кінці року з'явилися процесори з частотою 166, 180 і 200 МГц (технологія 0.35 мкм), у яких кеш досягав і 512 Кб.

Після довгих обіцянок в початку 1997 року з'явилися процесори Pentium MMX. Розширення MMX припускає паралельну обробку групи операндів однією інструкцією. Технологія MMX закликана прискорювати виконання мультимедійних додатків, в частковості операції з зображеннями і обробку сигналів. Її ефективність викликає суперечки в середі розробників, оскільки виграш в самих операціях обробки компенсується програшем на додаткових операціях упаковки-распаковки. Крім Того, обмежена розрядність ставить під сумнів застосування MMX в декодерах MPEG-2, в яких вимагається обробка 80-бітных операндів. Окрім розширення MMX ці процесори, у порівнянні з звичайним Pentium, мають подвійний обсяг первинного кеша і деякі елементи архітектури, що запозичилися у Pentium Pro, що підвищує продуктивність процесора Pentium MMX і на звичайних додатках. Процесори Pentium MMX мають 4.5 млн. транзисторів і виконані по технології 0.35 мкм. За станом на сьогодняшній день є процесори з тактовими частотами 166, 200, 233 і 266 МГц.

Технологія MMX була з'єднана з архітектурою Pentium Pro - і в травні 1997 року з'явився процесор Pentium II. Він подає собою злегка урізаний варіант ядра Pentium Pro з більш високою внутрішньою тактовою частотою, в що ввели підтримку MMX. Труднощі розміщення вторинного кеша в одному корпусі з процесором подолали нехитрим засобом - кристал з ядром процесора і набір кристалів статичної пам'яті і додаткових схем, що реалізують вторинний кеш, розмістили на невеликій друкарській платі-картридже. Всі кристали закриті загальною кришкою і охолоджуються спеціальним вентилятором. Тактовые частоти ядра - 233, 266, 300, 333, 366, 400 і 450 МГц.

Пізнішє побачив світло спрощений варіант процесора Pentium II, назва ,що отримала Celeron. В ньому вдвічі зменшений вторинний кеш і, немовби, прибрана підтримка багатопроцесорних систем. Однак шляхом “хірургічного” втручання підтримку багатопроцесорності можна повернути. Це пояснюється тим, що в Celeron застосоване ядро Pentium II без будь-яких змін.

В 1999 році з'явився процесор Pentium III. В ньому застосоване покращене ядро процесора Pentium II, в яке додана підтримка технології MMX-2. Технологія MMX-2 підрозумує наявність 8 додаткових 128-розрядных регістрів (в попередніх процесорах регістри MMX знаходилися в мантисах регістрів сопроцесора) і виконання групових інструкцій над 4 числами в форматі короткого речовинного. Перші процесори виготовляються по технології 0.35 мкм і мають тактову частоту 400 МГц. В подальшому планується перехід на 0.18 мкм технологію і збільшення частоти до 1 ГГц.

В даний момент фірма Intel розробляє принципово нову архітектуру IA64, що відкриває клас 64-розрядных процесорів. Першим процесором що є дану архітектуру повинен стати Merced. Цей процесор буде мати 128 64-розрядных регістрів загального призначення і нову систему команд, покликану істотно підвищити продуктивність. Однак в зв'язку з величезним обсягом ПО в спеціальному режимі буде вироблятися підтримка системи команд попередніх процесорів. Merced також буде підтримувати розширення MMX-2 і додаде до нього декілька нових команд. Перші процесори будуть виготовлятися по технології 0.35 мкм і мати тактову частоту 400 МГц. В подальшому планується перехід на 0.18 мкм технологію і збільшення частоти до 1 ГГц.

1.2 Опис внутрішніх блоків

8086/88.

Найбільш простий інтерфейс мають процесори 8086/88. Вони здатні працювати в двох режимах: мінімальному і максимальному.

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

В РС застосовується максимальний режим, при якому сигнали керування системною шиною виробляються контролером шини 8288 по сигналам стану процесора. Всі сигнали керування активні низьким рівнем, що забезпечує можливість керування ,що розділяється шиною декількома приладами. Цикл шини позичає 4 такту (не лічивши тактів чекання).

Будь-який цикл може бути необмежено розтягнутий з допомогою сигналу готовності. Цикли звертання до портів відрізняються від циклів пам'яті використанням шини адреси. У разі звертання до портів лінії адреси A [8: 15] завжди містять нулі. Цикл підтвердження переривання аналогічний циклу читання з порту, але стан шини адреси процесором не управляється. Передача керування шиною здійснюється по сигналам RQ/GT: влаштування, що запрошує керування шиною, генерує імпульс запитання. Процесор, закінчивши черговий цикл, по тій же лінії передає імпульс підтвердження і звільняє шину. Шиною починає керувати влаштування, а по завершенні своїх операцій воно наступним імпульсом повідомляє процесору про звільнення шини. Типові шині цикли процесорів наведені на рисунку 1.1.


Процесор 8086 має 6-байтну внутрішню чергу інструкцій (іменно таку довжину має найдовша інструкція). Блок передвиборки за наявності двох вільних байт в черзі намагається її заповнити в той час, коли зовнішня шина процесора не позичена операціями обміну. Черга у процесора 8088 скорочена до 4 байт, а передвиборка виконується вже за наявності одного вільного байта. Ці відзнаки оптимизують конвейєр з урахуванням розрядності шини даних. Черга обнуляється при виконанні будь-якої команди передачі керування, навіть при переході на наступну адресу. Цією властивістю часто користуються при програмуванні керування приладами введення-виведення, що вимагають затримки між сусідніми операціями обміну. Дешифратор в даних процесорах по суті є і влаштуванням керування.

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

80286.

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

Шина адреси дозволяє адресувати 16 Мб фізичної пам'яті в захищеному режимі і 1 Мб з області молодших адрес - в реальному режимі. При адресації введення-виведення процесор використає тільки біти A [0: 15] шини адреси (при цьому інші біти рівні 0). Як і в процесорі 8086, обмін по шині даних можливий байтами або словами. При побайтном обміні байт з парною адресою передається по лініям D [0: 7], з непарним - по лініям D [8-15]. Обмін словами з парною адресою відбувається по лініям D [0-15]. При адресації слова з непарною адресою процесор автоматично виконує два послідовних шиних циклу: перший по лініям D [8-15], другий - по D [0-7]. Байти шини, що беруть участь в обміні, як і для процесора 8086, визначаються сигналами A0 і BHE#.

Синхронизація процесора здійснюється зовнішнім сигналом, частота якого ділиться навпіл внутрішнім дільником для одержання сигналу внутрішньої синхронизації. На зовнішні виводи процесора цей сигнал не надходить, але його виробляє спеціальна мікросхема 82284 - генератор синхронизації для 80286. Максимальна пропускна спроможність локальної шини процесора - одне слово за кожні два цикла внутрішньої частоти.

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

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

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

Керування тимчасовою діаграмою підрозумує затримку і розтяжку командних циклів. Розтяжка при необхідності подовжує командний цикл звертання для відносно повільних зовнішніх приладів введення-виведення і пам'яті. Зовнішні схеми з допомогою затримки сигналу готовності можуть розтягувати цикл на будь-який час. При цьому вводяться такти чекання процесора. Затримка передвизначена для зрушення початку командного імпульса системної шини відносно відповідної йому фази адресації і ідентифікації. Затримка команд здійснюється мікросхемой 82288 по сигналу CMDLY, що перевіряється по кожному спаду CLK. Необхідність затримки і розтяжки команд з'явилася в зв'язку з істотним підвищенням продуктивності (відносно 8086) локальної шини процесора. 80286 здатний генерувати шинні цикли з мінімальним періодом в два такти внутрішньої частоти. Так при частоті процесора 16 МГц шинні цикли підуть з періодом 250 нс. В повній мірі цією продуктивністю може скористуватися лише пам'ять, підключена до локальної шини. Прилади на шині ISA такого темпу не витримують. Крім того, вони звичайно вимагають певного часу відновлення - пасивного стану керуючих сигналів шини між їм командами ,що адресувалися. Керування затримкою і розтяжкой циклів в залежності від типу і адреси звертання покладається на мікросхеми чипсета системної плати, а для завдання числа тактів чекання і часу відновлення для різноманітних операцій в машинах класу AT ввели відповідні опції BIOS SETUP. Шини цикли процесора уявлені на рисунках 1.2 і 1.3.




При проектуванні процесора 80286 була поставлена задача значно підвищити продуктивність. Буфер передвиборки залишився колишнім, але влаштування передвиборки піддалося значній переробці. Коли черга команд порожня, а це трапляється після кожної інструкції передачі керування, нові байти минають через чергу не затримуючись. Крім того, при передвиборці в захищеному режимі здійснюється контроль меж сегменту кодів. Дешифратор вже подає собою окреме влаштування, що вибирає дані з черги команд і “розгортає” кожну інструкцію в 69 біт, що включають всю інформацію, необхідну процесору для виконання команди, за винятком резидентних операндів. Ці мікроинструкції розміщуються в спеціальний буфер (на 3 команди), що також здатний пропускати команди без затримки в випадку передачі керування. В дешифраторі передбачений спеціальний засіб, що дозволить попереджати шиний інтерфейс про те, що в наступному такті знадобиться цикл вибірки даних з пам'яті. В цьому випадку шиний інтерфейс не дасть почати передвиборку, виключаючи завдяки цьому втрати в продуктивності.

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

Влаштування сегментації заазнало істотних змін. Сегментні регістри тепер перебують з двох частин: 16-разрядного селектора і програмно недосяжної дескрипторної частини, що містить базову адресу, розмір і права доступу сегменту.

80386.

Синхронизація процесора 80386 в точності відповідає синхронизації 80286.

Інтерфейс процесора 80386 в значному ступені схожий на інтерфейс 80286 хоча і зазнав ряду змін.

Шина даних припускає як 16-ти, так і 32-разрядный режим обміну, в залежності від стану вхідного сигналу BS16#. При читанні в 16-розрядному режимі дані на лініях D [16-31] ігноруються, при записі процесор керує всією шиною даних незалежно від сигналу BS16#/.

Шина адреси дозволяє адресувати 4 Гб фізичної пам'яті в захищеному режимі і 1 Мб з області молодших адрес в реальному режимі. При виконанні інструкцій введення-висновку процесор адресується до області 64 Кб простори введення-виведення (00000000-0000FFFFh). При обміні з сопроцесором в циклах введення-виведення процесор виставляє адреси 800000F8-8000000FFh, що спрощує дешифрацію адреси зовнішніми схемами. Лінії A [31: 2] ідентифікують адресу з точністю до подвійного слова, а в межах цього слова сигнали BE[0: 3]# безпосередно вказують, що байти використовуються в даному циклі. Якщо в поточному циклі запису обидва сигнали BE0# і BE1# неактивні, виводимі дані старших байт автоматично дублюються на лініях молодших. Якщо слово ,що адресувалося перетинає межу подвійного слова, процесор після пересилки молодшої частини, що помістилася, автоматично генерує додатковий цикл обміну з іншими значеннями A [31: 2] і BE [3: 0] #.

Сигнал BS16# вводиться зовнішньою схемою, якщо поточний цикл адресується до 16-битному влаштування, підключеному до молодшої половини шини даних. Якщо в даному циклі припускалася передача і двох старших байт, процесор автоматично вводить додатковий цикл для передачі цих байт по молодшій половині шини даних.

Тип циклу локальної шини визначається сигналами M/IO#, D/C#, W/R# і LOCK#, комбінація яких дійсна під час активності сигналу ADS# (строб адреси). Сигнали керування шиною ADS#, READY# і NA# задають тимчасові межі циклів і керують конвейєрною адресацією. Сигнал ADS# відзначає початок кожного циклу, під час його чинності виробляється ідентифікація типу циклу і фіксується відповідна йому адреса. Сигнал READY# повинен вводитися зовнішньою схемою в кожному циклі, відзначаючи готовність до завершення поточного циклу. Сигнал NA# використовується для запитання наступної адреси при конвейєрній адресації, коли зовнішні схеми вже готові сприйняти нову адресу і сигнали ідентифікації. Якщо процесор вже має внутрішнє запитання на наступний шини цикл, він видасть адресу і ідентифікатори наступного циклу до завершення поточного.

Сигнали арбітражу локальної шини передвизначені для передачі керування локальною шиною іншому влаштуванню по його запитанню - переходу в стан лог. “1” лінії HOLD. Коли процесор визнає можливим передачу керування (в незаблокованих циклах відразу по завершенні поточного шиного циклу), він виставить сигнал підтвердження HLDA. В такому стані процесор переводить в високоімпедансний стан всі двунаправлені і вихідні лінії. Цим станом можна користуватися і для отладки апаратних засобів. Шині цикли процесора уявлені на рисунках 1.4 і 1.5.

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

В блок обчислення адреси додане нове влаштування - блок трансляції сторінок. Дане влаштування транслює лінійну адресу в фізичну і перебує з трьох основних блоків: ПЛМ керування, суматор фізичної адреси і кеш-пам'яті сторінок (TLB).

Блок TLB подає собою чотирьохвходову асоціативну пам'ять, що містить 20-розрядні базові адреси 32 сторінок. В якості тега використовуються старші розряди лінійної адреси. Блок перебує з двох модулей пам'яті, основної і додаткової, і логіки обслуговування. Основний модуль пам'яті містить 8 блоків, кожний з яких забезпечує входи в кадр, для 4 сторінок. Вхід в кадр певної сторінки реалізується з допомогою розміщеної в модулі рядка бітів, що містить інформацію про що вибирається сторінку (базова адреса, атрибути) і інформацію, необхідну для її вибору.


Робота TLB відбувається слідуючим чином. Після формування лінійної адреси 3 молодших розряди поля (біти 14-12 лінійної адреси) визначають номер одного з восьмих блоків. Старші 17 розрядів (біти 31-15) порівнюються з 17 бітами тегів, що містяться в чотирьох рядках вибраного блоку. При їхньому збігу означена в стоці базова адреса заміщає 20 старших розрядів лінійної адреси.

Таким чином, кеш-пам'ять сторінок покриває 32*4Кб=128Кб адресного простору, що для більшості додатків забезпечує кеш-попадания з імовірністю 98%.

80486.

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

На зміну конвейєрної адресації попередніх процесорів, починаючи з процесора 80486, введений режим пакетної передачі. Цей режим передвизначений для швидких операцій зі рядками кеша. Рядок кеша процесора 80486 має довжину 16 байт, отже, для її пересилки вимагається чотири 32-розрядных шиних циклу. Оскільки використання кеша припускає, що рядок повинен в ньому бути присутнім цілком, ввели пакетний цикл оптимизований для операцій обміну внутрішнього кеша з оперативною пам'яттю. В цьому циклі адреса і сигнали ідентифікації типу шин циклу видаються тільки в першому такті пакету, а в кожному з наступних тактів можуть передаватися дані, адреса яких вже не передається по шині, а вираховується з першого по правилам, відомим і процесору, і зовнішньому влаштуванню. В пакетний цикл процесор може перетворити будь-яке внутрішнє запитання на множествену передачу, але при читанні його розмір обмежений одним рядком кеша, а при записі в стандартному режимі шини в пакет може збиратися не більш 32 біт. Більш пізні моделі процесорів при роботі з WB-кешем при записі рядків в пам'ять збирають в пакет чотири 32-битных циклу, але це вже робота в розширеному режимі шини 486-го процесора. Пакетний цикл починається процесором так же, як і звичайний: на зовнішній шині встановлюється адреса, сигнали ідентифікації типу циклу і формується строб ADS#. В наступному такті передається перша порція даних, і, якщо вона не єдина, сигнал BLAST# має пасивне значення. Якщо влаштування ,що адресувалося підтримує пакетний режим, воно повинно відповісти сигналом BRDY# замість сигналу RDY# по готовності даних в першій же передачі даних циклу. В цьому випадку процесор продовжить цикл як пакетний, не вводячи такту адресації-ідентифікації (з сигналом ADS#), а відразу перейде до передачі наступної порції даних. Нормально про завершення пакетного циклу повідомляє влаштуванню сигналом BLAST#, що видається в такті останньої передачі пакету. Якщо у процесора є наміру зібрати пакет, а влаштування відповідає сигналом RDY#, дані будуть передаватися звичайними циклами. Введенням сигналу RDY# замість BRDY# зовнішнє влаштування може в будь-який момент перервати пакетну передачу, і процесор її продовжить звичайними циклами. В ідеальному варіанті (без тактів чекання) для передачі 16 байт в пакетному режимі вимагається усього п'ять тактів шини замість восьми, що зажадалося б при звичайному режимі обміну. Пакетний режим припускає додержання одніх і тих же правил формування наступних адрес як процесором, так і зовнішнім влаштуванням. Під час пакетного циклу процесора 486 старші біти адреси A[31:4] залишаються незмінними. Змінюватися можуть тільки біти A [3: 2] і сигнали BE[3:4]#. Таким чином, один пакетний цикл не може перетинати межу рядка кеша. Крім того, є специфічний порядок чергування адрес в пакетному циклі, що визначається початковою адресою пакету і розрядністю передач. Якщо під час пакетного циклу процесор виявить активність сигналів BS16# або BS8# до того, як перейти до наступної адреси, будуть завершені поточні 32-бітні цикли. Оскільки пакетний режим підтримується звичайно тільки оперативною пам'яттю (разом зі вторинним кешем), розрядність якої намагаються не усікати, на практиці перетворення послідовності адрес в 8 - або 16-битные передачі вряд чи де використовується. Порядок чергування адрес в пакетному циклі характерний для всіх процесорів Intel і сумісних із ними, починаючи з 486-го. Він оптимизован для двох банкової організації пам'яті, підрозумуючей чергування банків, що використаються в сусідніх передачах пакетного циклу.

Процесор 486 має чотири внутрішніх буферу для операцій запису. Якщо під час внутрішнього запитання процесора на запис всі буфери вільні і шина не позичена, запис виконується відразу без буферирування. Якщо шина позичена, запитання спрямовується в буфер, позичаючи для запису тільки один внутрішній такт, а з буферу дані вивантажуються в оперативну пам'ять або влаштування введення-виведення по мірі звільнення зовнішньої шини. Зовнішні операції запису з буферів будуть вироблятися в тому же порядку, що і запитання, що надійшли. Однак якщо за наявності невільних буферів з'явиться запитання на читання пам'яті, воно може бути обслуговане і раніше, ніж задовольняться йому запитання, що передують на запис. Ця зміна послідовності може відбутися тільки в тому випадку, якщо всі запитання запису в буферах зв'язані з кеш-попаданнями, а запитання на читання відноситься до кеш-промаху. Тільки в цьому випадку процесор може сміло міняти порядок операцій, але тільки один раз до тих пір, доки не визволяться всі буфери запису. Більше одного разу міняти порядок в загальному випадку не можна, тому що лічені дані можуть замістити рядок, що модифікувався кеша, з якого оновлена інформація якраз і очікує в буфері черги на запис в основну пам'ять. В такому випадку друга спроба зміни послідовності може порушити цілісність даних. Для операцій введення-виведення зміна порядку неможлива. Читання введення-виведення ніколи не може обганяти запис в пам'ять. Одинкові операції висновку не буферируються з тим, щоб дати можливість своєчасно (для програми) повідомити з своєї реакції на запис в порт (викликати апаратне переривання або цикл анулювання рядка). Однак засоби введення програмної затримки між одинковими операціями висновку для процесора 486 відрізняються від що передують: тут команда JMP, раніше безумовно що наводить до генерації зовнішнього циклу звертання до пам'яті скоріше усього буде обслугована з внутрішнього кеша, і бажаної затримки не відбудеться. Надійним засобом введення зовнішнього циклу шини між циклами вивода є явна операція читання некешуємої області пам'яті. Ця операція буде виконана тільки після завершення попереднього циклу висновку, а наступна операція висновку почнеться тільки по завершенні цього читання. Операції блочного висновку, викликані інструкцією REP OUTS, будуть використати буфери, але порядок не буде порушений.

Синхронизація процесора здійснюється зовнішнім сигналом CLK, всі тимчасові параметри відраховуються відносно його позитивного перепада. Зовнішня частота процесором вже не ділиться навпіл (як у 386-го), а може навіть умножатися на коефіцієнт, що у різних моделей процесорів може приймати значення 1, 2, 2.5 і 3. При Цьому інтерфейс зовнішньої шини процесора завжди працює на зовнішній частоті, а частота тактування обчислювального ядра може підвищуватися в декілька раз. Стандартними значеннями зовнішньої частоти є 25, 33.33, 40 і 50 МГц. Коефіцієнт множення задається рівнем логічного сигналу на вході CLKMUL.

Шина адреси дозволяє адресувати 4 Гб фізичної пам'яті в захищеному режимі і 1 Мб з області молодших адрес в реальному режимі. Сигналом A20M# можна включити примусове обнулення лінії A20 (як для внутрішнього кэша, так і для зовнішніх операцій). Таким чином эмулюється циклічне повернення адреси процесора 8086/88 (сигнал сприймається тільки в реальному режимі). При виконанні інструкцій введення-виведення процесор адресується в 64 Кб простори введення-виведення. Лінії A[31:2] ідентифікують адресу з точністю до подвійного слова, а в межах цього слова сигнали BE[3:0]# безпосередно вказують, які байти використовуються в даному циклі. Лінії A[31:4], що визначають адресу рядка внутрішнього кеша, в циклах анулювання працюють на введення.

Шина даних D[31:0] припускає як 32-розрядний режим, так і 16 - і 8-розрядний, в залежності від стану вхідних сигналів BS16# або BS8#. Але, в відзнаку від 386-го, перекомутація байтів не здійснюється. Кожний байт шини даних має біт паритету DP[3:0]. Схеми паритету генерують коректні контрольні біти в циклах запису, а в циклах читання в випадку помилки паритету тільки виробляється сигнал помилки на виході PCHK#, що ніяк не впливає на роботу процесора. Він може використовуватися зовнішніми схемами по розсуду розробника системної плати.

Тип циклу локальної шини визначається сигналами M/IO#, D/C#, W/R# і LOCK# під час активності сигналу ADS#.

Сигнали арбітражу локальної шини у порівнянні з попередніми процесорами доповнені вихідною лінією BREQ, що управляється процесором в будь-якому стані. Цей сигнал вказує зовнішньому арбітру на те, що процесор має внутрішнє запитання на використання шини. Сигнал встановлюється водночас зі стробом ADS#. Якщо процесор в даний момент не керує шиною, то сигнал з'явиться в той момент, коли процесор виставив б сигнал ADS#. Для запитання передачі керування локальною шиною іншому влаштуванню використовується сигнал HOLD. Коли процесор визнає можливим передачу керування, він виставить сигнал підтвердження HLDA. Крім того, є сигнал безумовного отключення процесора від шини - BOFF#. По цьому сигналу процесор віддає керування шиною в наступному же такті, а поточний цикл може бути перерваний. По Закінченню чинності сигналу BOFF# процесор рестартує перерваний цикл, знову ввівши такт адресації і ідентифікації зі стробом ADS#. Для внутрішніх вузлів процесора це бачиться як введення тактів чекання. Сигнал AHOLD передвизначений для захоплення зовнішнім контролером тільки шини адреси для анулювання рядків внутрішньої кеш-пам'яті. Анулювання рядка виробляється за наявності строба зовнішньої адреси EADS#.

До інтерфейсу кеш-пам'яті відносяться вхідні сигнали KEN# (дозвіл кешировання пам'яті по поточній адресі), FLUSH# (анулювання всіх рядків внутрішнього кеша з попереднім вивантаженням рядків ,що модифікувалися в випадку застосування зворотного запису) і вихідні сигнали PWT і PCD, керуючі зовнішнім кешированням. Процесори, працюючі в режимі зворотного запису кэша, використають додаткові сигнали INV, HITM#, CASHE# і WB/WT#. Перші процесори сімейства 486-х в первинному кеше забезпечували тільки політику наскрізного запису. Для них не було необхідності в реалізації пакетного режиму при записі. Запис зовнішнім контролером в кешуюму пам'ять наводить тільки до анулювання рядка кеша, якщо осередок, до якої буде в обігу зовнішній контролер, уявлений і в внутрішньому кеші. Для політики зворотного запису інтерфейс ускладнюється - необхідно забезпечення можливості вивантаження рядків кеша, що модифікувалися в основну пам'ять, якщо до пам'яті, що відображається цими рядками, буде в обігу зовнішній контролер шини. З цими відмінностями зв'язані поняття стандартного і розширеного режиму шини процесора 486. Стандартний режим шини передвизначений для роботи первинного кеша з політикою наскрізний запису, що повністю сумісно з інтерфейсом перших процесорів 486 з WT-кешем. Його основні відзнаки наступні: на сигнал FLUSH# процесор не відповідає спеціальним циклом підтвердження; по сигналу FLUSH# процесор анулює всіх рядки внутрішнього кеша за 15-20 тактів CLK; сигнали, специфічні для WB-кеша, ігноруються; сигнал EADS# сприймається в будь-який момент часу. Розширений режим шини передвизначений для роботи первинного кеша з політикою зворотного запису, що повністю сумісно з інтерфейсом процесорів 486 з WB-кешем. Його основні відзнаки наступні: по сигналу FLUSH# процесор виконує зворотні записи рядків ,що модифікувалися кеша, після чого відповідає спеціальним циклом підтвердження; зворотний запис рядків ,що модифікувалися кеша, що виконується по сигналу FLUSH# і інструкції WBINVD, може позичати біля 2000 тактів CLK, система повинна спостерігати за шиною, очікуючи спеціального циклу підтвердження; сигнали BLEN#, EWBE#, WB/WT#, INV сприймаються процесором; сигнал WB/WT# сприймається в кожному циклі звертання до пам'яті, дозволяючи визначати політику запису для кожного рядка окремо; сигнал EADS# сприймається тільки в стані HOLD, AHOLD або BOFF#; сигнал PLOCK# не активний (постійний високий рівень). Вибір режиму шини здійснюється процесором за станом лінії WB/WT# в момент закінчення сигналу RESET, низькому рівню відповідає стандартний режим шини. Сигнал всередині процесора резистором підтягується до низького рівня, так що на системній платі, не зворотного запису ,що підтримує режим, процесор завжди буде працювати в стандартному режимі. На рисунку 1.6 уявлений пакетний цикл заповнення рядка кеш-пам'яті.


Процесор 486 має RISC-ядро, що зажадало докорінної зміни дешифрації команд. Черга кодів перебує з двох блоків по 16 байт і заповнюється, або з кэша за 1 такт, або швидкими пакетними циклами поблочно. Запитання на передвиборку має нижчий пріоритет у порівнянні з іншими запитаннями, що дозволяє звести до мінімуму час, необхідний для вибірки операнда. На рисунку 1.7 уявлений конвейєр процесора.


Більшість команд перебувають в крапках конвейєра не більш одного такту. Крім того запис результату може бути суміщений з виконанням наступної команди, якщо будь-який операнд наступної команди, або не перетинається з результатом попередньої, або перетинається повністю (входить в склад. Наприклад АХ і ЕАХ). Дешифрация команди виконується в дві стадії. На першій стадії виробляється трансляція команди в RISC-інструкцію. На другій стадії виробляється обчислення адрес операндів і формування відповідних запитань.

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

В склад процесора війшло ще одне влаштування, покликане значно підвищити продуктивність. Це кеш пам'ять першого рівня, працююча на частоті ядра. Кэш-пам'ять має розмір 8 Кб і має чотирьохвходову наборно-асоціативну структуру. Її робота аналогічній роботі блоку TLB.

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

Pentium.

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

Шина даних стала 64-бітной для підвищення продуктивності обміну з пам'яттю. Можливість динамічного керування розрядністю шини вилучена, погодження по розрядності з інтерфейсними шинами покладене на мікросхеми чипсета. При дозволеному контролі паритету даних (сигнал PEN) помилка викликає не тільки спрацьовування сигналу PCHK#, але і фіксацію збойної адреси і даних в регістрі машинного контролю. А якщо встановлен біт MCE регістру CR4, по цій помилці генерується виключення 18. В доповнення до контролю паритету шини даних введен контроль паритету шини адреси. Виявлена помилка паритету бітів A[31:5] шини адреси тільки викликає сигнал помилки APCHK#, що може бути оброблений системною логікою.

Пакетні цикли виконуються тільки у разі звертання до пам'яті, причому як при читанні, так і при записі. Пакетні цикли зв'язані тільки з кешуємою пам'яттю, при цьому кешуємість пам'яті подразумує і її підтримку пакетного режиму. Під час пакетного циклу сигнали дозволу байт і молодші біти адреси не міняються. Порядок чергування адрес, як і у процесора 486, оптимизован для двухбанкової організації пам'яті. Знову з'явилася конвейєрна адресація, що дозволяє водночас на шині бути присутім двом обслуговуваним запитанням. Ознакою пакетного циклу (і його закінчення) є сигнал CASHE#. Зовнішня система не може перервати пакетний цикл, початий процесором. Конвейєризация запрошується сигналом NA#, в відповідь на який процесор через такт видасть адресу наступного циклу. Без конвейєризації наступна адреса була б виставлена тільки після завершення передачі даних поточного циклу.

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

Для підтримання погодженості даних кеша і основної пам'яті процесор відпрацьовує цикли спостереження, що ініціювалися зовнішньою системою. Ці цикли, як і в 486-м, використають сигнали AHOLD#, EADS# і відповідні сигнали процесора HIT# і HITM#. Сигнал FLUSH# викликає вивантаження всіх рядків ,що модифікувалися первинного кеша. Цикли спостереження ініціюються системою для визначення присутності затребуваної області пам'яті в рядку будь-як кеш-пам'яті і визначення її стану. Процесори, починаючи з Pentium, підтримують протокол MESI, названий по їм станам, що визначаються: Modified, Exclusive, Shared, Invalid. Стану визначаються слідуючим чином: M-state - рядок присутній тільки в одному кеші і модифікований, те є відрізняється від вмісту основної пам'яті. Доступ до цього рядка можливий без генерації зовнішнього (по відношенню до локальної шини) циклу звертання; E-state - рядок присутній тільки в одному кеші, але не модифікований. Доступ до цього рядка можливий без генерації зовнішнього циклу звертання, при записі вона перейде в стан М; S-state - рядок потенційно може бути присутнім в декількох кешах. Її читання можливо без генерації зовнішнього циклу, а запис в неї повинна супроводжуватися наскрізним записом в основну пам'ять, що притягне анулювання відповідних рядків в інших кешах; I-state - рядок буде відстуній в кеше, її читання може призвести до генерації циклу заповнення рядка. Запис в неї буде наскрізний і вийде на зовнішню шину. Шини цикли процесора уявлені на рисунку 1.8.


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

Структура конвейєрів уявлена на рисунку 1.9 (Пунктиром показані стадії, добавлені в процесори з підтримкою ММХ). На стадії передвибірки PF команди вибираються з кеша команд. Далі вони надходять на стадію вибірки F. Тут відбувається розподіл вибраної порції коду на окремі команди, а також декодування будь-яких префіксів. Між стадією F і D1 знаходиться FIFO-буфер. В ньому може міститися до чотирьох інструкцій (в процесорах без ММХ буфер буде відстуній, а префікси декодуються на стадії D1). Буфер прозорий, т. є. він не віднімає часу, коли пуст. В кожному такті з стадії F в буфер може надходити до двох інструкцій. Бо середня швидкість виконання команд менш ніж дві команди за такт, те буфер звичайно заповнений.

На стадії D1 відбувається перетворення команд в RISC-інструкції і прийняття рішення про распаралелювання. Далі команди надходять в два конвейєра. Обидва конвейєра функціонально подібні, але другий V конвейєр у порівнянні з головним U має деякі обмеження. Стадія D2, на якій вираховуються адреси операндів пам'яті, має багатоканальний суматор. В відзнаку від відповідної стадії конвейєра попередніх процесорів, ця стадія не вводить додаткових тактів затримки при багатокомпонентних обчисленнях адреси. На стадії ЕХ відбувається безпосереднє виконання команд в цілочисельних АЛУ. Pentium має окремий умножитель, що не використає ресурсів АЛУ, і, отже, дозволяє виконувати інші команди паралельно з множенням. Але бо умножитель тільки один, дві команди множення не распаралеливаються. Множення може вироблятися в V конвейєрі. Кожний конвейєр має свій буфер запису WB для підвищення продуктивності при послідовних операціях запису в пам'ять. Буфери мають розрядність 64 б і можуть обидва заповнитися за один такт, наприклад, при одночасних кеш-промахах записи на обидва конвейєрах.


В відзнаку від цілочисельних команд, що цілком виконуються на стадії ЕХ, команди FPU і MMX починають виконуватися на стадії ЕХ, а після цього уходять на свої стадії. На стадіях конвейєра FPU виконуються наступні дії. На стадії ЕХ відбувається читання операндів з пам'яті і регістрів, далі перехід на стадію Х1 або перетворення даних до зовнішнього формату і запис в пам'ять. На стадії Х1 відбувається перетворення даних до внутрішнього формату і запис в регістр. На стадії Х2 виконання команд, а на стадії WF - округлення і запис результату. Для команд ММХ існують два своїх конвейєра, постачених окремими АЛУ і умножителями. На стадії ЕХ відбувається читання операндів. Стадія Mex - виконання команд, перший такт множення. Стадія Wm/М2 - запис результату однотактних команд, другий такт множення. Стадія М3 - третій такт множення. Wmul - запис результату множення.

Блок попередньої вибірки інструкцій має чотири 32-байтных буферу. На стадії PF дві незалежні пари буферів вибірки працюють разом з цільовим буфером ветвлення ВТВ. В кожний момент часу попередню вибірку інструкцій може активно запрошувати тільки один буфер. Вибірка виробляється послідовно до появи інструкції галуження. Коли така інструкція з'являється, ВТВ завбачує, буде чи перехід. Якщо завбачується перехід, те дозволяється робота іншого буферу передвиборки і він починає передвиборку з цільової крапки галуження. Якщо завбачене галуження не відбулося, конвейєри інструкцій скидаються і передвиборка починається знову. Оскільки кеш інструкцій окремий від кэша даних, передвиборка інструкцій не конфліктує з запитаннями даних з кеша.

Pentium Pro.

Зовнішній інтерфейс процесора Pentium Pro докорінно відрізняється від всіх попередніх моделей процесорів. Застосування динамічного виконання різко підвищує частоту запитань процесорного ядра до шини за даними пам'яті і інструкціями, оскільки ядро водночас обробляє декілька інструкцій. Для обходу вузького місця - зовнішньої шини - кристал процесорного ядра використає архітектуру подвійної незалежної шини. Одна з цих шин використовується тільки для зв'язку з кристалом вторинного кеша, розташованим в тому же корпусі мікросхеми, а у Pentium II - на загальному картриджі. Ця шина є локальною і в геометричному сенсі - провідники мають довжину порядку одиниць сантиметрів, що дозволяє використати її на частоті ядра процесора. Значний обсяг вторинного кеша дозволяє задовольняти більшість запитань до пам'яті суто локально, при цьому коефіцієнт завантаження шини досягає 90%. Друга шина процесорного кристалу виходить на зовнішні виводи мікросхеми, вона і є системною шиною процесора. Ця шина працює на зовнішній частоті незалежно від внутрішньої шини. Завантаження процесором зовнішньої шини для звичайних “настольных” застосуваннь складає порядку 10% від її пропускної спроможності, а для серверних застосуваннь може досягати 60% при чотирьохпроцесорной конфігурації. Таким Чином, обмежена пропускна спроможність зовнішньої шини перестає сильно стримувати продуктивність процесора. Зниження навантаження на зовнішню шину дозволяє ефективно використати багатопроцесорну архітектуру.

Системна шина PentiumPro і Pentium II більш ефективна для об'єднання процесорів по симетричній архітектурі, ніж шини попередніх процесорів, оптимизовані для обміну з пам'яттю. Вона дозволяє без додаткових схем об'єднувати до чотирьох процесорів.

Сигнали системної шини об'єднуються в групи запитань і відповідей. Кожне влаштування-агент, підключене до цієї шини, до ініціализації запитання через механізм арбітражу повинно отримати право на використання шини запитання. Запитання виходить за два суміжних такта: в першому такті передається адреса, тип звертання і тому подібна інформація. В другому такті передається унікальний ідентифікатор транзакції, довжина запитання, дозволені байти шини і т. п. Через три такти після запитання перевіряється стан помилки для захисту від помилок передачі або порушень протоколу. Будь-яка виявлена помилка викликає повторення запитання, а друга помилка для того же запитання викликає виключення контролю. Шини транзакції діляться на безліч фаз, перекриваючих друг друга. В фазі завершення всі агенти, що відповідають на дане запитання, при необхідності можуть виставити на шину коди завершення. Інші процесори в цій фазі управляють лініями HIT# і HITM#, в залежності від попадання запитання в їхній внутрішній кеш. Агент, що не встигає відповісти за відведені чотири такту, може виставити водночас сигнали HIT# і HITM# для затримки фази завершення на число тактів, кратне двом. В випадку кеш-попадания запитання до пам'яті задовольняє процесор, оскільки передачі кеш-кэш відбуваються швидше. Однак при попаданні в рядок, що модифікувався цикли звертання до пам'яті неминучі. На шині водночас може бути присутнім безліч запитань і відповідей, однак логічний аналізатор, “що розуміє” протокол шини Pentium Pro, здатний розкласти їх “по полочкам” відповідних транзакцій.

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

Шина REQ[4:0]# під час першого такту фази запитання несе частину інформації про транзакції, достатню для ініціалізації циклу спостереження. При транзакції доступу до пам'яті тут же передається інформація про розмір адресного простору - 4 Гб (32-біта) або 64 Гб (38-біт). Під час другого такту фази запитання по цим лініям передається додаткова інформація, включаюча довжину поля даних. Можливо завдання довжини 0-8, 16 або 32 байта.

Шина A[35:3]# використовується багатофункціонально. Під час першого такту фази запитання вона містить адреса пам'яті або введення-висновку, а для транзакцій з відкладеною відповіддю - її ідентифікатор. Під час другого такту фази запитання ця шина несе інформацію про атрибути транзакції, її ідентифікатор, і додаткові функції, що беруть участь байтах. По закінченню дії сигналу RESET# процесори з цих ліній одержують інформацію про конфігурацію по включенню.

Сигнали запитання BREQ[3:0]# використовуються для арбітражу симетричних агентів. Агент “n” запрошує шину, управляючи сигналом BREQn#, а інші лінії розглядає як вхідні. Симетричні агенти підтримують розподілений механізм арбітражу на основі циклічної зміни ідентифікатора пріоритету. “Що обертається” ідентифікатор подає собою внутрішній стан всіх симетричних агентів для визначення агента з найменшим пріоритетом для наступної події арбітражу. По включенні живлення що обертається ідентифікатор встановлюється в значення 3, дозволяючи агенту 0 мати вищий пріоритет з всіх симетричних агентів. По черговій події арбітражу новий стане рівним номеру агента - поточного власника шини, в результаті чого, віддавши керування шиною при наступній події, він отримає найнижчий пріоритет. Чергова подія трапляється, коли виставляє запитання до вільної шини або поточний власник знімає своє запитання. За станом ліній BREQ[3:0] і значенню ідентифікатора, відомого всім агентам, вони водночас (по однаковим правилам) визначають нового власника шини. Власник шини може відраховувати керування шиною, зберігаючи активне значення свого сигналу запитання. Однак виявивши запитання від інших агентів, він по можливості повинен віддати керування шиною. Для підключення до шини арбітражу BREQ[3:0]# використовуються сигнали процесора BR0#(i/o) і BR[3:1]# (i). Під час конфігурування по включенню центральний агент повинен виставити сигнал BREQ0#. Всі симетричні агенти по сигналам прийнятим зі своїх ліній BR[3:0]#, визначають свій ідентифікатор агента. Процесор Pentium II розрахований на застосування не більш ніж в двухпроцесорних симетричних системах, він має тільки сигнали BR0# і BR1#. Тимчасова діаграма роботи процесора уявлена на рисунку 1.10.


В сімействі процесорів Pentium Pro використовується архітектура динамічного виконання, в якій сочетаєтся зміна порядку виконання, предположне виконання інструкцій з апаратним перейменуванням регістрів і передсказанням ветвлень. Їхньою відокремлювальною рисою є те, що інструкції, що минають через конвейєр в порядку надходження, розбиваються на найпростіші мікрооперації, що виконуються суперскалярним процесорним ядром в порядку, зручному процесору. “Безладне” ядро процесора містить декілька конвейєрів, до яких підключаються виконавчі прилади. Декілька виконавчих приладів можуть об'єднуватися на одному конвейєрі. Конвейєр процесора містить три частини: препроцесор, ядро з неупорядоченим виконанням, що упорядковує влаштування. Схема конвейєра уявлена на рисунку 1.11.


Конвейєр має наступні східців. Буфер мети галуження ВТВ зберігає історію і їхніх цільових адрес, що відбувалися ветвлень. Кожний з 512 елементів ВТВ зберігає цільову адресу і чотири біти передісторії, що несуть інформацію про те, траплялася чи перехід за останні чотири проходу через інструкції галуження, посилатися на дану адресу. Якщо на підставі аналізу передісторії завбачується перехід, цільова адреса посилається в блок предвиборки, не чекаючи виконання інструкції галуження. Окрім BTB, Pentium Pro має буфер стекових вертаннь, що дозволить коректно завбачувати адресу повернення з процедур, що викликаються з різноманітних крапок. Таким чином, виклик процедури в лінійній послідовності кодів не наводить до втрати продуктивності предвиборки. Блок вибірки інструкцій IFU має дві стадії. На першій стадії інструкції вибираються 16-байтними пакетами, зрівненими по межам параграфів. На другий стадії інструкції попередно декодуються і вкладаються в два буферу по 16 байт вже без прив'язки до меж параграфів. На східці ID процесор має три декодера. Перший декодер за один такт здатний декодувать одну макроінструкцію, що містить до чотирьох мікрооперацій. Два інших декодера можуть за такт декодувати тільки інструкцію, що перебує з однієї мікрооперації. Більш складні інструкції декодуються за декілька тактів.

В кожному такті декодери можуть виробляти до шести мікрооперацій, що надходять в спеціальну чергу. З черги до трьох мікрооперацій надходять на стадію RAT. Тут відбувається перейменування регістрів, а на стадії RS резервування місця в ROB. ROB організований в вигляді кільцевого буферу на 40 місця. Микрооперации надходять в ROB в порядку черги і удаляються в порядку черги, а виконуватися мікрооперації можуть поза чергою по мірі готовності вихідних даних і доступності виконавчих приладів. До трьох мікрооперації можуть передаватися на виконання в кожному такті. В залежності від функції ,що виконується мікрооперація спрямовується в один з п'ятих портів. До кожного порту прикріплені свої виконавчі прилади. Порт 0 може містити цілочисельне АЛУ і FPU, порт 1 - цілочисельне АЛУ, порт 2 - блок завантаження даних, порт 3 - блок адреси запису, порт 4 - блок даних запису. В процесорі Pentium II порт 0 містить АЛУ ММХ і умножитель ММХ, а порт 1 - АЛУ ММХ і зсуватель ММХ. Після виконання мікрооперація вертається зворотно в ROB, де очікує вилучення. Після того як результат мікрооперації був записаний в ROB, він (результат) ставає доступним іншим мікроопераціям.

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. Однак захист може здійснюватися з допомогою БКВВ.

1.3.3 Механізм трансляції сторінок

32-разрядные процесори підтримують механізм трансляції сторінок. Даний механізм здійснює перетворення лінійної адреси в фізичну шляхом таблиць сторінок. Вперше трансляція сторінок почала підтримуватися в процесорі 80386. Наступні ґенерації процесорів додашли в цей механізм нові можливості.

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

    PG - біт 31 регістру CR0. Дозволяє механізм сторінкового перетворення (80386+);

    PSE - біт 4 регістру CR4. Дозволяє сторінки розміром 4Мб (або розміром 2 Мб, коли встановлений прапор PAE) (Pentium+);

    PAE біт 5 регістру CR4. Дозволяє 36-разрядный фізична адреса. Розширена фізична адреса може бути використана тільки з дозволеним сторінковим перетворенням (Pentium Pro+).

Таблиця 1.4. Розміри сторінок і фізичної адреси.

CR0. PG

CR4. PAE

CR4. PSE

PDE. PS

Розмір сторінки

Розмір фізичної адреси

0

x

x

x

-

Сторінкове перетворення отключено

1

0

0

x

4Кб

32 б

1

0

1

0

4Кб

32 б

1

0

1

1

4Мб

32 б

1

1

x

0

4Кб

36 б

1

1

x

1

2Мб

36 б

Інформація, яку використає процесор для перетворення лінійної адреси в фізичний, знаходиться в наступних таблицях:

    Каталог сторінок;

    Таблиця сторінок;

    Таблиця покажчиків на каталог сторінок.

Коли використовується 32-разрядный фізична адреса, таблиці забезпечують доступ до сторінок розміром 4 Кб або 4 Мб. При використанні розширеної 36-разрядного фізичної адреси таблиці забезпечують доступ до сторінок розміром 4 Кб або 2 Мб.

Перетворення лінійної адреси для 4 Кб сторінок.

Дане перетворення виконується в усіх 32-разрядных процесорах. На рисунку 1.18. Уявлений механізм трансляції лінійної адреси на сторінки розміром 4Кб. Покажчик на каталог сторінок знаходиться в регістрі CR3. Елементи каталогу сторінок вказують на таблиць сторінок, елементи таблиці сторінок - на сторінки фізичної пам'яті. Цей засіб може бути використаний для адресації до 220 сторінок, що покриває лінійний адресний простір розміром 4 Гб.


Для вибору різноманітних елементів таблиць лінійна адреса ділиться на 3 секції:

    Елемент каталогу сторінок - біти з 22 по 31 містять індекс для входу в каталог сторінок. Вибраний елемент містить базова фізична адреса таблиці сторінок;

    Елементи таблиці сторінок - біти з 12 по 21 містять індекс для входу в вибрану таблицю сторінок. Цей елемент містить базова фізична адреса сторінки в фізичній пам'яті;

    Зміщення - біти з 0 по 11 містять зміщення фізичної адреси всередині сторінки.

Перетворення лінійної адреси для 4 Мб сторінок.

На рисунку 1.19 показане, як каталог сторінок може бути використаний для відображення лінійної адреси на 4 Мб сторінки. Елементи каталогу сторінок вказують на сторінки фізичної пам'яті. Цей засіб сторінкового перетворення може бути використаний для відображення до 1024 сторінок на лінійний адресний простір розміром 4 Гб. Даний засіб доступний в процесорах Pentium+.


Сторінки розміром 4 Мб вибираються, коли встановлений прапор PSE в регістрі керування CR4 і коли встановлений прапор PS в елементі каталогу сторінок. Коли ці прапори встановлені, лінійна адреса ділиться на дві секції:

    Елемент каталогу сторінок - біти з 22 по 31 містять індекс для входу в каталог сторінок. Вибраний елемент містить базова фізична адреса 4Мб сторінки;

    Зміщення - біти з 0 по 21 містять зміщення фізичної адреси всередині сторінки.

Елементи таблиць сторінкового перетворення.

На рисунках 1.20 і 1.21 показаний формат елемента каталогу сторінок і таблиці сторінок відповідно, коли використовуються 4Кб сторінки і 32-разрядный фізична адреса. На малюнку 1.22 показаний формат елемента каталогу сторінок, коли використовуються 4МБ сторінки і 32-разрядный фізична адреса.



Функції полів в елементах наступні:

    Базова адреса сторінки, біти з 12 по 31. Для елемента таблиці 4Кб сторінок: містить фізична адреса першого байта 4Кб сторінки. Б даного поля інтерпретуються як 20 старших біта фізичної адреси. Для елемента каталогу 4Кб сторінок: містить фізична адреса першого елемента таблиці сторінок. Біти даного поля інтерпретуються як 20 старших бітів фізичної адреси. Для елемента каталогу 4Мб сторінок: містить фізична адреса першого байта 4Мб сторінки. Використовуються тільки б з 22 по 31 цього поля. Ці б інтерпретуються як 11 старших розрядів фізичної адреси сторінки;

    Біт присутності Р. Показує, знаходиться чи сторінка або таблиця сторінок в фізичній пам'яті. Коли Р=1, сторінка знаходиться в пам'яті і у разі звертання до ній відбувається перетворення лінійної адреси в фізичний. Коли Р=0, сторінки в пам'яті немає, інша частина елемента доступна для операційної системи. Якщо процесор спробує звернутися до сторінки, у якої Р=0, те відбудеться виключення 14;

    Біт R/W. Біт читання/запис. І біт U/S. Біт користувач/супервизор. Ці біти застосовуються для захисту по привілей на рівні сторінок;

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

    Біт D. Біт “брудний”. Показує, було чи звертання до сторінки для запису. Процесор встановлює цей біт при записі в сторінку. Скид біта здійснюється тільки програмним шляхом. Даний біт спільно з бітом А використовується операційною системою для керування пам'яттю;

    Біт PS. Розмір сторінки. Визначає Розмір сторінки. Даний б використовується тільки в елементах каталогу сторінок. Коли цей біт не встановлений, розмір сторінки 4Кб і елемент каталогу сторінок вказує на таблицю сторінок. Коли цей біт встановлений, розмір сторінки рівний 4Мб при використанні 32-разрядного адреси (і 2Мб при використанні розширеної адреси) і елемент каталогу сторінок вказує на сторінку;

    Біт G. Глобальна сторінка. Коли даний біт встановлений, це означає, що сторінка є глобальною. Коли сторінка позначена як глобальна і глобальні сторінки розв'язані (біт PGE в регістрі CR4), при перезагрузке регістру CR3 елемент таблиці сторінок або елемент каталогу сторінок не оголошується невірогідним в TLB. Цей біт служить для того, щоб відвернути вилучення часто сторінок ,що використаються з TLB. Даний біт підтримується тільки в процесорах Pentium Pro+.

Якщо біт PSE в регістрі CR4 встановлений, те обидва засобу перетворення можуть використовуватися з одного і того же каталогу сторінок.

Розширення фізичної адреси.

Біт PAE в регістрі CR4 дозволяє розширення фізичної адреси в процесорі Pentium Pro+ з 32 до 36 розрядів. Ця можливість може бути використана тільки при включеному сторінковому перетворенні. Коли розширення фізичної адреси розв'язане, процесор підтримує сторінки двох розмірів: 4Кб і 2Мб. Як і при 32-разрядном адресі, обидва розміру сторінок можуть використовуватися водночас, т. є. Елемент каталогу сторінок може посилатися на 2Мб сторінку або каталог сторінок, що містить покажчики на 4Кб сторінки.

Для підтримки 36-разрядного фізичної адреси в таблицях для сторінкового перетворення зроблені наступні зміни:

    Елементи таблиць стали 64-разрядными для розміщення 36-разрядного адреси. Таким Чином, кожний каталог сторінок і кожна таблиця сторінок може містити 512 елементів;

    В ієрархію сторінкового перетворення додана нова таблиця - таблиця покажчиків на каталог сторінок. Ця таблиця містить чотири 64-разрядных елемента і знаходиться вище каталогу сторінок в ієрархії;

    Базова 20-разрядный адреса каталогу сторінок в регістрі CR3 замінена на 27-разрядный адресу таблиці покажчиків на каталог сторінок. Це 27 старших розрядів фізичної адреси першого елемента таблиці каталогу;

    32-разрядный лінійна адреса відображається на 36-разрядное простір фізичних адрес.

Перетворення лінійної адреси з розширеною адресацією для 4Кб сторінок.

На рисунку 1.23 показаний механізм перетворення лінійної адреси з використанням 4Кб сторінок, коли розв'язане розширення фізичної адреси. Цей засіб перетворення може бути використаний для адресації 220 сторінок, що покриває лінійний адресний простір розміром 4Гб.

Для вибору різноманітних елементів таблиць лінійна адреса ділиться на 4 секції:

    Елемент таблиці каталогу сторінок - біти 30 і 31 містять індекс для входу в таблицю каталогу. Вибраний елемент містить базова фізична адреса каталогу сторінок;

    Елемент каталогу сторінок - біти з 21 по 29 містять індекс для входу в каталог сторінок. Вибраний елемент містить базова фізична адреса таблиці сторінок;

    Елементи таблиці сторінок - біти з 12 по 20 містять індекс для входу в вибрану таблицю сторінок. Цей елемент містить базова фізична адреса сторінки в фізичній пам'яті;

Зміщення - біти з 0 по 11 містять зміщення фізичної адреси всередині сторінки.


Перетворення лінійної адреси з розширеною адресацією для 2Мб сторінок.

На рисунку 1.24 показане, як таблиця каталогу сторінок і каталог сторінок можуть бути використані для відображення лінійної адреси на 2Мб сторінки. Цей засіб сторінкового перетворення може бути використаний для відображення до 2048 сторінок на лінійний адресний простір розміром 4Гб.

Розмір сторінки 2Мб вибирається, коли встановлений біт PSE в регістрі CR4 і встановлений біт PS в елементі каталогу сторінок. Коли ці біти встановлені, лінійна адреса ділиться на три секції:

    Елемент таблиці каталогу сторінок - біти 30 і 31 містять індекс для входу в таблицю каталогу. Вибраний елемент містить базова фізична адреса каталогу сторінок;

    Елемент каталогу сторінок - біти з 21 по 29 містять індекс для входу в каталог сторінок. Вибраний елемент містить базова фізична адреса сторінки розміром 2Мб;

    Зміщення - біти з 0 по 20 містять зміщення фізичної адреси всередині сторінки.

1.3.4 Віртуальні переривання

В процесорах Pentium+ в механізм обробки переривань були додані деякі нові можливості. Розглянемо зміни, що стосуються режиму V86. Коли процесор знаходиться в цьому режимі, засіб обробки переривань залежить від стану різноманітних прапорів і полів:

    VME-прапор (біт 0 в регістрі CR4) - коли він в одиниці, дозволяються розширені можливості по обробці переривань і виключень в режимі V86, а також дозволяється апаратна підтримка прапора VIF;

    IOPL-прапор (біт 12 і 13 в регістрі EFLAGS) - управляє тим, як будуть оброблятися переривання;

    БКПП - бітова карта перенаправлення переривань (32 байта в TSS) - містить 256 прапорів, що показують, як програмні переривання (переривання, що генеруються командою INT n) будуть оброблятися в режимі V86. Програмні переривання можуть спрямовуватися на обробку в поточну програму 8086 або оброблятися в захищеному режимі. Апаратні переривання і виключення завжди спрямовуються в захищений режим.

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

Таблиця 1.5. Обробка переривань і виключень в режимі V86.

Засіб

VME

IOPL

Б в БКПП

Дії процесора

1

0

3

x

Програмні переривання (INT n), виключення і переривання ,що маскуються спрямовуються в захищений режим (через IDT)

2

0

<3

x

Програмні переривання генерують виключення 13. Виключення і переривання ,що маскуються спрямовуються в захищений режим

3

1

<3

1

Те же

4

1

3

1

Програмні переривання, виключення і переривання ,що маскуються спрямовуються в захищений режим

5

1

3

0

Програмні переривання спрямовуються в режим V86 по механізму реального режиму

6

1

<3

0

Програмні переривання генерують виключення 13. Виключення і переривання ,що маскуються обробляються з підтримкою прапорів VIF і VIP

Коли прапор VME=0, переривання обробляються звичайним образом. Коли прапор в одиниці, до обробки переривань привертається новий об'єкт - бітова карта перенаправлення переривань. Вона розташується по базовій адресі карти введення-виведення мінус 32 байта в сегменті TSS. Кожний біт цієї карти показує, буде чи відповідне переривання оброблятися як звичайно в захищеному режимі (б рівному одиниці) або переривання буде перенаправлено на обробку в програму режиму V86 через таблицю переривань розташовану по лінійній адресі 0 (біт рівний 0).

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

    Записує поточні значення регістрів CS і IP в поточний стек;

    Записує в стек регістр прапорів FLAGS з очищеними NT і IOPL;

    Очищає прапор IF в регістрі FLAGS, щоб заборонити переривання;

    Очищає прапор TF в регістрі FLAGS;

    Завантажує регістри CS і IP з таблиці переривань по лінійній адресі 0;

    Починає виконувати програму переривання.

При використанні цього засобу обробки переривань виключення не заносять в стек код помилки.

Обробка переривань по засобу 6. Коли процесор знаходиться в стані, відповідному засобу 6, команди CLI і STI змінюють прапор VIF замість прапора IF. Процесор читає прапор VIP, але ніколи не змінює його. Процесор використає прапори VIF і VIP для визначення того, як обробляти переривання. Якщо відбулося переривання або виключення і прапор VIF скинутий в 0, те процесор виробляє тих же дії, що і в засобі 5. Процесор також обробляє переривання по засобу 5, якщо прапор VIF встановлений в одиницю і відбулося немаскуєме переривання. Якщо відбулося переривання ,що маскується апаратне, те процесор виробляє наступну послідовність дій:

    Процесор викликає виключення 13:

    Переключається в захищений режим на CPL=0;

    Зберігає в PL0-стеці: EIP, CS, EFLAGS, ESP, SS, ES, DS, FS, GS. В стековом образі регістру EFLAGS поле IOPL встановлюється рівним 3 і прапор VIF копіюється в прапор IF;

    Очищає сегментні регістри;

    Скидає прапор VM в регістрі EFLAGS;

    Приступає до виконання вибраного переривання.

    Що рекомендуються дії обробника виключення 13: прочитати прапор VM регістру EFLAGS в стеке. Якщо цей прапор встановлений, викликати монітор V86.

    Монітор V86 читає прапор VIF в регістрі EFLAGS. Якщо цей прапор встановлений, монітор встановлює прапор VIP в регістрі EFLAGS, вертає управління обробнику.

    Обработчик виробляє повернення в режим V86.

    Процесор продовжує виконання програми 8086 без обробки переривання.

Коли програма 8086 виконає команду STI, процесор зробить наступне:

    Перевірить прапор VIP.

    Якщо VIP=0, те процесор скине в 0 прапор VIF.

    Якщо VIP=1, те процесор генерує виключення 13.

    Що рекомендуються дії обробника: викликати монітор V86, щоб дати можливість обробити відкладене переривання. Типові дії монітору V86 - це очистити прапори VIF і VIP в стеке і повернути управління в режим V86 (через обробник). Коли в наступний раз відбудеться апаратне переривання, воно буде оброблятися по засобу 5.

Стан прапорів VIF і VIP не змінюється в реальному режимі або під час переключення між реальним і захищеним режимом.

Розглянемо віртуальні переривання в захищеному режимі. Для дозволу підтримки прапорів VIF і VIP необхідно встановити прапор PVI в регістрі CR4.

Якщо PVI=1, CPL=3 і IOPL<3, те виконання команд CLI і STI не наводить до генерації виключення 13. В цьому випадку ці команди впливають на прапор VIF замість IF.

Якщо відбувається переривання ,що маскується апаратне і прапор VIF=1, те процесор викличе виключення 13. Обработчик виключення може встановити прапор VIP і повернути управління PL3-задаці, що продовжить свою роботу.

Коли програма виконає команду STI, щоб очистити прапор VIF, процесор автоматичні здійснить виклик виключення 13, що зможить обробити відкладене переривання.

Типовий засіб обробки відкладеного переривання полягає в очистці прапорів VIF і VIP в стековом образі регістру EFLAGS і поверненні управління PL3-задаці.

Коли в наступний раз відбудеться апаратне переривання, процесор буде обробляти його нормальним образом.

2 РОЗРОБКА ПРОГРАМНОГО ЕМУЛЯТОРА

    2.1 Постанова задачі

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

Метою даного проекту є створення програми-емулятора якого-або процесора фірми Intel. Даний емулятор передвизначений для отладки програмного забезпечення і навчання фахівців, а значить достатньо буде створити емулятор процесора з точки зору програмного забезпечення, т. є. Емулятор програмної моделі процесора.

Вибір эмулюємого процесора.

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

Проаналізувавши ряд процесорів можна з певністю сказати, що найкращими параметрами володіє процесор 80486. У Порівнянні З іншими процесорами він володіє наступними перевагами:

    Наявність внутрішньої кеш-пам'яті значно знижує навантаження на локальну шину;

    Наявність вбудованого блоку FPU. Алгоритми керуючих систем буяють операціями над числами з плаваючою крапкою;

    Апаратна підтримка функціонально надлишкової двохпроцесорной системи при мінімумі зовнішнього обладнання;

    Можливість зміни розрядність зовнішньої шини. Многие прилади працюють з 8-ми або 16-разрядной шиною даних;

    Контроль вірогідності і що приймаються даних ,що передаються шляхом перевірки паритету;

    Робота процесора на частоті локальної шини. У порівнянні з процесором 80386 дана обставина значно спрощує вимоги до чипсету, бо чипсет повинен працювати на частоті вдвічі меншої (наприклад, для 80386-33Мгц частота локальної шини повинна складати 66Мгц);

    Невисока вартість;

    Розрядність цілочисельного АЛУ і РОНів 32 біти, що достатньо для широкого кола задач ,що вирішуються;

    У порівнянні з іншими сімействами процесорів для сімейства х86 є найбільший обсяг готового програмного забезпечення різноманітного призначення.

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

Вимога до емулятора.

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

На підставі вищезгаданого можна сформулювати наступні вимогу до програми-емулятору процесора:

    Широкий набір эмулюємих команд і блоків процесора;

    Мінімум вимоги до програмного і апаратного забезпечення комп'ютера;

    Можливість покрокового виконання дільниць коду отлаживаємой програми;

    Можливість перегляду стану эмулюємого процесора і оперативної пам'яті при покроковом виконанні команд;

    Можливість внесення змін в вміст регістрів і хід виконання отлаживаємой програми;

    Якомога більш точне відтворення роботи кожної команди;

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

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

    2.2 Вибір мови програмування, платформи і структури програми

Вибір мови програмування.

На даний момент самою гнучкою мовою програмування для створення немережових додатків для настольних систем є мова З, і його функціональне розширення С++, що підтримує концепції об'єктно-орієптованого програмування.

Створення будь-якої більш менш складної програми спрощується при застосуванні принципів об'єктно-орієнтованого програмування. Отже для створення даної програми краще буде вибрати мову С++.

Вибір платформи.

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

На даний момент є декілька операційних систем, що достатньо розповсюджені. Це DOS, Windows, OS/2 і UNIX (LINUX). Перша з них є однозадачной і може працювати практично на будь-якому процесорі сімейства х86, в той час як інші три вимагають для нормальної роботи процесор Pentium і досить великий обсяг оперативної пам'яті. Такі ресурси ще не всякий користувач може собі дозволити. Згідно вимозі до програми-емулятору, вона не повинна подавати високих вимоги до програмного і апаратного забезпечення. Крім Того, програма написана для роботи в DOS буде успішно працювати і на інших перерахованих платформах.

На підставі вищезгаданого доцільно в якості платформи вибрати DOS.

Вибір структури програми.

Для полегшення створення емулятора доцільно розбити програму на два функціональних блоку:

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

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

Такий розподіл добре ще і тим, що безпосередній користувач може самий створити потрібний йому інтерфейс і підключити до нього функціонально незалежну операційну частину без її перекомпіляції. Дана обставина підвищує гнучкість програми. Отже така структура буде оптимальної.

2.3 Операційна частина

    2.3.1 Подання даних

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

В таблиці 2.1 уявлені типи даних, якими оперує процесор.

Таблиця 2.1. Типи даних 80486.

Тип

Довжина в байтах

Примітка

Байт зі знаком

1

Цілий

Байт без знаку

1

Цілий

Слово зі знаком

2

Цілий

Слово без знаку

2

Цілий

Подвійне слово зі знаком

4

Цілий

Подвійне слово без знаку

4

Цілий

Ближній покажчик (16 б)

2

Ближній покажчик (32 б)

4

Дальній покажчик (16 б)

4

Дальній покажчик (32 б)

6

Коротке

4

Речовинний

Довге

8

Речовинний

Повне

10

Речовинний

Як видно з таблиці формати операндів процесора відповідають простим типам мови С++. Отже, для роботи з операндами команд доцільно виробляти з допомогою простих типів мови.

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

Всі основні типи, що використаються в емуляторі зібрані в файлі comand. h.

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

Структура _op. Об'єкт цього типу передвизначений для зберігання інформації, необхідної для доступу до операнду. Якщо операнд знаходиться в пам'яті, поля base, indx, sft, off і seg містять відповідно індекси базового і індексного регістрів, масштабний коефіцієнт, додаткове зміщення і індекс сегментного регістру для формування лінійної ефективної адреси. Якщо операнд знаходиться в регістрі, поле off зберігає індекс цього регістру, а якщо операнд безпосередній, в тому же поле зберігається його безпосереднє числове значення. Безпосередні дальні покажчики зберігаються як два операнда. Поле id містить ідентифікатор розрядність операнда (байт, слово, подвійне слово).

Структура _decoder. Об'єкт цього типу зберігає декодовану команду. В полях структури міститься вся необхідна інформація для виконання команди, а також для її відображення на екрані.

    _op op [3]. Масив містить три операнда команди. Якщо операндів менш, то зайві компоненти не визначені.

    char id [3]. Масив містить інформацію про місцезнаходження операндів. Якщо будь-який операнд не визначений, в відповідному осередку буде-1.

    char comstr [8]. Рядок містить мнемонику команди (без операндів). Поле заповнюється при декодуванні і використовується для подання команди на екрані спільно з полями op і id.

    uchar codes [16]. Масив зберігає кодову послідовність, якої уявлена команда в пам'яті разом зі всіма префіксами. Це поле заповнюється послідовно під час декодування.

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

    char len. Поле містить довжину команди в байтах разом зі всіма префіксами. Те є в ньому міститься індекс останнього певного осередка в масиві codes [].

    char ccc. Поле містить код умови для команд умовних переходів і умовної настанови байтів.

    char seg. Поле містить ознака переопределення сегменту. Якщо перед командою стояє префікс переопределення сегменту, в цьому полі буде міститися індекс сегментного регістру, інакше-1.

    char ad, od. Поля містять ідентифікатори розрядність адреси і операнда відповідно. Перед декодурованням ці поля заповнюються ідентифікаторами поточної розрядність. Якщо перед командою стояє префікс переопределення розрядність адреси (67h) або операнда (66h), дані поля коректуються.

    char rep. Поле зберігає ознака префіксів rep/repe. Якщо один з цих префіксів стояє перед командою, дане поле буде визначене, інакше-1. При декодуванні строкових команд дане поле коректується згідно специфіці команди. При виконанні в розгляд приймаються тільки значення ,що скоректувалися, інакше вміст поля ігнорується.

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

    int err. Поле зберігає ознака помилки, виниклої при вибірці або дешифрації. Якщо виникла така помилка, поле буде містити номер виключення. Безпосередно перед виконанням команди поле перевіряється на предмет наявності виключення, і в залежності від цього виробляється або виконання команди, або виклик виключення. Номер виключення виниклого під час виконання команди заноситься в глобальну змінну error.

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

    comand *p. Покажчик на об'єкт виконання ,що реалізує даної команди. З допомогою цього покажчика в наслідку буде викликаний засіб die для виконання.

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

Об'єднання _eflag. Об'єкт цього типу зберігає вміст регістру прапорів. Об'єднання створене для можливості доступу як до окремих прапорів, так і до регістру в цілому.

Клас _mem. Об'єкт цього типу передвизначений для виконання доступу до оперативної пам'яті емулятора. Конструктор класу створює на диску файл, в що після цього переписує весь перший мегабайт оперативної пам'яті комп'ютера. Єдине поле класу зберігає дескриптор цього файлу. Засіб pageadr виробляє трансляцію лінійної адреси в фізичний при включеній сторінковій адресації. Інші засоби виробляють переадресацію запитань по читанню або записи в пам'ять до дискового файлу.

Класи _gdt, _idt. Об'єкти цих типів подають регістри GDTR і IDTR відповідно, а також інтерфейс для доступу до глобальної дескрипторної таблиці і таблиці переривань. Класи містять по два поля: base і limit, в яких містяться покажчики і розміри таблиць. Засіб get вертає лінійну адресу запрошеного дескриптора, а засіб geta слово атрибутів цього дескриптора.

Клас _reg. Об'єкти цього типу об'єднані в масив з восьмих елементів і подають собою файл регістрів загального призначення. Поле r містить числове значення операнда в регістрі, а засоби виробляють звертання як до цілого регістру, так і до його частин.

Клас _sreg. Об'єкти цього типу об'єднані в масив з шести елементів і подають собою файл сегментных регістрів. Поле sel зберігає селектор. Поля base і limit, базова лінійна адреса і розмір сегменту відповідно, а поле access зберігає слово атрибутів сегменту. Поле id передвизначене для ідентифікації сегментного регістру. Коли створюється масив примірників, конструктор класу заносить в це поле вміст змінної identify, а після цього збільшує цю змінну на одиницю. Таким Чином створюються об'єкти, що “знають”, які регістри вони подають. Обработчик перевантаженого оператора “=” виконує команду завантаження сегментного регістру. При Цьому на підставі поля id, глобальної змінної cpl, а також поточного режиму процесора виконується перевірка можливості завантаження регістру. Якщо завантаження можлива, відбувається звертання до об'єкту типу _gdt або _ldt для її виконання. Інакше в змінну error заноситься номер виключення, а в змінну ercode, код помилки. Інші засоби класу виконують доступ до операндам по запису або читанню шляхом виклика відповідних засобів об'єкту типу _mem. В цих засобах також виробляється перевірка прав доступу до сегменту і “генерація” виключення в випадку їхнього порушення.

Клас _ldt. Об'єкт цього класу подає собою регістр LDTR і інтерфейс доступу до локальної дескрипторної таблиці. Даний клас схожий на попередній за винятком того, що засоби доступу замінені на засоби get і geta, що повністю идентичны відповідним засобам класу _gdt. Таким Чином, даний клас об'єднує властивості класів _gdt і _sreg, що по суті і відбувається в реальному процесорі.

Клас _tss. Об'єкт цього класу подає собою регістр TR і інтерфейс для доступу до сегменту стану задачі. Клас схожий на попередній, але має власні засоби для доступу. Засіб stack виробляє переключення стека при міжсегментної передачі керування зі зміною рівня привілей. Засіб port провадить перевірку можливості доступу до порту введення/висновку шляхом аналізу відповідного б в БКВВ. Засіб swtask виробляє переключення задач з виконанням відповідних перевірок і “генерацією” виключення в випадку неуспіху.

Клас _comand. Цей базовий клас є предком для класів, що реалізують команди процесора. Засіб mod виконує дешифрацію mod і sib байтів. Засоби deasm і die проголошені віртуальними і підлягають перевантаженню в кінцевих класах для реалізації декодування і виконання конкретних команд або груп команд.

Далі в файлі слідують оголошення класів, що реалізують конкретні команди і групи команд.

В модулі structs.cpp знаходиться реалізація засобів описаних класів (за винятком класу _mem, засоби якого реалізовані в окремому модулі mem. cpp в меті можливості заміни реалізації оперативної пам'яті емулятора). В модулі structs. cpp виробляються також оголошення об'єктів описаних вище класів, а також реалізація деяких сервисних процедур, як те формування виконавчої лінійної адреси на підставі об'єкту типу _op, збереження/відновлення вмісту регістрів з сегменту стану задачі і ін.

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

Реалізація засобів класів команд і груп виробляється в модулях com_ands.cpp і com_movs. cpp. Арифметичні і логічні команди реалізовані в першому модулі, а команди пересилки і керування в другому.

Процедури керування декодуванням і виконанням зібрані в модулі control. cpp. Цих процедур чотири:

    init. Викликається при старті програми і виконує створення примірників класів команд. Покажчики на примірники заносяться в масив покажчиків mas на 256 елементів. При декодуванні виробляється вибірка першого байта команди і використання його вмісту в якості індексу в цьому масиві. Замість нереалізованих команд створюється примірник базового класу comand, і у разі звертання до ним виконується повернення з помилкою.

    int_call. Процедура виконує виклик переривання або виключення.

    step. Дана процедура викликається при виконанні декодирования команд. В якості параметру передається знов створений примірник класу _decoder. При поверненні примірник буде містити декодовану команду. В цій же процедурі виробляється дешифрація всіх префіксів команди.

    exec_com. Ця процедура виконує керування виконанням команди шляхом виклика засобу die відповідного об'єкту.

2.3.2 Деколування і виконання команд

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

В зв'язку з вищезгаданим вибір ефективного засобу декодування дозволить значно прискорити емуляцію команд і зменшити тимчасові параметри декодування і виконання.

В даній ситуації применими три засоби декодування.

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

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

Третій засіб заснований на застосуванні віртуальних функцій. Виклик віртуальних функцій також заснований на застосуванні таблиць, що не зменшує швидкодії у порівнянні з попереднім засобом. Але цей засіб дозволяє уникнути громіздкого тексту і реалізується при мінімумі мовних операторів. Цей засіб дозволяє створювати ще і ієрархії команд (конструкція case також дозволяє створювати вкладеність, але при отладці виникають ситуації, коли отладчик не може виконати рядок операторів із-за цієї вкладеності). Кожна команда або група команд має свої процедури, що одержують управління тоді, коли конкретна команда вже виявлена, і залишилося тільки виявити форму і типи операторів. Це дозволяє групувати схожі команди, що відрізняються тільки декількома бітами.

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

В основі засобу лежить властивість спадкування, що полягає в тому, що змінної типу покажчика на батьківський клас можна привласнити покажчик на дочірній клас. В батьківському класі є два віртуальних засобу: deasm і die для декодування і виконання відповідно. В дочірніх класах ці засоби перевантажуються засобами, що обробляють тільки свою команду. Таким Чином, маючи тільки покажчик на команду можна виробити її виконання шляхом виклика засобу die, передавши йому відомості про операнди. Отримати покажчик на команду можна, виконавши вибірку першого байта команди і використавши цей байт як індекс покажчика в масиві.

В пам'яті створюється масив, елементи якого мають тип покажчика на базовий клас. В модулі control. cpp є процедура init, що виробляє ініціалізацію масиву покажчиками на динамічні створені примірники класів команд і груп. Хоча текст цієї процедури і має порядний обсяг, але він лінійний і читабельний (в тексті немає ветвленнь).

Декодування.

Для декодування необхідно створити примірник структури _decoder і передати його знаходящейся в модулі control. cpp процедурі step. Дана процедура реалізує стадію 1 декодування в конвейєрі процесора. На цій стадії виробляється дешифрация всіх префіксів і формування RISC-інструкції для виконання. Дана функція також виробляє дешифрацію префіксів, а в якості RISC-інструкції використовується покажчик на об'єкт типу класу конкретної команди. Дешифрация виконується слідуючим чином. З сегменту кодів за адресою, записаному в поле baseadr, вибирається байт. Якщо це префікс, виробляється відповідне корегування полів структури і повторна вибірка по наступній адресі. Якщо вибраний не префікс, виробляється виклик засобу deasm по покажчику з масиву mas, використовуючи вміст вибраного байта як індекс елемента масиву. Примірник структури _decoder передається засобу в якості параметру.

Засіб deasm реалізує стадію 2 декодування. На цій стадії формуються виконавчі адреси операндів і видаються відповідні запитання на читання (якщо дозволяє попередня команда). В даному засобі дешифруються байти mod і sib і заповнюються відповідні поля операндів. Для спрощення алгоритму запитання на читання не видаються. Також не формуються лінійні адреси операндов, бо може з'явитися необхідність відобразити мнемонику команди на екрані, а зберігати двічі одна і та же адреса недоцільно. Тут же виробляється заповнення поля *p покажчиком this для наступного виконання команди. Декодування може бути перерване виникненням якого-або виключення. При цьому в поле err записується номер виключення і виробляється повернення з засобу. Згодом замість виконання цієї команди буде вироблена обробка виключення.

При поверненні з процедури декодування, передана їй структура буде заповнена, і команда готова до виконання.

Виконання.

В процесорі 80486 присутня передвиборка команд і конвейєризація. В зв'язку з цим на різноманітних стадіях обробки може бути біля двох десятків команд. В функції емулятора не входить повне відтворення конвейєра реального процесора, тому можна обмежиться передвиборкой однієї команди. Для створення повного еквівалента конвейєра необхідно також в точності повторити роботу всіх внутрішніх блоків процесора, що виходить за рамки даного проекту.

Виконанням команд управляє процедура exec_com, що знаходиться в модулі control.cpp. Кожний виклик цієї процедури наводить до виконання однієї команди. В модулі проголошений масив з двох змінних типу _decoder. Процедура виконує команду, що знаходиться в нульовому елементі масиву, копіює в цей елемент вміст першого елемента і викликає процедуру step з першим елементом в якості параметру, попередно викликавши його конструктор. Таким чином досягається часткова емуляція передвиборки. Якщо була виконана команда переходу, процедура викличе декодування для обох елементів масиву. Процедура exec_com здійснює також обчислення вмісту регістру eip при лінійному характері коду. При виконанні команд переходу виконуючі засоби цих команд самі виробляють корекцію покажчика команд. Якщо перед строковой командою стояє префікс повторення, процедура не буде інкрементувати покажчик команд до обнулення регістру-лічильника (е)сх. В цьому випадку також не буде вироблятися декодування черговий команди.

В виконавчому механізмі викликає інтерес ще і вибірка операндів. В реальному процесорі стадії 2 декодування команди видається запитання на читання операнда з пам'яті (якщо такий є). Далі команда надходить на стадію виконання. Більшість запитань задовольняється з кэша, тому на цій стадії операнд надходить в АЛУ. В емуляторі обчислення ефективної адреси, сегментація і сторінкове перетворення виконуються на стадії виконання. Процедура conv_adr з модуля structs. cpp виконує компоновку ефективного зміщення операнда в сегменті. Далі зміщення надходить на блок сегментації, реалізований засобами класу _sreg. Виробляється виклик одного з цих засобів шляхом об'єкту, відповідного потрібному сегментному регістру. Після перевірки прав доступу запитання передається засобу типу _mem. Якщо включений сторінковий механізм, засіб pageadr виробляє трансляцію лінійної адреси в фізичний, а також перевірку прав доступу до сторінки. Далі ДОСу передає запитання на читання дільниці своп-файлу. При поверненні по ланцюжку передається безпосереднє значення операнда. Даний механізм доступу уявлений на рисунку 2.1.


Даний ланцюжок може перерватися із-за порушень прав доступу.

Якщо же операнд знаходиться в регістрі, виробляється виклик засобу відповідного об'єкту типу класу, що подає цей регістр.

2.4 Розробка інтерфейсу з користувачем

    2.4.1 Постанова задачі

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

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

На підставі вищезгаданого слідує зупинитися на багатовіконному інтерфейсі.

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

Для прискорення процесу навчання користувача роботі з емулятором слідує використати набір керуючих комбінацій клавіш з якої-нибудь добре відомої програми, наприклад, середи Borland C++.

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

Всіма вищенаведеними вимогою буде володіти інтерфейс побудований на базі бібліотеки Turbo Vision фірми Borland. Але результуючий виконавчий файл після приєднання операційної частини буде дуже більшим, що ускладнить отладку і ужорсточить вимогу до вільної пам'яті.

    2.4.2 Розробка бібліотеки базових класів

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

Допоміжні типи.

Для зберігання координат об'єктів і їхніх розмірів доцільно розробити допоміжні типи.

    Клас Tpoint. Об'єкт цього типу зберігає двумірні координати або розмір. Конструктор класу виконує перетворення двох чисел X і Y до типу класу. Перевантажені оператори “+” і “-“ дозволяють виконувати арифметичні дії над обома координатами відразу.

    Клас Trect. Об'єкт цього типу зберігає інформацію про прямокутник: координати верхнього лівого куту, координати правого нижнього куту і розмір (для вигоди). Конструктори дозволяють створювати об'єкт класу на основі або чотирьох координат, або на основі двох об'єктів типу Tpoint. Перевантажені оператори “+” і “-“ дозволяють змінювати розмір і положення прямокутника, а оператори “|” і ”&” - виконувати бульові функції.

    Клас Tmask. Об'єкт цього типу зберігає область висновку і дозволяє виконувати з нею бульові функції. Справа В Тому, що при перерисовці вмісту вікна воно може частково перекриються іншим вікном, і щоб при висновку не перерисовувати всі вікна верхнє вікно вичте логічні свою область висновку з області висновку перекриваючого вікна. Процедура, що буде позичатися безпосередно висновком, перевірить область і не буде виводити перекриття знакомісця.

    Клас TEvent. Об'єкт цього типу зберігає інформацію про виниклу подію. Існує два джерела подій: клавiатура і внутрішній об'єкт. При натиску клавіші всім об'єктам передається контейнер події, в якому містяться код клавіші і стан службових клавіш. При Необхідності оновити інформацію в інших вікнах об'єкт генерує подію оновлення, в цьому випадку передається контейнер, в якому міститься код команди оновлення. Тип події (клавіша або команда) зберігається в поле what.

Видні об'єкти.

Для відображення інформації на екрані служать видні об'єкти. Видний об'єкт подає собою область висновку обмежену прямокутником. До видних об'єктів відносяться вікна, рядки введення, колонки вибору і ін. Всі ці класи є нащадками класу TView.

    Клас TView. Об'єкт даного класу подає на екрані прямокутну область, заповнену яким-або кольорем. Засоби класу дозволяють створювати ієрархічне дерево об'єктів і маніпулювати ними. Всі об'єкти на екрані спадкуються від цього класу. Всі засоби класу проголошені як віртуальні і можуть бути перевантажені в похідних класах. Даний клас дозволяє зосередити всіх дії, зв'язані з прорисовкою і арбітражем подій в одному місці і засобом спадкування встроювати їхн в інші класи. Підлеглі об'єкти розташовуються у кольцевому буфері з дуплексними зв'язками. Об'єкт, що знаходиться в кореневому вузлі буферу вважається поточним і перекриваючим всі інші об'єкти даної групи.

    Клас TPackMenu. Об'єкт даного класу подає елемент меню. Спадкується від TView і зберігає інформацію про назву пункту меню, гарячому клавіші і покажчик на підміню. Допускається відсутність якого-або параметру. Для функціонування елементів меню необхідні декілька інші відношення в ієрархії, тому деякі функції базового класу перевантажені і додані нові зв'язки.

    Клас TMenu. Об'єкт даного класу передвизначений для зв'язку елементів меню з іншими об'єктами. Цей об'єкт як правило невидим і служить для передачі подій.

    Клас TWindow. Об'єкт даного класу подає вікно на екрані. В полях класу знаходяться ім'я вікна, допустимий розмір і покажчик на локальне меню. Засоби класу виконують зміну розміру і положення вікна на екрані. Спадкується від TView.

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

    Клас TList. Об'єкт даного класу подає список об'єктів типу рядка. Список завжди розташується вертикально. Весь список в пам'яті не зберігається. При створенні цього об'єкту конструктору в якості параметру передається покажчик на функцію. При Необхідності висновку рядка на екран Об'єкт списку викликає цю функцію з необхідними параметрами для формування рядка.

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

    Клас TSelect. Об'єкт даного класу подає собою групу взаємозависимих настанов. Він дозволяє вибрати один пункт з списку можливих. Пункти розміщуються вертикально і мають ліворуч ознаку настанови в вигляді звездочки в круглих дужках.

    Клас TLabel. Об'єкт цього класу подає собою рядок заголовку над об'єктом на екрані. Він встроюються в кольцевий буфер замість об'єкту і транслює події і команди, відрізняя команду включення або виключення фокуса, те є ознаки поточного об'єкту. При включенні фокуса ім'я помітки підсвічується зеленим кольорем, а при виключенні - кольорем тла.

    Клас TButton. Об'єкт даного класу подає собою кнопку. Для кнопки існує ім'я і гарячий клавіша при натиску введення, коли фокус знаходиться на кнопці або натиск гарячого клавіші в області чинності кнопки об'єкт даного класу поміщає в чергу подій передопреділену команду.

    Клас TApp. Об'єкт даного класу здійснює зв'язок з ресурсами комп'ютера: клавiатурою і відеоадаптером. Спадкується від класу TView, але перевантажує всіх віртуальні функції зв'язані з трансляцією подій і запитань на перерисовку. Для реєстрації і зберігання подій є черга з політикою FIFO. Включення інтерфейсу в роботу здійснюється шляхом створення примірника даного класу і виклика засобу run (). При цьому відбувається очистка екрану і створення рядка статусу.

    2.4.3 Опис роботи бібліотеки базових класів

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

Всі класи видних об'єктів спадкуються від класу TView, в якому зосереджені всі основні функції по керуванню об'єктами.

При створенні об'єкту йому звичайно передаються координати лівого верхнього куту і розмір. При цьому об'єкт включається в кольцевий буфер якого-або вже існуючого об'єкту. Предком об'єктів верхнього рівня є об'єкт класу TApp. Для включення об'єкту в буфер використовується процедура add (). Об'єкт може бути виключений з буферу викликом засобу sub> ().

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

Кожний об'єкт володіє мінімальним набором функцій висновку. В даний набір входять:

    Функція висновку рядка з означеним атрибутом;

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

    Функція заповнення прямокутної області певним символом з означеним або поточним атрибутами;

    Функція заповнення прямокутної області означеним атрибутом без зміни вмісту символьної частини знакомісця.

Виклик будь-який з вищенаведених функцій проводить до передачі керування тієї частини об'єкту, що була наслідувана від класу TView. Базові функції даного класу створюють область висновку типу TMask необхідного розміру і заповнення цієї області переданими символами і атрибутами. Далі покажчик на область висновку передається предку, що виробляє виклик функції workmask () перекриваючих об'єктів. Ця функція виробляє виключення знакомісць, що безпосередно перекриваються даним об'єктом. Так по ієрархічному дереву область висновку доходить до об'єкту класу TApp, що виробляє аналіз області і висновок неперекритых знакомісць на екран.

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

Слідує відзначити, що підлеглий об'єкт не може “вылезти” за область свого предка. Дана обставина не виконується тільки для об'єктів, що подають пункти меню. Їхні нащадки розташуються поверх зі зміщенням.

    2.4.4 Опис об'єктів віконного інтерфейсу

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

    Клас TCpu. Об'єкт даного класу подає собою вікно з дізасемблірованим фрагментом коду відлагодживаємої програми. В конструкторі об'єкту створюється примірник списку для висновку рядків команд. Функція handleEvent () перевантажена з метою відспостереження комбінацій клавіш, керуючим процесом виконання програми.

    Клас TFile. Об'єкт даного класу подає собою вікно зі списком файлів поточного каталогу. Тут також використаний об'єкт типу списку. При створенні об'єкту відбувається читання поточного каталогу і виділення файлів типу“. com” і”. exe”, а також вкладених директорій.

    Клас TRegs. Об'єкт даного класу подає собою вікно, в якому відображений стан регістрів загального призначення процесора ,що емулюється. Кожний рядок містить метку з ім'ям регістру і рядок введення з вмістом регістру. Натиском клавіші “Tab” виробляється зміна фокуса на наступний по списку регістр. В якості допустимих символів в рядок введення передаються символи, що використаються для відображення шістнадцятеричних чисел.

    Клас TSregs. Об'єкт даного класу подає собою вікно, в якому відображений стан сегментних регістрів, а також регістру локальної таблиці дескрипторів і регістру сегменту стану задачі. Кожний рядок містить метку з ім'ям регістру і три рядки введення для бази, розміру і атрибутів регістру. Для рядків введення бази і розміру застосовуються символи, що використовуються в написанні шістнадцятеричних чисел, а для рядка введення атрибутів - символи для позначки двоїчних чисел.

    Клас TSysReg. Об'єкт даного класу подає собою вікно, в якому відображається вміст системних регістрів. В дану групу війшли: покажчик команд EIP, системні регістри CRx, а також регістр таблиця глобальних дескрипторів і регістр таблиці переривань. Для відображення також використовуються метки і рядки введення.

    Клас TFags. Об'єкт даного класу подає собою вікно, в якому відображається вміст регістру прапорів. Для відображення прапорів і зміни їхнього стану застосований об'єкт типу TSetBox. Коли вікно активно (знаходиться в фокусі) клавішами зі стрілками можна міняти поточний прапор, а клавішею пробілу або встановлювати його, або скидати.

    Клас TDump. Об'єкт даного класу подає собою вікно, в якому відображається вміст вибраної дільниці пам'яті. Для відображення пам'яті використаний об'єкт типу списку. Це вікно має локальне меню, що викликається по клавішам “Alt+F10”, і служить для підтримання діалога з користувачем при зміні адреси дільниці ,що відображається або засобу подання інформації в вікні.

Клас TStack. Об'єкт даного класу подає собою вікно, в якому відображений поточний кадр стека відлагодживаємої програми. В кожному рядку відображається зміщення і вміст осередка. Розрядність осередка залежить від розрядність сегменту стека (16 або 32 розряду). Для відображення кадру стека використаний об'єкт типу списку. Поточний осередок стека (на яку вказує регістр (e) sp) помічається стрілкою ліворуч від адреси.

3 РОЗРОБКА АПАРАТНОЇ ЧАСТИНИ ЕМУЛЯТОРА

    Постанова задачі

При проектуванні материнських плат спецЕОМ виникають труднощі з їхньою отладкою. Застосування же стандартних материнських плат не завжди відповідає поставленій задачі, бо архітектура може і не співпадати. Для перевірки правильності функціонування чипсета на допомогу можуть прийти внутрисхемні емулятори процесорів. Під внутрисхемним емулятором в даному випадку розуміється цифрова схема, що для зовнішньої апаратури веде себе в точності як і реальний процесор, але надає можливості виробляти отладку як в покроковому режимі (одинковими синхроімпульсами), так і в динамічному режимі на частоті синхросигнала або близької по значенню, або відповідної реальної.

Внутрисхемный емулятор необов'язково повинен емулювати весь процесор. Достатньо буде побудувати емулятор інтерфейсного блоку, а емуляцію внутрішніх блоків може взяти на себе програмний емулятор.

В попередніх розділах було доведена оптимальність застосування в спецЕОМ процесора i486. Отже і внутрисхемний емулятор повинен емулювати роботу іменно цього процесора.

Вивчивши протокол роботи інтерфейсу процесора можна сформулювати вимогу до внутрисхемного емулятора:

    Максимальна частота синхросигнала повинна бути якомога ближче до реальної частоти (33МГц);

    Протокол роботи з материнською платою повинен повністю відповідати реальному протоколу;

    Максимальна частота анулювання рядків кеш-пам'яті першого рівня складає 16МГц (цикл анулювання позичає два такту). Жодна шина не зможить підтримувати таку інтенсивність запитань. Отже кеш-пам'ять першого рівня необхідно виконати апаратно;

    Плата емулятора повинна працювати з будь-яким IBM-сумісним комп'ютером і підтримувати з ним найбільшу можливу швидкість обміну.

Проаналізувавши вищенаведені вимога можна зробити наступні висновки:

    В якості элементної бази слідує застосовувати серію логічних мікросхем, що забезпечують типовий час затримки не більш 3-4 нс.

    Час вибірки для мікросхем статичної пам'яті, що буде використовуватися в кэше не повинно перевищувати 15 нс.

    Для забезпечення необхідної швидкості обміну може використовуватися шина ISA, а влаштування на ній повинно працювати як влаштування пам'яті. Це дозволить розвивати піковую швидкість передачі до 50Мб/з.

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

    3.2 Розробка структури

Аналіз необхідного обладнання.

В обов'язку інтерфейсного блоку процесора входить формування молодших розрядів адреси А3-А2, розрядів вибору байтів ВЕ3-ВЕ0 і керуючих сигналів. Інформація що надходить на старші розряди шини адреси і шину даних не змінюється. Отже блок буде обробляти чотири розряди адреси. Запитання, що надходять в блок від програмної частини повинні включати в себе:

    32-розрядну фізичну адресу запитання;

    16 байт даних запитання;

    Довжину запитання;

    Тип запитання.

Апаратна частина повинна вертати сигнал готовності до прийому чергового запитання і результат попереднього.

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

Адреса запитання транслюється тільки в одному направленні. Але в циклах анулювання рядків кеш-пам'яті 28 старших розрядів повинні читатись з зовнішньої шини адреси.

Кэш-пам'ять є чотирьохвходовою. Вона має 128 банків по чотири рядки в кожному. В рядку міститься тег і 16 байт даних. При цьому цикл анулювання рядка не повинен перевищувати двох тактів зовнішньої шини.

Щоб анулювати рядок її необхідно спочатку знайти, причому пошук не повинен позичати більш одного такту. Значить схема повинна водночас аналізувати чотири тега по 21 розряду. Такий аналізатор позичить значне місце, а значить скоріше усього не підійде для рішення задачі.

В зв'язку з цим можна зробити допущення. Обмежитися двохвходовим кешем і збільшити кількість банків до 256. При цьому водночас будуть аналізуватися два тега по 20 розрядів. Ця обставина значно зменшує апаратурні витрати і незначно погіршує ефективність кеша, а значить допущення прийнятно.

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

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

Опис структури.

На підставі усього вищезгаданого можна попередно скласти структуру апаратної частини. Влаштування має дві основні шини: шину адреси на 28 розрядів і шину даних на 32 розряду. На шині адреси є два джерела: регістр адреси запитання і зовнішня шина адреси. Молодші вісім розрядів регістру адреси запитання реалізовані на двоїчном лічильникові. На шині даних присутні чотири джерела: регістр даних запитання, матриця пам'яті даних кеша, зовнішня шина даних і шина даних ISA. Матриця пам'яті тегів має довжину 40 розрядів, на що може надходити інформація з шини адреси. Два влаштування порівняння виконують порівняння тегів з інформацією на шині адреси. Результати порівняння разом з бітами вірогідності і бітами LRU надходять на вхід контролера кеш-пам'яті, реалізованого в вигляді автомату з жорсткою логікою. Молодші розряди адреси, довжина запитання і дані типу запитання надходять з шини даних ISA і запам'ятовуються на регістрі. Далі знаходиться суматор для обчислення стартової адреси запитання і регістри поточної адреси і довжини. На виходах цих регістрів стояє схема, що на підставі поточної довжини і адреси, а також сигналів динамічної зміни розрядність формує молодші розряди адреси і сигнали вибору байтів. Всім цим управляє центральний контролер, собою автомат ,що подає на жорсткій логіці. Сигнали керування кешем формуються комбинаційною схемою на підставі стану автомату контролера і внутрішніх змінних. Сигнали керування всім влаштуванням формуються комбинаційною схемою на підставі стану автомату центрального контролера і сигналів зовнішньої шини керування. Для збігу неправдивих спрацюваннь майже всі сигнали зовнішньої шини керування заклацуються на регістрі в кінці кожного такту. Що виробляються контролером відповідні сигнали з'являються в наступному такті. Все вищезгадане не суперечить логіці роботи реального блоку процесора. З точки зору шини ISA влаштування є швидкою пам'яттю обсягом 21 байт і що починається за адресою 0C8000h.

    3.3 Розробка принципової схеми

Елементи, що забезпечують трансляцію і зберігання параметрів запитання, а також елементи пам'яті можуть бути виконані на мікросхемах середньому ступені інтеграції, бо корпуса мікросхем, як правило, використовуються максимально. Інше діло - комбинаційні схеми формування керуючих сигналів. В них використовується безліч різнотипних простих логічних елементів. Для зменшення кількості корпусів на платі доцільно застосувати для побудови комбинаційних керуючих схем мікросхеми великий ступеню інтеграції. До таких схем відносяться логічні матриці, що програмуються. В вітчизняній елементній базі присутня полузаказна мікросхема К1520ХМ2, виконана по технології ЕЗЛ з двоступінчастим переключенням струмів. Микросхема подає собою набір з 72 топологічних осередків, в яких можуть бути реалізовані практично будь-які елементи. Є сенс застосувати дану мікросхему для реалізації керуючих автоматів і комбинаційних схем.

    3.4 Опис роботи влаштування

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

Всі запитання повинні поміщатись в виравнену шістнадцятибайтну область адрес пам'яті або введення-виведення.

Перед видаванням запитання бажано переконатися в тому, що апаратура готова їхн прийняти. Біт готовності можна отримати за адресою 0C8014h. Інакше цикл обміну по шині ISA буде затриманий до приведення апаратури в стан готовності.

В таблиці 3.1 наведена область пам'яті для обміну з влаштуванням.

Таблиця 3.1 Область пам'яті обміну.

Адреса

Довжина, байт

Тип обміну

Вміст

0C8000h

16

Запис

Дані для запису

0C8000h

16

Читання

Дані для читання

0C8010h

4

Запис

Адреса запитання

0C8014h

1

Запис

Тип запитання

0C8014h

1

Читання

Байт стану

0C8015h

1

Запис

Довжина запитання

Дані слідує читати і записувати тільки вирівненими словами. Те же відноситься до запису адреси, типу запитання і його довжини. Читання байта стану можна виробляти будь-яким засобом, але адреса повинна відповідати.

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

Запитання читання операндів.

Після запуску механізму трансляції відбувається підсумовування початкової адреси і довжини запитання для одержання стартової адреси. Водночас відбувається пошук даних в кеш-пам'яті. Якщо дані знайдені, всі 16 байт за чотири такту синхронізації переписуються в файл даних, і обслуговування запитання закінчується. Після цього дані можна прочитати з файлу даних. Якщо відбувся кеш-промах і зовнішня шина вільна, генерується запитання на читання даних і активізується сигнал ADS. Якщо за такт до прибутку сигналу RDY або BRDY прийшов сигнал KEN і заповнення кеша розв'язане, довжина запитання автоматичні збільшується до 16, і дані що надходять з зовнішньої шини даних записуються окрім файлу даних ще і в рядок кеш-пам'яті.

Якщо стартова адреса запитання непарний або довжина запитання перевищує 12 байт, формується неактивний сигнал BLAST, в відповідь на що чипсет повинен відповісти сигналом BRDY замість RDY. Якщо це відбулося цикл вважається пакетним, сигнал ADS більш не видається, а формування наступної адреси відбувається автоматичні по наступному правилу: якщо стартова адреса непарна - поточна адреса зменшується, інакше - поточна адреса збільшується.

Запитання запису операндів.

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

4 ТЕХНІКО-ЕКОНОМІЧНЕ ОБГРУНТУВАННЯ ДИПЛОМНОГО ПРОЕКТУ

4.1 Вихідні дані і умови

Програмний продукт "Емулятор основних функціональних блоків мікропроцесору i486" (в подальшому "емулятор") подає собою інтегровану середу для вивчення і перевірки знань в області програмування сучасних мікропроцесорів типу i486 на мові Ассемблера на лабораторних роботах по дисципліні "Мікропроцесорні засоби і системи" по темам:

- мікропроцесор i486, захищений режим;

- мікропроцесор i486, сторінкова адресація.

Даний програмний продукт розроблений для роботи на ПЕОМ на базі більш ранніх мікропроцесорів фірми Intel типу 80286 і розрахований на користувачів, що мають необхідні знання в області програмування мікропроцесорів типу i486 в машинних кодах.

Емулятор має простий і зрозумілий інтерфейс з користувачем, достатньо зручний в звертанні.

4.2 Аналіз ринку подібних розробок

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

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

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

4.3 Проектно-конструкторська документація

Для розробки проекту необхідна наступна документація:

- технічне завдання на розробку емулятора;

- комплект документації на мову програмування C++;

- комплект довідкової документації по архітектурі і програмуванню мікропроцесору i486.

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

- персональний комп'ютер IBM i80x86 або з ним сумісний;

- оперативна пам'ять обсягом не менше 2 Мб;

- будь-який тип відеоадаптера і дісплею для роботи в текстовому режимі;

- операційна система MS DOS 3.30 або більш пізньої версії;

- наявність накопичувача на гнучких магнітних дисках або жорсткого диску.

До розробленого програмного продукту додається наступна документація:

- опис програми - відомості про логічну структуру і функціонування програми;

- керівництво програміста - відомості для експлуатації програми;

- керівництво оператора - відомості для забезпечення процедури спілкування оператора з обчислювальною системою в процесі виконання програми.

4.4 Планування термінів розробки проекту

Перелік етапів і робіт розробки проекту уявлений в таблиці 1, де прийняті наступні позначки:

А) П - інженер-програміст;

Б) К - керівник розробки;

В) Е - економіст-консультант.

З таблиці видно, що на розробку проекту інженер-програміст з місячним окладом 160 грн. Витрачає 96 днів, керівник з місячним окладом 190 грн. витрачає 35 днів, економіст-консультант з місячним окладом 120 грн. витрачає 3 дні.

Таблиця 1 - Зведена таблиця тривалості і трудомісткості

Найменування етапу

Найменування роботи

Виконавець,

Посада, спеціальність

Кількість виконателей

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

1

2

3

4

5

1. Подготови-тельная стадія

    Підбір, вивчення літ.

    Вивчення і аналіз аналогічних розробок

    Економічне обгрунтування доцільності виконання проекту

    Укладання ТЗ

    Погодження ТЗ

    Укладання плану і калькуляція розробки

П, К

П

К, Е

К

К

К, Е

2

1

2

1

1

2

2

5

1

1

3

2

2. Теоретична розробка

    Уточнення техніко-економічного обгрунтування

    З'ясування принципових шляхів створення системи

    Уточнення загального обсягу робіт, термінів виконання і затрат

П, К

П

П, К

2

1

2

1

1

1

3. Практична реалізація

    Розробка різноманітних варіантів побудови

    Розробка структури

    Укладання списку необхідної документації

П, К

П

П, К

2

1

2

5

3

3

4. Доопрацювання системи

    Розробка блок-схем програм

    Реалізація програм

    Розробка блок-схем інтерфейсу

    Реалізація бібліотеки інтерфейсу

    Тестирование

    Розробка комплексу системи допомоги

    Підготовка звіту

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

П

П

П

П

П

П

П

П

1

1

1

1

1

1

1

1

7

14

7

14

3

3

3

3

5. Заключний етап

    Тестування програми на комплексі задач

    Навчання персоналу

    Досвідчена експлуатація ПО

    Аналіз експлуатації ПО

    Внесення змін в ПО ітехнічну документацію

П, К

П

П, К

П, К

П

2

1

2

2

1

7

3

7

2

7

4.5 Фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекту включаються:

- затрати на заробітну плату;

- відрахування в фонд соц. страхування (4.5%);

- відрахування в пенсійний фонд (25%);

- відрахування в фонд Чорнобиля (6%);

- відрахування в фонд зайнятості (1%);

- додаткові витрати:

1) затрати на дискети;

2) затрати на літературу;

3) затрати на папір і смугу для принтера;

- видатки на оренду машинного часу.

Затрати на заробітну плату розраховуються по формулі:

Ззп=К* (МО*QДР)/24*Кпр, (7.1)

Де:

Ззп - затрати на заробітну плату;

К - кількість фахівців;

МО - місячний оклад;

Qдр - кількість днів роботи;

Кпр - коефіцієнт премії.

Затрати на заробітну плату інженерів-програмістів:

Зп. Пр=(160*96)/24*1. 25=800 (грн).

Затрати на заробітну плату керівника проекту:

Зкп. Зп=(190*35)/24*1. 25=346.36 (грн).

Затрати на заробітну плату економіста-консультанта:

Зе. Зп=(120*3)/24*1. 25=18.75 (грн).

Загальна заробітна плата:

Ззп=Зп. Пр+Зкп. Зп+Зе. Зп, (7.2)

Ззп=800+346.36+18.75=1165.11 (грн).

Додаткові витрати розраховуються по наступній формулі:

Вд=Здс+Зл+Зб, (7.3)

Де:

Вд - додаткові витрати;

Вдс - витрати на дискети (1 грн);

Вл - витрати на літературу (20 грн);

Вп - витрати на папір і смугу для принтера (15 грн).

Вд=1+20+15=36 (грн).

Вартість машинного часу:

Вмч=K*Qдр*7*Сч, (7.4)

Де:

Вмв - витрати на оренду машинного часу (при роботі програміста 64 дня на машині);

K - кількість фахівців;

Qдр - кількість днів роботи;

Сч - ціна однієї години машинного часу.

Вартість однієї години машинного часу визначається з розрахунку:

- річна заробітна плата основна і додаткова:

1) керування ОЦ - ЗПУ=12 250=3000 (грн);

2) обслуговування - ЗПО=160 12=1920 (грн);

3) ремонт - ЗПР=800 (грн);

- вартість машин і обладнання:

1) вартість комп'ютерів С1=24000 грн;

2) вартість оргтехніки С2=1500 грн;

3) норма амортизації На=11%;

- видатки електроенергії в рік Е=16000 кВт 77 0ч;

- ціна 1 кВт 77 0ч Це=0.063 (грн);

- видатки на запасні частини на ремонт Рр=600 (грн);

- видатки на матеріали при експлуатації основного обладнання Рео=200 (грн);

- видатки на матеріали при експлуатації допоміжного обладнання Ред=400 (грн);

- інші витрати Рп=800 (грн);

- кількість годин корисного часу за рік Чп=45000 ч;

- рентабельність Р=25%.

Виробничі витрати ОЦ:

І=ЗПУ+ЗПО+ЗПР+ (С1+С2) *На+Е*Це+Рр+Рео+Ред+Рп, (7.5)

І=11788 (грн).

Вартість 1 години машинного часу

Сг=І/Чп, (7.6)

Сг=11788/45000=0.26 (грн).

Ціна 1 години машинного часу

Цг=Сг (Р+1), (7.7)

Цг=0.26 (0.25+1)=0.33 (грн).

Таким чином, витрати на оренду машинного часу

Вмч=64 7 0.33=145.6 (грн).

Витрати на розробку комплексу:

В=Ззп (1+0.045+0.25+0.06+0.01)+Вд+Вмч, (7.8)

В=Ззп 1.365+Вд+Вмч, (7.9)

В=1165.11 1.365+36+145.6=1771.98 (грн).

Таким чином, програмний продукт "Емулятор основних функціональних блоків мікропроцесору i486" призначений для вивчення і перевірки знань в області програмуванні сучасних мікропроцесорів типу i486 в машинних кодах по дисципліні "Мікропроцесорні засоби і системи" дозволяє вдосконалити навчальний процес. Розроблену програму доцільно використати для лабораторних і практичних робіт.

5 МЕТОДИЧНІ ВКАЗІВКИ ДО ЛАБОРАТОРНИХ РОБІТ

    Загальні положення

Регістри процесора.

Процесор має регістри, що поділяються на наступні категорії:

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

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

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

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

    Регістри отладки;

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

Останні дві категорії регістрів в емуляторі не реалізовані і не мають відношення до даної лабораторної роботи.

Набір регістрів загального призначення включає відповідні регістри попередніх процесорів (8086 і 80286). Всі регістри мають розрядність 32 біти, і до колишньої позначки їхніх імен додашлася приставка Е. Відсутність приставки в імені означає заслання на молодші 16 біт розширених регістрів. Як і в 8086, можливо незалежне звертання до молодшого і старшого байтів регістрів.

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

Регістр прапорів EFLAGS також поширений до 32 біт. Біти, певні для 8086 і 80286, мають колишнє призначення, але у порівнянні з 80286 з'явилися нові біти.

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

    AC (Alignment Check, біт 18) - прапор контролю вирівнювання. При виконанні програм на рівні привілей 3 в випадку звертання до операнду, не вирівненому по відповідній межі, і при встановленому прапорі AC відбудеться виключення-відмова 17 з нульовим кодом помилки.

    VM (Virtual Mashine, біт 17) - в захищеному режимі включає режим віртуального 8086. Спроба використання привілейованих інструкцій в цьому режимі викличе виключення 13. Біт може встановлюватися тільки в захищеному режимі: інструкцією IRET на нульовому рівні привілей або переключенням задач на будь-якому рівні привілей. На біт не діють інструкції POPF, а PUSHF в образ цього регістру завжди заносить 0. Його одиничне значення може зберегтися тільки в образі, що зберігається при перериванні або переключенні задач.

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

Сегментні регістри містять 16-разрядные селекторы і 64-розрядні дескрипторні частини. В реальному режимі вміст селекторної частини співпадає адресою сегменту, а розмір сегменту завжди рівний 64 Кб. В захищеному режимі адреса сегменту і його розмір можуть бути довільними і завантажуються з дескриптора сегменту, що розміщений в спеціальній таблиці. В відзнаку від процесора 80286 адреса сегменту має 32 розряду, а розмір 20 розрядів, крім того в залежності від біта дрібності в поле атрибутів сегменту розмір може бути уявлений в байтах або сторінках по 4 Кб. В поле атрибутів дескриптора додані два нових прапора: біт дрібності G і біт розрядність D. Останній має сенс тільки для сегментів кодів і стека. Формат селектора і дескриптора уявлений на рисунку 5.1.


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

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


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

Таблиця 5.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+

Регістри локальної таблиці дескрипторів і сегменту стану задачі мають таку же структуру як і сегментні регістри. Регістри глобальної дескрипторної таблиці і таблиці переривань мають тільки 32-розрядне поле бази і 16-розрядне поле розміру.

Системні регістри CR0, CR2, CR3 мають 32-розрядну структуру і використовуються для настанови режимів і контролю. Регістр CR0 в якості молодшої частини включає в себе біти регістру MSW процесора 80286.

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

    PE (Protection Enable, біт 0) - дозвіл захисту, настанова біта переводить процесор в захищений режим;

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

    EM (Processor Extention Emulated, біт 2) - емуляція сопроцесора, дозволяє викликати виключення 7 по кожній команді сопроцесора;

    TS (Task Switch, біт 3) - задача переключена. Встановлюється після кожного переключення задачі;

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

    NE (Numeric Error, біт 5) - дозвіл стандартного механізму повідомлення про помилку сопроцесора;

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

    AM (Alignment Mask, біт 18) - дозвіл контролю вирівнювання;

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

    CD (Cashe Disable, біт 30) - заборона заповнення кеша;

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

Регістр CR2 зберігає 32-розрядну лінійну адресу, по якій була отримана остання відмова сторінки пам'яті.

Регістр CR3 в старших 20 розрядах зберігає фізичну базову адресу каталогу сторінок.

Формування лінійної адреси.

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

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

В 16-розрядном режимі адресації формування ефективного зміщення повністю співпадає з процесорами 8086 і 80286. В 32-разрядном режимі без sib-байта адреса формується з вмісту будь-якого регістру загального призначення і зміщення (зміщення або регістр можуть бути відстуній). Для формування адреси з декількох компонент в 32-розрядном режимі після mod-байта в інструкції ставиться sib-байт (Scale-Index-Base, масштаб-індекс-база). В цьому байті міститься інформація про те, що регістр є базовим, що індексним і що фактор зрушення застосовується до індексу. Вміст індексного регістру перед формуванням адреси може бути зсунутий на 1, 2 або 4 розряду ліворуч. В якості базового і індексного регістру може виступати будь-який регістр загального призначення.

Механізм трансляції сторінок.

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

    Лабораторна робота N 1

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

5.2.1 Завдання до лабораторної роботи

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

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

    Приклад виконання

Складемо програму для пересилки текстового рядка з використанням індексної адресації з масштабуванням. Кодовий сегмент і сегмент стека є 32-розрядными, стек поширюється вниз.

Для роботи програми в захищеному режимі достатньо мати тільки таблицю глобальних дескрипторів, що містить наступні елементи:

    Нульовий дескриптор;

    Дескриптор сегменту коду (32-розрядний);

    Дескриптор сегменту даних;

    Дескриптор сегменту стека (32-розрядний, поширюється вниз);

    Дескриптор даних відеобуфера.

Для трансляції вихідного тексту програми в виконавчий файл проведемо з використанням транслятора Tasm і линкера Tlink.

; файл “lab1. asm”

IDEAL ; режим Ideal

P486 ; 80486 з інструкціями Protect mode

model large ; модель пам'яті

stack 256 ; стек реального режиму 256 байт

segment stak use32 ; сегмент стека захищеного режиму

dd 256 dup (0)

stk_len=$ ; довжина сегменту стека

ends

struc descr ; структура дескриптора

limit1 dw 0 ; розмір, біти 15-0

base1 dw 0 ; база, біти 15-0

base2 db 0 ; база, біти 23-16

acs dw 0 ; слово атрибутів і розмір (біти 19-16)

base3 db 0 ; база, біти 31-24

ends

SEGMENT DATA USE32 ; сегмент даних

label gdt dword ; таблиця GDT

d1 descr <> ; нульовий дескриптор

sel_code= $-gdt ; селектор сегменту коду

cod descr <> ; дескриптор сегменту коду

sel_data= $-gdt ; селектор сегменту даних

dat descr <> ; дескриптор сегменту даних

sel_stk= $-gdt ; селектор сегменту стека

stk descr <> ; дескриптор сегменту стека

sel_video= $-gdt ; селектор сегменту відеопам'яті

video descr <80*25*2, 8000h, 0bh, 4092h, 0> ;дескриптор сегменту відеопамяті

label dat_gdt pword ; покажчик на GDT

gdt_len dw $-gdt ; довжина

gdt_base dd 0 ; лінійна адреса

dlen dd data_len ; довжина сегменту даних

clen dd pcode_len ; довжина сегменту коду

slen dd stk_len ; довжина сегменту стека

message db 'Рабинович Абрам Исаакович', 0 ; текстовий рядок

data_len=$

ENDS

; 16-розрядний сегмент коду реального режиму

SEGMENT CODE USE16

assume cs: code, ds: data

; головна процедура

proc main

mov ax, data ; настройка DS на сегмент даних

mov ds, ax

; настройка дескриптора сегменту коду

mov eax, pcode

shl eax, 4 ; обчислення лінійної адреси

push sel_code ; селектор сегменту

push 409ah ; 32-розрядний сегмент коду,

; доступний по читанню

push [clen] ; довжина сегменту

push eax ; лінійна адреса сегменту

call make_desc ; заповнення дескриптора

add sp, 14 ; анулювання параметрів в стеке

; настройка дескриптора сегменту даних

mov eax, ds

shl eax, 4 ; обчислення лінійної адреси

push sel_data ; селектор сегменту

push 4092h ; 32-разрядный сегмент даних,

; доступний по запису, поширюється вверх

push [dlen] ; довжина сегменту

push eax ; лінійна адреса сегменту

call make_desc ; заповнення дескриптора

add sp, 14 ; анулювання параметрів в стеке

; настройка дескриптора сегменту стека

mov eax, stak

shl eax, 4 ; обчислення лінійної адреси

add eax, [slen] ; вершини стека

push sel_stk ; селектор сегменту

push 4096h ; 32-розрядний сегмент даних

; доступний по запису, поширюється вниз

push [slen] ; розмір сегменту

push eax ; лінійна адреса сегменту

call make_desc ; заповнення дескриптора

add sp, 14 ; анулювання параметрів в стеке

; настройка покажчика на GDT

mov eax, ds

shl eax, 4

add eax, offset gdt ; лінійна адреса таблиці

mov [gdt_base], eax

lgdt [dat_gdt] ; завантаження регістру GDTR

cli ; заборона апаратних переривань

mov eax, cr0 ; настанова біта режиму в регістрі CR0

inc al

mov cr0, eax

; jmp far sel_code: offset pmode ; перехід на сегмент

; захищеного режиму

dw 0ea66h

dd offset pmode

dw sel_code

endp

; процедура заповнення дескриптора

proc make_desc near

; список параметрів

ARG base: dword, ; базова адреса сегменту

len: dword, ; розмір сегмента

acs: word, ; атрибути сегменту

sel: word ; селектор сегменту (на рівні

; привілей 0 селектор дескриптора

; в таблиці GDT, є також

; зміщенням в цій таблиці)

enter 0.0 ; створення кадру стека

mov si, [sel]

add si, offset gdt ; обчислення адреси дескриптора

mov eax, [base]

mov [dword si+descr. base2], eax ; завантаження бази сегменту (біти 31-24)

mov [dword si+descr. base1], eax ; завантаження бази сегменту (біти 23-0)

mov eax, [len]

mov [si], ax ; завантаження розміру сегменту (біти 15-0)

shr eax, 8

xor al, al

or ax, [acs]

mov [si+descr. acs], ax ; завантаження атрибутів і

; розміру (біти 19-16)

leave ; анулювання кадру стека

ret ; повернення

endp

; завершення роботи програми

proc rmode

sti

mov ax, 4c00h ; функція завершення з кодом 0

int 21h ; виклик ДОС

endp

ENDS

; 32-розрядний сегмент коду захищеного режиму

SEGMENT PCODE USE32

assume cs: pcode, ds: data, ss: stak

; головна процедура

proc pmode

mov eax, sel_stk ; настройка стека

mov ss, ax

xor esp, esp ; покажчик на вершину

mov eax, sel_data ; настройка на сегмент даних

mov ds, ax

mov fs, ax

mov gs, ax

mov eax, sel_video ; настройка на відеопам'ять

mov es, ax

call print ; виклик процедури печатки

mov eax, cr0

xor eax, 1

mov cr0, eax ; скид біта режиму в регістрі CR0

jmp far code: rmode ; повернення в сегмент реального режиму

endp

; процедура печатки

proc print near

xor edi, edi ; зміщення 0 в відеопам'яті

lea esi, [message] ; адреса рядка

mov ah, 17h ; атрибути символів

; цикл виводу

@@1: mov al, [esi] ; завантаження в al чергового символу

or al, al ; перевірка на 0

jz @@2 ; якщо 0, те вихід з циклу

mov [es: edi*2], ax ; символ з атрибутом в відеопам'ять

inc esi ; наступний символ

inc edi ; наступне знакомісце

jmp @@1 ; повторення циклу

@@2:

ret ; повернення

endp

pcode_len=$

ENDS

end main ; крапка входу в програму

Створення виконавчого файлу здійснювалося слідуючим чином:

tasm. exe lab2. asm/m2

tlink. exe lab2. obj/

    3міст звіту з лабораторної роботи

    Повна схема формування адреси при записі в відеопам'ять в відповідності з заданим варіантом.

    Формат що використаються селекторів і дескрипторів з реальними значеннями.

    Текст програми.

    Вміст регістрів ,що використаються і кадру стека під час пересилки рядка.

    Контрольні питання

    Який мінімальний і максимальний розмір сегменту при встановленому і скинутому біті дрібності в дескрипторі?

    Як зміниться покажчик 32-розрядного стека при вталківанії в нього операнда розміром:

А) слово;

Б) подвійне слово?

    Можна чи не використати перехід після переключення режиму і чому?

    Лабораторна робота N 2

Метою даної лабораторної роботи є закріплення знань про роботу механізму трансляції сторінок, а також одержання навиків в укладанні таблиць сторінок.

Лабораторна робота розрахована на 2 академічних години.

    Завдання до лабораторної роботи

В даній роботі студент повинен скласти програму що формує в пам'яті необхідні системні таблиці, переводить процесор в захищений режим з включеним механізмом трансляції сторінок, виводить в відеопам'ять рядок з ФІБ студента і переводить процесор в реальний режим. При цьому відеопам'ять повинна знаходитися по логічній адресі 100000h, що досягається застосуванням сторінкового механізму. Розмір сторінки пам'яті береться з таблиці варіантів.

Таблиці сторінок слідує складати тільки для першого мегабайта плюс область відеопам'яті.

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

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

    Приклад виконання

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

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

<розмір сторінки>/4 < розмір сторінки >=<мінімальне покриття>

4 [Kb]/4*4 [Kb] =4096 [Kb] =4 [Mb]

Одна сторінка покриває 4 Мб адресного простору, а нам необхідно 1024Кб+4Кб=1028 Кб, що значно менш означеного обсягу. Значить достатньо заповнити тільки одну таблицю сторінок. Каталог і таблиця повинні бути вирівнені по межі 4 Кб, а сегмент ехе-файлу може бути вирівнен тільки по межі параграфу, тому усього необхідно 3 сторінки по 4 Кб.

; файл “lab2. asm”

...

SEGMENT DATA USE32

pages dd 3*1024 dup (0) ; буфер для таблиць сторінок

... ; таблиця GDT

video descr <80*25*2, 0.10 h, 4092h, 0> ; адреса сегменту 100000h

...

ENDS

SEGMENT CODE USE16

assume cs: code, ds: data

proc main

; заповнення дескрипторов сегментів

mov ebx, data ; обчислення фізичного

shl ebx, 4 ; адреси каталогу сторінок

add ebx, 1000h

and bx, 0f000h

mov cr3, ebx ; завантаження адреси каталогу в CR3

mov eax, ebx ; обчислення зміщення

shr ebx, 4 ; каталогу сторінок в

sub> bx, data ; сегменті даних

shl bx, 4

add eax, 1007h ; обчислення адреси 1-й таблиці

mov [bx], eax ; завантаження в каталог

add ebx, 1000h ; зміщення таблиці

mov eax, 7 ; 1-я сторінка, адреса 0

mov cx, 256 ; 256 сторінок= 1Мб

@@1:

mov [bx], eax ; заповнення таблиці

add eax, 1000h ; наступні 4 Кб

add bx, 4 ; адреса наступного елемента

loop @@1 ; повторення циклу

; в bx адресу елемента таблиці для відеобуфера

mov [dword bx], 0b8007h ; фізична адреса відеобуфера

; завантаження GDTR

mov eax, cr0

or eax, 80000001h

mov cr0, eax ; настанова бітів PE і PG в CR0

; jmp far sel_code: offset pmode

dw 0ea66h

dd offset pmode

dw sel_code

endp

proc make_desc near ; процедура заповнення дескриптора

...

endp

proc rmode ; процедура завершення програми

...

endp

ENDS

SEGMENT PCODE USE32

proc pmode

... ; головна процедура

endp

proc print near

... ; процедура печатки

endp

pcode_len=$

ENDS

end main ; крапка входу

Створення виконавчого файлу здійснювалося слідуючим чином:

tasm. exe lab2. asm/m2

tlink. exe lab2. obj/3

Перед отладкою програми необхідно встановити заданий розмір сторінки в емуляторі. Для цього треба викликати головне меню, вибрати пункт “Настанови”, клавішами “вверх” або “вниз” встановити розмір і натиснути клавішу введення.

    Зміст звіту з лабораторної роботи

1. Повна схема формування адреси згідно варіанту.

    Текст програми.

    Дільниці таблиць сторінок, що використовувались програмою (в тому числі і під самою програмою).

    Контрольні питання

    Який обсяг адресного простору покриває сторінковий механізм при розмірі сторінки:

А) 2 Кб;

Б) 1 Кб;

С) 0.5 Кб?

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

5.4 Таблиця варіантів

В таблиці використані наступні позначки засобів адресації:

“бісм” - базово-індексна зі зміщенням і масштабурованням;

“бім” - базово-індексна з масштабурованням;

“ім” - індексна з масштабурованням;

“і” - індексна;

“біс” - базово-індексна зі зміщенням;

“бі” - базово-індексна;

“б” - базова.

    Література

    Гук М. “Процессоры Intel от 8086 до Pentium II”. - СПб: “ПИТЕР”,1997 - 224 с.

    Бродин В.Б. Шагурин И.И. “Микропроцессор i486. Архитектура, программирование, интерфейс”. - М.: “ДИАЛОГ-МИФИ”, 1993. - 240 с.

    Голенкова Ж.К. Заболоцкий А.В. Мархасин М.Л. “Руководство по архитектуре IBM PC AT”. - Мн.: ООО “Консул”, 1992. - 949 с.

Таблиця 5.1 Таблиця варіантів.

Варіант

Засіб адресації

Розрядність коду

Розширення стека

Розмір сторінки, Кб

1

Бісм

16

Вверх

4

2

Бім

32

Вниз

2

3

Ім

16

Вверх

1

4

І

32

Вниз

0.5

5

Біс

16

Вверх

4

6

Бі

32

Вниз

2

7

Б

16

Вверх

1

8

Бісм

32

Вниз

0.5

9

Бім

16

Вверх

4

10

Ім

32

Вниз

2

11

І

16

Вверх

1

12

Біс

32

Вниз

0.5

13

Бі

16

Вверх

4

14

Б

32

Вниз

2

15

Бісм

16

Вверх

1

16

Бім

32

Вниз

0.5

17

Ім

16

Вверх

4

18

І

32

Вниз

2

19

Біс

16

Вверх

1

20

Бі

32

Вниз

0.5

21

Б

16

Вверх

4

22

Бісм

32

Вниз

2

23

Бім

16

Вверх

1

24

Ім

32

Вниз

0.5

25

І

16

Вверх

4

26

Біс

32

Вниз

2

27

Бі

16

Вверх

1

28

Б

32

Вниз

0.5

ВСТУП

Бурхливий розвиток обчислювальної техніки дозволив їй проникнути в усі закутки людського життя. Наряду з настольними персональними системами особлива увага зараз приділяється керуючим системам. Дешевизна і багаті можливості мікропроцесорів сімейства х86 поставили їх в один ряд зі спеціалізованими процесорами і контролерами в області створення керуючих систем. Використання цих мікропроцесорів привертає ще і тим, що дозволяє використати для створення системного програмного забезпечення практично весь величезний набір інструментальних засобів для персональних систем. Однак отладка такого програмного забезпечення сопряжена з певними труднощями, що обмежують використання стандартних отладчиків. В основному це зв'язане з різноманітністю архітектурних рішень в плані створення апаратного забезпечення. Тут на допомогу можуть прийти що емулюють отладчики, що дозволять виробляти конфігурування віртуальної архітектури. Дані отладчики можуть використовуватися в настольних персональних системах, виробляючи повну емуляцію системи.

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

ВИСНОВКИ

В даній роботі був вироблений огляд архітектури процесорів сімейства х86 фірми Intel і розроблений програмний емулятор процесора i486 і апаратна частина внутрисхемного емулятора.

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

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

Додаток А

Емулятор

Керівництво користувача

ДП 7.091501-037-99.009ДА

Аркушів 9

Донецьк 1999

1 ПРИЗНАЧЕННЯ І ВИМОГА ДО КОНФІГУРАЦІЇ

Емулятор процесора i486 версії 2.0 передвизначений для отладки системного програмного забезпечення спеціалізованих ЕОМ. Він може також використовуватися в якості навчальної допомоги при підготовці фахівців в області обчислювальної техніки для виконання лабораторних робіт по дисципліні “Мікропроцесорні засоби і системи”.

Емулятор виконує програмну емуляцію роботи основних функціональних блоків процесора i486 з точки зору програмного забезпечення. При створенні програми головним критерієм виступала вірогідність роботи блоків процесора. Тому прив'язка дешифрації і виконання команд до сигналу синхронизації не вироблялася. Мінімальним кроком роботи блоків доступним користувачу є цикл виконання команди ПО, що отладжується.

Для роботи програми-емулятора достатньо мати персональний комп'ютер на базі процесора 80286+ оснащеного 4 Мб оперативної пам'яті і відеоадаптером не нижче EGA. З системного програмного забезпечення вимагається MS DOS версії 3.3+і драйвер розширеної пам'яті типу HIMEM.SYS. Будь-яких додаткових приладів або програм не вимагається.

При роботі під багатоозадачною операційною системою бажано запуск програми виробляти в режимі емуляції MS DOS, бо в програмі виробляється прямий доступ до відеопам'яті.

2 ЗАПУСК ЕМУЛЯТОРА

Для запуску необхідно перейти в каталог, в якому міститься ісполнімий файл “i486. exe” і виробити його запуск або з командного рядка, набравши в ній ім'я файлу і натиснувши введення, або можна скористуватися інтерактивною програмною оболонкою.

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

3 ГОЛОВНЕ МЕНЮ

Головне меню викликається при натиску клавіші F10. В ньому зосереджені пункти, активізація яких наводить до видавання на екран одного з діалогових вікон.

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

Пункт “Файл”.

Даний пункт передвизначений для генерації запитання на відкриття ісполнімого файлу для отладки. Після активізації цього пункту на екрані відкривається вікно з вмістом поточного каталогу. Скористувавшись клавішами зі стрілками користувач може перемістити підсвічуючий курсор на що цікавить ісполнімий файл (типу“. com” або“. exe”) і натиснути клавішу введення. Дана операція призведе до завантаженню файлу в віртуальну пам'ять емулятора для отладки. При Цьому відкриється вікно, в якому буде відображений відрізок програмного коду з асемблерною мнемоникою. Підсвічуючий курсор встановиться на першу команду програми.

Пункт “Смотреть...”.

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

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

    Вікно “РОНы” містить стан регістрів загального призначення;

    Вікно “Сегментные регистры” містить стан сегментних регістрів і регістрів локальної дескрипторної таблиці і сегменту стану задачі, причому як їхн селекторних частин, так і дескрипторних;

    Вікно “Системные регистры” містить стан системних регістрів, таких як CRx, EIP, GDTR, IDTR;

    Вікно “Флаги” містить стан регістру EFLAGS;

    Вікно “Память” містить стан певної дільниці віртуальної пам'яті емулятора;

    Вікно “Стек” містить стан дільниці пам'яті, в якій розміщений поточний програмний стек.

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

Пункт “Установки”.

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

Пункт “Выход”.

Активізація даного пункту призведе до завершенню праці емулятора і поверненню в операційну систему. Пункт може бути активований в будь-якому стані емулятора шляхом натиску комбінації клавіш “Alt+X”.

4 ОПИС ВІКОН ЕМУЛЯТОРА

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

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

Переключення між вікнами, те є фокусировка потоку управління на потрібному вікні, виконується шляхом натиску клавіші F6. При Цьому управління одержує вікно, що було відкрите перед поточним. Якщо необхідно переключати вікна в зворотному порядку, можна скористуватися комбінацією клавіш Shift+F6.

Активне вікно має заголовок пофарбований в синій колір і підсвічуючий курсор.

При бажанні можна змінити розмір і положення деяких вікон. Для цього слідує скористуватися комбінацією клавіш Ctrl+F5. При включенні цього режиму вікно перетворюється в прямокутник з рамкою. Тепер клавішами зі стрілками можна переміщати вікно по екрану, а при натиснутой клавіші Shift - змінювати розмір. Вихід з режиму здійснюється шляхом натиску клавіші введення.

Вікно “РОНы”.

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

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

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

Вікно “Сегментные регистры”.

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

    Ім'я регістру. При зміні вмісту регістру виводиться білим кольорем;

    Селектор. В шістнадцятеричному вигляді подає вміст селекторної частини даного регістру;

    База. В шістнадцятеричному вигляді подає базова лінійна адреса сегменту;

    Межа. В шістнадцятеричному вигляді подає розмір сегменту в прийнятих елементах дрібності (байти або сторінки по 4 Кб);

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

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

Будь-яка частина сегментного регістру може бути довільно модифікована. Для цього необхідно клавішами “вверх” “вниз” подвести курсор до потрібного рядка. Після Цього клавішею “Tab” перемістити курсор до елемента ,що цікавить, а клавішами “праворуч” “ліворуч” на потрібну тетраду або атрибут. В випадку зміни атрибутів слідує скористуватися символами “1” і “0”, бо атрибути уявлені в двоїчному коді. Інші поля модифікуються шістнадцятеричними символами. Модифицирование повністю аналогічно описаному для вікна РОНів.

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

Вікно “Системные регистры”.

Вікно виробляє індикацію і дозволяє змінювати вміст системних регістрів. В даній групі містяться наступні регістри:

    Регістр EIP. Покажчик команд;

    Регістр CR0. Регістр стану процесора;

    Регістр CR2. Лінійна адреса при відмові сторінки;

    Регістр CR3. Фізична адреса каталогу сторінок;

    Регістр GDTR. Регістр глобальної таблиці дескрипторів;

    Регістр IDTR. Регістр таблиці переривань.

При зміні вмісту регістру, його ім'я виводиться білим кольорем. Вміст регістрів відображається в шістнадцятеричному вигляді. Модифікація здійснюється аналогічно описаним вище вікнам. Регістри таблиць і переривань перебують з двох частин: 32-разрядной бази і 16-разрядного розміру. Інші регістри мають звичайну 32-разрядную структуру.

Вікно “Флаги”.

Вікно відображає вміст регістру прапорів EFLAGS. Всі прапори є однобітными (окрім поля iopl, але і воно уявлене двома окремими бітами), що дозволило придати вмісту вікна більш зручний, з точки зору модифікації, вигляд. Якщо прапор встановлений, ліворуч від його імені в квадратних дужках буде стояти крестик. Прапор, доступний в даний момент для модифікації, помічається мигаючим курсором в квадратних дужках. Зміна поточного прапора здійснюється клавішами “вверх” “вниз”, а модифікація вмісту - клавішею пробілу. Модифікація реалізована в режимі тригера, те є, якщо прапор був встановлений, він буде скинутий і навпаки.

Вікно “Стек”.

Дане вікно відображає дільницю пам'яті, зайнятий сегментом стека. Інформація розташується двома колонками: адреса (зміщення) і вміст. Стрілка ліворуч від адреси вказує на поточну вершину стека, той є вміст регістру (E) SP. Використовуючи клавіші “вверх” “вниз” можна прокручувати в вікні весь вміст сегменту. Дане вікно передвизначене тільки для відображення і не дозволяє модифікувати осередки стека.

Вікно “Память”.

Дане вікно відображає вміст фізичної пам'яті емулятора. Інформація уявлена двома групами: лінійна адреса і вміст.

Вікно має локальне меню для управління поданням даних. Активізація меню виробляється комбінацією клавіш Alt+F10. Активізація пунктів меню виробляється шляхом підвода курсору клавішами “вверх” ”вниз” до пункту ,що цікавить і натиском клавіші введення. Многие пункти мають “гарячі клавіші” - комбінації клавіш, якими їхн можна активізувати знаходячись поза меню.

Меню має наступні пункти:

    Пункт “Перейти”. Передвизначений для швидкого переходу до області пам'яті ,що цікавить. Після активізації відкривається діалогове вікно для завдання адреси області. Ліворуч в вікні знаходиться список джерел базової лінійної адреси (адреса області завжди задається відносно якого-або джерела). Праворуч вгорі знаходиться рядок введення. Користувач може ввести в ній в шістнадцятеричному вигляді зміщення відносно вибраного джерела базової адреси. Праворуч внизу знаходяться дві кнопки “Ok” і “Canсel”. Вони мають “гарячі” клавіші Enter і Escape відповідно. Перша кнопка завершує діалог з переходом до заданої області, а друга без переходу.

    Пункт “Уявити як...”. Даний пункт відкриває підміню зі списком доступних форматів подання вмісту пам'яті. Нижче наводяться ці формати.

    “Байт” (Alt+B). Вміст подається рядками по 16 осередків, що містять відповідні їм байти в шістнадцятеричному вигляді;

    “Слово” (Alt+W). Те же, тільки рядок подає вісім 16-разрядных слів;

    “Подвійне слово” (Alt+D). Рядок подає чотири 32-разрядных слова;

    “Дескриптор” (Alt+E). Кожний рядок подає вміст пам'яті, як дескриптор. Виводиться база, межа і атрибути;

    “Таблиця сторінок” (Alt+P). Вміст пам'яті подається, як таблиця сторінок. Кожний рядок містить по дві осередки, що, в свою чергу, уявлені двома елементами: базова адреса в шістнадцятеричному вигляді і атрибути сторінки в двоичном вигляді;

    “Символи” (Alt+S). Рядок подає 32 байта пам'яті їхніми аналогами з таблиці ASCII. Непечатные символи уявлені крапками.

Невеликі переміщення по дільниці пам'яті можна виробляти шляхом використання клавиш “вверх” “вниз”

Вікно програми.

Це вікно відкривається при завантаженні в пам'ять емулятора ісполнімого файлу і має в якості заголовку ім'я цього файлу. Подсвечивающий курсор після завантаження вказує на першу команду програми користувача. Дизассемблирование здійснюється пакетами по 32 команди. При бажанні користувач може продивитись цю послідовність використовуючи клавіші “вверх” “вниз”.

Для покроковой отладки користувачу доступні декілька функцій, що викликаються натиском певних клавіш або комбінацій клавіш:

    “Крок з заходом в підпрограми” (F7). Виробляється дешифрація наступної команди і виконання поточної. Строковые команди виконуються як група команд, кількість яких визначається лічильником. Команди виклика виконують перехід до підпрограми.

    “Крок без захода в підпрограми” (F8). Запоминается адреса наступної команди і виконання виробляється до збігу вмісту покажчика команд з запам'ятаним значенням. Підпрограми, строкові команди і цикли “Loop” виконуються як одна команда. При виникненні помилки виконання зупиняється на команді, викликавшей цю помилку.

    “Виконати дільницю” (F4). Користувач переміщає курсор на кінець блоку, що цікавить команд і викликає функцію. Виконання виробляється до збігу вмісту покажчика команд з адресою кінця блоку. Обробка входів в підпрограми, строкових команд і циклів аналогічної попередньої функції. При виникненні помилки виконання зупиняється.

    “Пропустити блок” (Alt+F8). Користувач пересуває курсор в кінець блоку ,що цікавить і викликає функцію. Всі команди в блоку пропускаються. В суттєвості покажчику команд привласнюється значення адреси кінця блоку. Дану функцію слідує застосовувати якщо виконання блоку може призвести до виникненню помилки, а користувачу необхідно продовжити виконання.

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

Екран користувача”.

Для розширення можливостей емулятора в пам'яті передбачена область, що в реальній машині відповідає текстовому відеобуферу. Ця область розташується по фізичній адресі 000B8000h і має довжину 4 Кб, що відповідає одній текстовій сторінці в дозволі 80х25.

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

Додаток Б

Емулятор

Керівництво програміста

ДП 7.091501-037-99.010ДБ

Аркушів 6

Донецьк 1999

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

Необхідність в модернізації може виникнути, наприклад, при доповненні команд функцією підрахунку тактів виконання або при доданні нових команд, реалізованих в процесорах наступної ґенерації, або при реалізації емуляції яких-нибудь блоків процесора.

Є можливість також змінити місце дислокації оперативної пам'яті емулятора або збільшити її розмір. Изначально пам'ять ємністю один мегабайт знаходиться в розширеній пам'яті і доступна через драйвер HIMEM. SYS.

І, нарешті, можна доопрацювати емулятор, ввівши в нього периферійні прилади.

1 Опис модулей

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

    Модуль “STRUCTS. CPP”

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

В якості інтерфейсу з іншими модулями служить файл “command. hpp”, в якому містяться оголошення згаданих вище класів і основних типів даних. В модулі містяться глобальні змінні, що також служать для зв'язку з іншими модулями.

Глобальні змінні.

В модулі проголошені наступні глобальні змінні:

    int identify. Идентификатор сегментного регістру. При створенні примірників об'єктів типу сегментного регістру відбувається перенесення вмісту цієї змінної в внутрішнє поле ідентифікатора регістру і збільшення змінної на одиницю. В результаті в кожному примірникові класу міститься унікальний ідентифікатор;

    int stop. Прапор останова емулятора. При виникненні ситуації останова процесора цей прапор встановлюється в одиницю і емуляція припиняється;

    ulong ercode. Код помилки виключення. При виникненні ситуації виключення в стек при викликові обрабника заноситься код помилки, що допомагає локалізувати джерело виключення;

    int error. Номер виключення. В нормальній ситуації змінна містить -1. При виникненні виключення в неї заноситься номер виключення;

    char cpl. Поточний рівень привілей програми. При межсегментної передачі керування в якості поточного рівня привілей програми виступає рівень запитання селектора;

    int tekseg. При відкритті перед командою префіксу зміни сегменту в цю змінну записується код сегментного регістру;

    int page. Поточний розмір сторінки пам'яті при сторінковій адресації. Використовується механізмом трансляції сторінок для перетворення лінійної адреси в фізичний;

    int ad, od. Поточний розмір адреси і операнда. Перед дешифрацієй команди беруться з біта розрядності кодового сегменту. За наявності відповідних префіксів можуть змінюватися на протилежні;

    ulong cr0, cr2, cr3. Системні регістри;

    _gdt gdtr. Регістр глобальної таблиці дескрипторів;

    _idt idtr. Регістр таблиці переривань.

    _reg ron [8]. Файл регістрів загального призначення;

    _seg srg [6]. Файл сегментних регістрів. Виконує роль блоку сегментації;

    _ldt ldtr. Регістр локальної таблиці дескрипторів;

    _tss tr. Регістр сегменту стану задачі;

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

Процедури і функції.

В модулі містяться наступні допоміжні процедури:

    int mode (). Вертає поточний режим процесора, аналізуючи вміст системного регістру CR0 і регістру прапорів;

    ulong conv_adr (_op, int). Вираховує виконавчу адресу операнда на підставі переданої складеної адреси і поточної розрядність адреси;

    int cccc (uchar, char*). Виконує перевірку умови, код якого передається в якості параметру. Вертає результат перевірки і мнемонічну позначку умови.

    Модуль “CONTROL. CPP”

Модуль містить процедури і функції, що беруть участь в процесах дешифрації і виконання команд процесора і початкової ініціалізації масиву команд. В модулі також містяться оголошення і реалізації деяких груп команд.

Змінні.

Ці змінні хоч і проголошені як глобальні використовуються тільки всередині модуля. Модуль містить наступні змінні:

    _command* mas [256]. Масив команд. Містить покажчики на примірники класів дешифрацію і виконання 256 команд ,що реалізують і груп;

    _decoder cmds [2]. Черга команд. Перед виконанням команди з індексом 0 виробляється дешифрація команди з індексом 1. Після виконання команда 1 позичає місце команди 0.

Процедури і функції.

В модулі містяться наступні процедури і функції:

    void init (). Процедура ініціалізації масиву команд. Дана процедура викликається один раз при старті емулятора для створення примірників класів, що реалізують дешифрацію і виконання команд процесора;

    void int_call (int). Процедура виконує виклик обрабника переривання, номер якого передається їй в якості параметру;

    int step (_decoder*). Функція виробляє дешифрацію префіксів команди і виклик засобу deasm () класу, що реалізує цю команду. Вертає заповнену структуру команди і ознака помилки в випадку її виникнення;

    int exec_com (). Функція виробляє виконання команди шляхом виклика засобу die () класу, що реалізує команду.

    Модулі “MEM. CPP”, “COM_ANDS. CPP”, “COM_MOVS. CPP”

В модулі “MEM. CPP” знаходиться реалізація засобів класу _mem, що здійснює операції обміну з пам'яттю і приладами введення-висновку.

В інших модулях знаходиться реалізація засобів deasm () і die () класів команд. В модулі “COM_ANDS. CPP” зібрані аріфметичнф, логічні команди і команди зрушень, а в модулі “COM_MOVS. CPP” зібрані команди пересилки і керування.

2 Інструкції по модернізації і розширенню функцій емулятора

Додання нових команд.

Для введення в емулятор нової команди необхідно створити клас, що реалізує цю команду. Клас повинен спадкуватися від базового класу _command і мати свої реалізації засобу deasm () для дешифрацфї і засобу die () для виконання команди. Оголошення класу слідує помістити в файл “command. h”.

Коли засіб deasm () одержує керування, всі префікси вже дешифровані і проведені необхідні корегування полий структури команди, що передається в якості параметру. Для необхідності дешифрації пост-байтів треба викликати засіб mod () при цьому локальний покажчик зміщення відносно почала команди повинен вказувати на пост-байт. В якості параметру засобу необхідно передати номер операнда, що заповнюється. В поле strcom структури необхідно занести мнемонику команди без операндів, а покажчик зміщення встановити за останній байт команди. Для читання безпосередніх операндів необхідно використати відповідні засоби структури. В поле *p необхідно занести покажчик на об'єкт типу класу команди. В якості параметру слідує повернути ознаку помилки в випадку її виникнення.

Засіб die () викликається для безпосереднього виконання команди. В якості параметру в нього передається покажчик на структуру команди, що була попередно дешифрована засобом deasm (). Для одержання операндів з пам'яті або запису їхн в пам'ять слідує використати відповідні засоби класу _seg.

Реалізацію засобів бажано розмістити в файлі “COM_ANDS. CPP” або “COM_MOVS. CPP”.

Зміна реалізації пам'яті емулятора.

Якщо виникне необхідність в зміні реалізації пам'яті емулятора, наприклад, реалізувати її в вигляді файлу на диску, слідує переписати або внести зміни в реалізацію засобів класу _mem, що знаходиться в модулі “MEM. CPP”.

Додання емуляції периферійних приладів.

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


Р Е Ф Е Р А Т

Аркушів ____ Рисунків ____ Таблиць ____ Додатків ____ Посилань ____


ПРОЦЕСОР, ЗОВНІШНІЙ ІНТЕРФЕЙС, СТОРІНКОВА АДРЕСАЦІЯ, ВІРТУАЛЬНІ ПЕРЕРИВАННЯ, ПРОГРАМНИЙ ЕМУЛЯТОР, ЗАХИЩЕНИЙ РЕЖИМ










ПЕРЕЛІК ПОСИЛАНЬ

    Гук М. “Процессоры Intel от 8086 до Pentium II”. - СПб: “ПИТЕР”,1997 - 224 с.

    Бродин В.Б. Шагурин И.И. “Микропроцессор i486. Архитектура, программирование, интерфейс”. - М.: “ДИАЛОГ-МИФИ”, 1993. - 240 с.

    Голенкова Ж.К. Заболоцкий А.В. Мархасин М.Л. “Руководство по архитектуре IBM PC AT”. - Мн.: ООО “Консул”, 1992. - 949 с.

    Бердышев Е. “Технология ММХ. Новые возможности процессоров Р5 и Р6”. - М.: “ДИАЛОГ-МИФИ”, 1998. - 234с.