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

захисту по привілей на рівні сторінок;

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

  • Біт 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 встановлений в одиницю і відбулося немаскуєме переривання. Якщо відбулося переривання ,що маскується апаратне, те процесор виробляє наступну послідовність дій:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. Що рекомендуються дії обробника: викликати монітор 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. Процедура виконує команду, що знаходиться в нульовому елементі масиву, копіює в цей елемент вміст першого елемента і

    Если Вам нужна помощь с академической работой (курсовая, контрольная, диплом, реферат и т.д.), обратитесь к нашим специалистам. Более 90000 специалистов готовы Вам помочь.
    Бесплатные корректировки и доработки. Бесплатная оценка стоимости работы.

    Поможем написать работу на аналогичную тему

    Получить выполненную работу или консультацию специалиста по вашему учебному проекту
  • Похожие рефераты: