Към съдържанието

Глава XI — Организация на шината при i486 и Pentium

1. Основни принципи на шинния интерфейс

Шинният интерфейс на процесора осигурява достъп до системната памет и входно-изходните устройства чрез системната шина. Всяко предаване по шината се изгражда от цикъл на шината (bus cycle).

Шини при i486 и Pentium

Характеристикаi486Pentium
Данни32 бита (D0–D31)64 бита (D0–D63)
АдресиA2–A31 (4 GB)A3–A31 (4 GB)
Байтово разрешениеBE0#–BE3#BE0#–BE7#
Тип на цикълаM/IO#, D/C#, W/R#M/IO#, D/C#, W/R#
Пакетно предаванеДа (до 4×32 бита)Да (до 4×64 бита)
Честотадо 66 MHzдо 66 MHz

2. Функционални групи сигнали

2.1 Адресна шина и байтово разрешение

СигналПосокаОписание
A31–A2ИзходФизически адрес (линейно → физическо след страноване)
BE3#–BE0#ИзходByte Enable — указва кои байтове са валидни в 32-битова дума
BE7#–BE0#Изход(само Pentium) за 64-битова шина
ADS#ИзходAddress Strobe — активен, когато адресът и тип-сигналите са валидни

Байтовото разрешение се декодира:

BE0# → байт D7–D0 (адрес xxx0)
BE1# → байт D15–D8 (адрес xxx1)
BE2# → байт D23–D16 (адрес xxx2)
BE3# → байт D31–D24 (адрес xxx3)

2.2 Сигнали за тип на цикъла

СигналОписание
M/IO#1 = достъп до памет; 0 = достъп до В/И пространство
D/C#1 = данни; 0 = управление (код)
W/R#1 = запис; 0 = четене

Комбинациите определят типа на цикъла:

M/IO#D/C#W/R#Тип цикъл
000Потвърждаване на прекъсване (INTA)
001Специален цикъл
010Четене от В/И
011Запис в В/И
100Извличане на код (Instruction Fetch)
101— (резервиран)
110Четене от памет (данни)
111Запис в памет (данни)

2.3 Сигнали за готовност и пакетно предаване

СигналПосокаОписание
RDY#ВходReady — паметта е готова (за непакетен цикъл)
BRDY#ВходBurst Ready — готовност при пакетно предаване
BLAST#ИзходBurst Last — последният цикъл от пакетното предаване
BOFF#ВходBackoff — принуждава процесора да освободи шината
AHOLDВходAddress Hold — задържа адреса (използва се от Кеш-снифера)

2.4 Сигнали за управление на кеша

СигналОписание
KEN#Cache Enable — разрешава кеширане на текущия цикъл
WB/WT#Write Back / Write Through — задава метода на кеширане
FLUSH#Принуждава процесора да изпише Кеша
PWTPage Write Through (от PTE)
PCDPage Cache Disable (от PTE)

2.5 Сигнали за шинен арбитраж

СигналОписание
HOLDЗаявка за шина от друг master
HLDAHold Acknowledge — процесорът предоставя шината
LOCK#Шината е заключена — друг master не може да я заеме
PLOCK#Pseudo-Lock (i486) — псевдозаключване за операнди > 32 бита

2.6 Сигнали за прекъсвания и управление

СигналОписание
INTRMaskable Interrupt Request
NMINon-Maskable Interrupt
RESETНулиране на процесора
SMI#System Management Interrupt
IGNNE#Ignore Numeric Error (игнорира FPU грешка)
FERR#Floating-point Error (от FPU)

3. Видове цикли на шината

Фази на шинния цикъл (T1, T2, Ti)

Всеки шинен цикъл при i486/Pentium се разделя на стандартни такт-фази:

ФазаОписание
T1Процесорът задава адреса (A31–A2/A3), сигналите за тип (M/IO#, D/C#, W/R#), BE# и активира ADS#. ADS# сигнализира, че новият цикъл е стартиран.
T2Процесорът чака потвърждение от паметта/В/И. При четене — паметта поставя данните на D шината и активира RDY#. При запис — процесорът задава данните на D шината; паметта активира RDY# при готовност.
TiТакт(ове) на изчакване (wait states), вмъкнати между T1 и T2 при бавна памет. Ti се повтаря докато не пристигне RDY#.
ThHold — процесорът задържа шината след завършване на цикъла (при конвейеризиране).

Минимален цикъл = T1 + T2 (2 такта). Всеки Ti удължава цикъла с 1 такт.

3.1 Непакетен (non-burst) цикъл на четене

Стандартен цикъл при i486 — 2 такта (при нулеви RDY# цикли на изчакване):

Памет / ВУПроцесор (i486/Pentium)Памет / ВУПроцесор (i486/Pentium)Такт T1Такт T2 (+ Ti при бавна памет)ADSДанни на D31–D0 + RDYЗащелква D31–D0

При бавна памет се добавят такт(ове) на изчакване (Ti) между T1 и T2.

3.2 Пакетен (burst) цикъл

3.1а Непакетен цикъл на запис

При запис процесорът задава едновременно адрес и данни в T1:

Памет / ВУПроцесор (i486/Pentium)Памет / ВУПроцесор (i486/Pentium)Такт T1Такт T2 (+ Ti при бавна памет)ADSДанни на D31–D0 (валидни от T1)RDY

При запис данните са валидни още от T1 (за разлика от четенето, при което паметта поставя данни в T2). Записите могат да се буферират вътрешно в процесора (Write Buffer) и да се изпращат по шината асинхронно — подобрява производителността, но изисква внимание при синхронизация в SMP.

3.2 Пакетен (burst) цикъл

Пакетното предаване позволява 4 последователни четения (при кеш-зареждане) с 1 адрес + 3 автоматично инкрементирани адреси:

Памет (Cache-Line Fill)ПроцесорПамет (Cache-Line Fill)ПроцесорКеш-редът е зареден (64 байта)ADSBRDYBRDYBRDYBLASTBRDY

Пакетният цикъл значително повишава ефективността при зареждане на кеш-редове (64 байта = 8×64b Pentium думи).

3.3 Цикъл за потвърждаване на прекъсване (INTA)

При INTR прекъсване процесорът генерира два последователни INTA цикъла:

  1. Първи INTA: ADS# активен с M/IO#=D/C#=W/R#=0; контролерът на прекъсванията се подготвя
  2. Втори INTA: контролерът изнася вектора (номер 0–255) на D0–D7
Между двата цикъла има 4 празни такта.

3.4 Специални цикли

При M/IO#=0, D/C#=0, W/R#=1 — специален цикъл, кодиран в BE#:

BE3#BE2#BE1#BE0#Специален цикъл
1110Shutdown (двойна грешка)
1101Flush (изписване на Кеш)
1011Halt (спиране)
0111Write-Back (обратен запис на Кеш)

4. Заключване на шината (Bus Locking)

LOCK# осигурява атомарни (неделими) операции при мултипроцесорни системи:

  • Докато LOCK# е активен, шинният арбитър не разрешава на друг master да заеме шината
  • Автоматично активиране при: XCHG r, [mem], дескрипторни достъпи, потвърждаване на прекъсване, превключване на задача
  • Програмно: префикс LOCK пред инструкция (напр. LOCK CMPXCHG)

При i486 — псевдозаключване (PLOCK#) за предавания > 32 бита (кеш-редове, FPU операнди).

При P6: ако заключваният операнд е в Кеш с обратен запис (WB), LOCK# може да не се активира — правилността се гарантира от MESI протокола.


4а. Шинен арбитраж — HOLD/HLDA протокол

Когато DMA контролер или друг bus master иска достъп до шината:

ПроцесорАрбитър (или директно)DMA / друг MasterПроцесорАрбитър (или директно)DMA / друг MasterЗавършва текущия цикълA, D, BEПродължава нормална работаHOLD = 1 (заявка за шина)HLDA = 1 (шината е освободена)Изпълнява DMA циклиHOLD = 0 (освобождава шината)HLDA = 0

Важни детайли:

  • Процесорът завършва текущия шинен цикъл преди да освободи шината — незаключен цикъл
  • При активен LOCK#: процесорът не отговаря на HOLD докато LOCK# е активен
  • При BOFF# (Backoff): паметта може да принуди процесора да освободи шината веднага (дори по средата на цикъл) — процесорът замразява и рестартира прекъснатия цикъл след BOFF# = 0
  • В многопроцесорни системи арбитражът се управлява от ARB схема с приоритети (статичен) или с ротация (динамичен/fair)

4б. Адресен pipeline при Pentium

Pentium поддържа конвейеризиране на адресите (Address Pipelining / Pipelined Addressing):

Цикъл 1: T1 [Адрес 1 + ADS#] → T2 [Данни 1 + RDY#]
Цикъл 2: T1 [Адрес 2 + ADS#] → T2 [Данни 2 + RDY#]

Процесорът изпраща адреса на следващия цикъл докато текущият цикъл все още чака данни (T2/Ti). Паметта сигнализира готовност с NA# (Next Address), което разрешава на процесора да задава нов адрес. Резултатът: практически 1 такт/цикъл при бърза памет вместо 2+.

При i486 — няма адресен pipeline; всеки цикъл трябва да завърши изцяло преди следващия адрес.

5. Пакетно предаване — ред на адресите

При пакетно четене адресите не нарастват линейно по 4 — следват специален ред за максимизиране на кеш ефективността (Pentium 64-bit burst order):

Адрес на кеш-реда: A31..A5 (константна горна част) + A4..A3 (2 бита за 4 блока)
Ред при начало от 00: 00 → 01 → 10 → 11
Ред при начало от 10: 10 → 11 → 00 → 01

Тази схема минимизира броя такти (pipeline на четене и адреса).


5а. Подреждане на паметта (Memory Ordering)

Редът на изпълнение на четения и записи по шината може да се различава от програмния ред — важно за SMP коректност.

Модели на подреждане

МоделПроцесорОписание
Строго (Strong)i486, PentiumЧетения и записи се изпълняват в програмния ред с малко изключения (четене може да изпревари буфериран запис към различен адрес)
Процесорно (Processor)P6 и по-новиЧетенията могат да се изпълняват спекулативно — изпреварват буферирани записи; записите винаги следват програмния ред

Типове кеш области — MTRR

Управляващите регистри MTRR (Memory Type Range Registers, въведени в P6) задават тип на кеширане за до 96 физически области:

ТипСъкращениеПодрежданеКешБуфериране записУпотреба
UncacheableUCСтрогоНеНеI/O регистри, ROM
Write CombiningWCСлабоНеДа (буфер)Видео framebuffer
Write ThroughWTСтрогоЧетенеНеСамо-четими области
Write BackWBПроцесорноДаДа (обратен запис)RAM — по подразбиране
Write ProtectedWPСтрогоЧетенеНеROM, BIOS сенки

За i486 и Pentium подобен ефект се постига с хардуерни сигнали KEN# и WB/WT#.

Сериализиращи инструкции

Сериализиращата инструкция задължава процесора да завърши всички предишни операции (четения, записи, промени на регистри) преди да продължи. Използват се при превключване между режими и при синхронизация:

ПривилегированиНепривилегировани
MOV CRn, MOV DRnCPUID
WRMSR, INVLPGIRET
LGDT, LIDT, LLDT, LTRRSM
WBINVD, HLT

CPUID се използва като портативна сериализираща инструкция в ядра (преди критични секции след MOV CR0).

6. Шинен интерфейс на P6 / Pentium Pro

P6 въвежда транзакционна шина с разделени фази:

  • Request phase: процесорът изпраща заявка (адрес + тип)
  • Snoop phase: всички агенти проверяват кешовете (HIT#, HITM#)
  • Response phase: контролерът на паметта отговаря
  • Data phase: данните се предават (64-битова шина)

Заявките могат да се конвейеризират (до 4 Outstanding) — различни фази на различни транзакции едновременно. Сигналите:

СигналОписание
DEFER#Транзакцията не е завършена “in order”
HIT#Друг процесор има немодифициран ред
HITM#Друг процесор има модифициран ред (обратен запис)

Резюме за изпита

  • Цикъл: T1 (адрес + ADS#) → Ti (чакане) → T2 (данни + RDY#); запис: данни от T1
  • i486: 32-битова данна шина, BE0#–BE3#; ADS# маркира валиден адрес; без адресен pipeline
  • Pentium: 64-битова данна шина, BE0#–BE7#; пакетен цикъл 4×64 бита; адресен pipeline с NA#
  • Тип на цикъла: M/IO# + D/C# + W/R# (8 комбинации)
  • RDY# (непакетен) / BRDY# (пакетен) — паметта сигнализира готовност
  • INTA: 2 цикъла с 4 такта помежду; векторът се поставя на D0–D7 при втория
  • HOLD/HLDA: DMA/bus master протокол; BOFF# — принудително освобождаване; LOCK# блокира HOLD
  • LOCK#: атомарни операции; PLOCK# при i486 за > 32-битови операнди
  • MTRR: UC / WC / WT / WB / WP — тип на кеш; CPUID = непривилегирована сериализация
  • P6: транзакционна шина с конвейеризирани заявки; HIT#, HITM#, DEFER#

→ Речник на всички съкращения


Източници: