Керiвництво программиста
запису кэша, використають додаткові сигнали 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 можуть повністю або
Страницы: 1, 2, 3
|