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

Изпитен тест — Вариант №4: Въпроси и отговори


Въпрос 1

Архитектурата на коя процесорна фамилия на фирмата Intel е показана на блоковата схема? Кои са нейните основни качества? Какви основни принципи се използват при изпълнение на командите?

Отговор

Показана е архитектурата на фамилия P6 (Pentium Pro, Pentium II, Pentium III) — суперскаларна микроархитектура от шесто поколение x86 процесори на Intel, въведена с Pentium Pro (1995).

Основни качества на P6:

  • Суперскаларност — изпълнява до 3 µop-а паралелно на такт
  • Out-of-order (OOO) изпълнение — инструкциите се изпълняват не в програмния ред, а по готовност на операндите
  • In-order завършване (Retirement) — резултатите се записват в архитектурното състояние в програмния ред
  • Декупаж CISC → RISC-подобни µop-и — x86 инструкциите се декодират в прости вътрешни микрооперации (µops)
  • Предсказване на разклонения — динамично предсказване намалява загубите от условни преходи
  • Разширен конвейер — 12+ стъпки позволяват висока тактова честота

Основни принципи при изпълнение на команди:

СтъпкаБлокФункция
ИзвличанеFetch UnitЗарежда байтове от кеш L1-I
ДекодиранеDecode Units (3×)Декодира x86 → µop последователност
РазпределянеDispatch/AllocateЗаписва µop-и в Reorder Buffer (ROB)
ИзпращанеReservation Station (RS)Изпраща µop-и към изпълнителните блокове при готовност на операндите
ИзпълнениеExecution Units (ALU, FPU, AGU…)Изпълнява µop-ите извън ред
Запис на резултатWritebackРезултатите се съхраняват в ROB (не директно в регистрите)
ЗавършванеRetire UnitЗаписва резултатите в архитектурните регистри в реда на програмата; освобождава ROB записи

Механизмите ROB (Reorder Buffer) и Register Aliasing Table (RAT) реализират преименуване на регистрите — премахват фалшивите зависимости и позволяват паралелното изпълнение.


Въпрос 2

Кои са познатите Ви типове данни, с които работят процесорите с x86 архитектура? Опишете накратко предназначението на посочените от Вас типове данни.

Отговор

x86 процесорите поддържат следните групи типове данни:

1. Основни целочислени типове

ТипРазмерПредназначение
Byte8 битаСимволи (ASCII), малки цели числа
Word16 битаСегментни селектори, малки числа
Doubleword32 битаСтандартни адреси и числа в 32-битов режим
Quadword64 бита64-битова аритметика (IMUL, DIV), MMX
Double Quadword128 битаXMM/SSE операции
Octoword256 битаYMM/AVX операции

2. Числа с плаваща запетая (IEEE 754)

ФорматРазмерПредназначение
Single Precision32 битаСтандартна FP аритметика (игри, инженерни изч.)
Double Precision64 битаНаучни изчисления, стандарт в повечето езици
Extended (80-bit)80 битаВътрешен формат на x87 FPU; максимална точност
Half Precision16 битаМашинно обучение, GPU трансфери

3. BCD типове данни — двоично-кодирани десетични числа; ползват се при финансови изчисления (без закръгляне). Два вида:

  • Packed BCD: две BCD цифри в един байт
  • Unpacked BCD: една BCD цифра в нисшите 4 бита на байт

4. SIMD пакетирани типове

ТипРегистърПредназначение
Packed Byte/Word/DWMM0–MM7 (64-bit)MMX целочислени операции (multimedia)
Packed SP/DP floatXMM0–XMM15 (128-bit)SSE/SSE2 — графика, физика, DSP
Packed floatYMM0–YMM15 (256-bit)AVX/AVX2 — научни изчисления
Packed floatZMM0–ZMM31 (512-bit)AVX-512 — HPC, AI аксéлерация

5. Указатели

  • Near pointer (32/64-bit offset): сочи в рамките на текущия сегмент
  • Far pointer (16-bit selector + 32/64-bit offset): сочи към друг сегмент

6. Битови полета — произволна последователност от битове в паметта; адресирани с инструкции BT/BTS/BTR/BTC.

7. Низове (Strings) — байтове, думи или двойни думи в паметта; обработват се с MOVS/CMPS/SCAS/LODS/STOS + REP префикс.


Въпрос 3

Напишете какво е предназначението на познатите Ви системни флагове от регистъра EFLAGS на процесорите с IA-32 архитектура.

Отговор

Системни флагове в EFLAGS (за разлика от статусните — CF, ZF, SF, OF и др.):

ФлагБитПредназначение
TF8Trap Flag — при TF=1 процесорът генерира debug изключение (#DB) след всяка инструкция; позволява стъпков (step-by-step) дебъгинг
IF9Interrupt Enable Flag — IF=1: маскируемите прекъсвания са разрешени; IF=0: маскируемите прекъсвания са забранени (CLI/STI го управляват)
IOPL12–13I/O Privilege Level — 2-битово поле; дефинира минималното ниво на привилегия (CPL ≤ IOPL), необходимо за изпълнение на I/O инструкции (IN/OUT) без #GP
NT14Nested Task Flag — NT=1 при вложени задачи (CALL/INT чрез Task Gate); при IRET с NT=1 процесорът превключва обратно към предишната задача чрез полето “Previous Task Link” в TSS
RF16Resume Flag — RF=1 временно потиска debug прекъсвания (#DB) за следващата инструкция; използва се при обслужване на breakpoint изключения, за да се избегне безкраен цикъл
VM17Virtual-8086 Mode — VM=1 в защитен режим превключва процесора в режим V86 (емулация на реален режим); позволява изпълнение на стари реално-режимни програми
AC18Alignment Check — AC=1 (и AM=1 в CR0): генерира #AC изключение при несравнено достъп до памет (напр. word на нечетен адрес)
VIF19Virtual Interrupt Flag — виртуално копие на IF за V86 режим (при VME разширение)
VIP20Virtual Interrupt Pending — VIP=1: сигнализира за чакащо виртуално прекъсване в V86 режим
ID21Identification Flag — ако може да се записва и чете бит 21, процесорът поддържа инструкцията CPUID; чрез CPUID може да се идентифицира модел, функционалности, кеш и др.

Статусните флагове (CF, PF, AF, ZF, SF, OF) и управляващият флаг DF не са системни и тук не се описват.


Въпрос 4

Какво е показано на картинката, приложена към този въпрос? Какво е неговото предназначение? Кои са показаните полета и за какво се използват?

(Диаграмата показва 16-битова структура с полета: Index [15:3], T [2], RPL [1:0], с надписи Table Indicator (0=GDT, 1=LDT) и Requested Privilege Level (RPL))

Отговор

Показан е сегментен селектор (Segment Selector) — 16-битова стойност, зареждана в сегментен регистър (CS, DS, ES, SS, FS, GS). Той идентифицира конкретния сегментен дескриптор в GDT или LDT.

Полета на сегментния селектор:

ПолеБитовеПредназначение
Index[15:3]13-битов индекс → номер на дескриптора в GDT/LDT таблицата. Адрес на дескриптора = База на GDT/LDT + Index × 8
TI[2]Table Indicator: TI=0 → дескрипторът е в GDT (Global Descriptor Table); TI=1 → в LDT (Local Descriptor Table)
RPL[1:0]Requested Privilege Level: 0 (наивисше) до 3 (потребителско). Използва се при проверка на привилегии при достъп до сегмент — ефективното ниво на привилегия е max(CPL, RPL)

Как се използва:
Когато процесорът зарежда сегментен регистър (напр. MOV DS, AX), той:

  1. Чете Index и TI от селектора
  2. Изчислява адреса на дескриптора: Base_GDT/LDT + Index × 8
  3. Зарежда дескриптора в невидимата (скрита) кеш-памет на сегментния регистър
  4. Проверява привилегии чрез DPL (от дескриптора) и RPL/CPL

Въпрос 5

Какво според Вас е изобразено на показаната картинка? Опишете последователността от действия на работа и в какъв режим работи този механизъм? Знаете ли кои елементи с техните полета и флагове се използват и анализират от процесора?

(Диаграмата показва: Linear Address [31:22 Directory | 21:12 Table | 11:0 Offset] → CR3 → Page Directory → PDE (PS=0) → Page Table → PTE → 4-KByte Physical Page)

Отговор

Показано е 32-битово двустепенно странициране (32-bit Two-Level Paging) в защитен режим с 4 KB страници.

Режим на работа:
Механизмът е активен когато:

  • CR0.PG = 1 (бит 31 на CR0 — включва страничиране)
  • CR4.PAE = 0 (32-битов режим без Physical Address Extension)

Структура на линейния адрес (32 бита):

Bits [31:22]Bits [21:12]Bits [11:0]
Directory (10 бита)Table (10 бита)Offset (12 бита)
Индекс в Page DirectoryИндекс в Page TableОтместване в 4 KB страницата

Последователност на адресната трансформация:

  1. CR3 (PDBR — Page Directory Base Register) съдържа физическия адрес на Page Directory (PD). CR3[31:12] = база на PD (наравнено на 4 KB).

  2. Page Directory Entry (PDE): PD има 1024 записа × 4 байта. Процесорът индексира PD с bits [31:22] на линейния адрес. PDE[31:12] = физически адрес на Page Table (PT). Важни флагове в PDE:

    • P (Present, бит 0): 1 = страницата е в паметта; 0 → #PF изключение
    • R/W (бит 1): 0 = само четене; 1 = четене+запис
    • U/S (бит 2): 0 = само супервайзор (CPL 0–2); 1 = потребителски достъп (CPL 3)
    • PS (Page Size, бит 7): 0 = 4 KB страница (PDE сочи към PT); 1 = 4 MB страница (само PDE)
    • A (Accessed, бит 5): хардуерно задава се при достъп
    • PWT, PCD: управление на кеширането
  3. Page Table Entry (PTE): PT има 1024 записа × 4 байта. Индексира се с bits [21:12]. PTE[31:12] = физическа база на 4 KB страницата. Флагове: P, R/W, U/S, A, D (Dirty — задава се при запис), G (Global).

  4. Физически адрес = PTE[31:12] (20 бита) конкатенирани с Offset[11:0] (12 бита) = 32-битов физически адрес.

TLB (Translation Lookaside Buffer) кешира наскоро използваните PDE/PTE за ускоряване — без TLB всяко обръщение до памет би изисквало 2 допълнителни четения от паметта.


Въпрос 6

Каква е същността на защитата на паметта чрез сегментация при процесорите с x86 архитектура в защитен режим? Какво проверяват процесорите при достъп до сегмент в съответствие с неговия дескриптор, показан на картинката?

Отговор

Същността на защитата чрез сегментация е, че всеки сегмент от паметта се описва чрез 8-байтов сегментен дескриптор в GDT или LDT. При всеки достъп до памет процесорът автоматично верифицира дескриптора и отказва достъп при нарушение (генерира #GP — General Protection Fault).

Структура на сегментния дескриптор:

ПолеБитовеОписание
Base32 бита (split)Линеен начален адрес на сегмента
Limit20 бита (split)Максималното отместване (в байтове или 4 KB гранули)
G1 битGranularity: G=0 → Limit в байтове; G=1 → Limit × 4 KB
D/B1 битDefault operand size: 0=16-bit; 1=32-bit
P1 битPresent: P=1 → сегментът е в паметта
DPL2 битаDescriptor Privilege Level: 0 (ядро) – 3 (потребител)
S1 битS=0 → системен дескриптор (TSS, LDT Gate); S=1 → код/данни
Type4 битаВид сегмент: код/данни; права за четене/запис/изпълнение
AVL1 битЗапазен за ОС

Проверки при достъп до сегмент:

  1. Проверка за наличие (Present): P трябва да е 1, иначе → #NP (Not Present)

  2. Проверка на Limit: Ефективният адрес (offset) трябва да е ≤ разширен Limit (байтовия размер). При нарушение → #GP или #SS (при стек)

  3. Проверка на тип: Четене от код-сегмент без R=1 → #GP. Запис в код-сегмент → #GP. Изпълнение от данни-сегмент → #GP

  4. Проверка на привилегии:

    • За данни сегменти: max(CPL, RPL) ≤ DPL
    • За не-conform код сегменти (директно CALL/JMP): CPL = DPL и RPL ≤ DPL
    • За conform код сегменти: CPL ≥ DPL (достъпни от по-нисши нива)
    • Нарушение → #GP

Само при успешно преминаване на всичките четири проверки процесорът изпълнява обръщението. При нарушение на някоя → изключение, обработвано от ОС.


Въпрос 7

Колко вида шлюзове при обработката на прекъсванията използват процесорите с IA-32 архитектура в 32-битов режим? Кои са тези видове и в коя таблица се разполагат? Има ли принципни разлики между тях и ако да — какви са тези разлики?

Отговор

В 32-битов защитен режим IA-32 процесорите използват 3 вида шлюзове в IDT (Interrupt Descriptor Table) за обработка на прекъсвания и изключения:

Вид шлюзТип (Type[3:0])Таблица
Task Gate0101₂ (0x5)IDT (или GDT/LDT)
Interrupt Gate (32-bit)1110₂ (0xE)IDT
Trap Gate (32-bit)1111₂ (0xF)IDT

Структура на шлюзовете (8 байта):

  • Task Gate: съдържа само TSS Selector (16 бита) — при активиране генерира превключване на задача
  • Interrupt/Trap Gate: съдържа Segment Selector + 32-битов Offset → адрес на обработваща процедура (ISR)

Принципни разлики:

ХарактеристикаTask GateInterrupt GateTrap Gate
ДействиеПревключване на задача чрез TSSИзвикване на ISR процедураИзвикване на ISR процедура
EFLAGS.IF след активиранеЗависи от новата задачаIF = 0 (забранени прекъсвания)IF запазен (без промяна)
Записва EIP/CS/EFLAGS в стекаНе (TSS)ДаДа
ИзползванеРядко; изолация на задачи при изключенияХардуерни прекъсвания (IRQ)Системни повиквания (INT n), debug

Ключова разлика Interrupt Gate vs Trap Gate:
При Interrupt Gate процесорът автоматично изчиства IF=0 при влизане в ISR — блокира нови маскируеми прекъсвания (атомарна обработка). При Trap Gate IF остава непроменен — ISR може да бъде прекъснато от по-приоритетно прекъсване. IRET в края на ISR възстановява IF от запазения EFLAGS в стека.


Въпрос 8

Какво според Вас изобразява времедиаграмата на фигурата към този въпрос? Какво е предназначението на отделните сигнали, обозначени върху нея? Кои две действия се извършват според тази времедиаграма в тяхната логическа и времева последователност?

(Времедиаграмата показва сигнали: A31–A0, ADS#, DATA, RDWRN, LOCK# за два последователни цикъла на шината)

Отговор

Показана е времедиаграма на Pentium шинен интерфейс за заключена (locked) атомарна операция „четене–модификация–запис” (Read-Modify-Write), реализирана с префикс LOCK или с инструкция XCHG.

Предназначение на сигналите:

СигналПосокаПредназначение
A31–A0Процесор → Шина32-битова адресна шина — задава адреса на операнда в паметта
ADS#Процесор → ШинаAddress Data Strobe (активен ниско) — сигнализира, че A31–A0 съдържа валиден адрес и нов цикъл е стартиран
DATAДвупосочен64-битова (Pentium) шина за данни — пренася данните при четене или запис
RDWRNПроцесор → ШинаRead/Write: 1 = цикъл на четене; 0 = цикъл на запис
LOCK#Процесор → ШинаBus Lock (активен ниско) — докато LOCK# е активен, никой друг bus master не може да овладее шината; гарантира атомарност

Двете действия в логическа и времева последователност:

  1. Цикъл на четене (Read Bus Cycle):

    • ADS# се активира, A31–A0 задава адреса на операнда, RDWRN = 1 (четене), LOCK# се активира (ниско)
    • Паметта поставя данните на DATA шината
    • Процесорът прочита текущата стойност от паметта
  2. Цикъл на запис (Write Bus Cycle):

    • ADS# отново се активира, същият адрес на A31–A0, RDWRN = 0 (запис), LOCK# остава активен
    • Процесорът записва модифицираната стойност на DATA шината
    • Паметта приема новата стойност
    • След завършване на записа LOCK# се деактивира (висок), освобождавайки шината

Значение: Докато LOCK# е активен между двете операции, никой друг процесор или DMA контролер не може да получи достъп до паметта на същия адрес. Това е основният хардуерен механизъм за реализиране на атомарни синхронизационни примитиви (семафори, spin-locks, compare-and-swap) в SMP системи.


Въпрос 9

По какви начини един x86 процесор с IA-32 архитектура може да инициира превключване от една към друга задача? Кои средства използват процесорите при превключването на задачите? Ако можете, дайте примери.

Отговор

Четири начина за иницииране на превключване на задача:

НачинИнструкция / СъбитиеОписание
1. JMP към TSS дескрипторJMP far [TSS_selector]Директен преход към задача чрез TSS селектор в GDT; не записва обратен адрес → невъзможно връщане с IRET
2. CALL към TSS дескрипторCALL far [TSS_selector]Извикване на задача; предишният TSS Selector се записва в поле “Previous Task Link” на новия TSS; NT=1 → IRET се връща обратно
3. JMP/CALL към Task GateJMP/CALL чрез Task Gate в GDT/LDTИндиректно превключване чрез Task Gate дескриптор; Task Gate съдържа TSS Selector
4. Прекъсване/Изключение → Task Gate в IDTХардуерно IRQ или INT nАко записът в IDT за вектора е Task Gate, обслужването на прекъсването се реализира чрез превключване на задача (нова задача обработва прекъсването)

Средства, използвани при превключването:

  • TSS (Task State Segment): 8-байтов сегментен дескриптор в GDT описва TSS. Самият TSS съхранява пълното архитектурно състояние: GPR (EAX–EDI), EIP, EFLAGS, сегментни регистри (CS, DS, ES, SS, FS, GS), CR3 (PDBR за страничирането на задачата), SS0/ESP0, SS1/ESP1, SS2/ESP2 (стекове за различни нива на привилегия), LDT Selector, I/O Permission Bitmap.

  • TR (Task Register): 16-битов регистър, сочещ към TSS дескриптора на текущата задача в GDT. При превключване TR се актуализира с новия TSS selector. Зарежда се с LTR инструкция.

  • Busy бит в TSS дескриптора (бит 1 на Type поле): При активна задача Busy=1; предотвратява рекурсивно превключване (към вече активна задача) → генерира #GP при опит.

  • NT (Nested Task) флаг в EFLAGS: NT=1 при вложени задачи (CALL/INT чрез Task Gate). IRET при NT=1 прочита “Previous Task Link” от TSS и превключва обратно.

Пример: ОС зарежда n задачи, всяка с TSS. Хардуерен таймер (IRQ0) генерира прекъсване; IDT запис 0x20 е Task Gate → процесорът превключва към задача-планировчик; тя решава коя задача да изпълни следваща и прави JMP към съответния TSS.


Въпрос 10

Обяснете какво според Вас е показано на картинката към този въпрос и какво е неговото предназначение. Можете ли да опишете предназначението на полетата, разположени на: (1) Относителни адреси 72..96; (2) Относителни адреси 32..43

(Диаграмата показва структурата на TSS (Task State Segment) с полета от offset 0 до 100)

Отговор

Показана е структурата на TSS (Task State Segment) — системна структура от данни в защитен режим, която съхранява пълното процесорно състояние на задачата. При превключване на задачи процесорът автоматично записва текущото процесорно състояние в TSS на излизащата задача и зарежда новото от TSS на влизащата задача.

Пълна карта на 32-битов TSS:

OffsetПолеОписание
0Previous Task LinkTSS Selector на предишната задача (при вложени задачи с NT=1)
4ESP0Стеков указател за ring 0
8SS0Стеков сегмент за ring 0
12ESP1Стеков указател за ring 1
16SS1Стеков сегмент за ring 1
20ESP2Стеков указател за ring 2
24SS2Стеков сегмент за ring 2
28CR3 (PDBR)Физически адрес на Page Directory — дефинира виртуалното адресно пространство на задачата
32EIPАдресът на следващата инструкция при рестарт на задачата
36EFLAGSФлаговият регистър на задачата
40EAXРегистър с общо предназначение
44ECX
48EDX
52EBX
56ESP
60EBP
64ESI
68EDI
72ESСегментен регистър ES
76CSСегментен регистър CS (код)
80SSСегментен регистър SS (стек)
84DSСегментен регистър DS (данни)
88FSСегментен регистър FS
92GSСегментен регистър GS
96LDT Segment SelectorСелектор на локалната дескрипторна таблица на задачата
98Reserved / T bitT=1 → генерира debug прекъсване (#DB) при превключване към тази задача
100I/O Map Base AddressOffset в TSS към I/O Permission Bitmap (ако < 65536 → включена; иначе — изключена)

(1) Относителни адреси 72..96 — Сегментни регистри и LDT Selector

Полетата на offsets 72–96 са запазените стойности на сегментните регистри и LDT Selector на задачата:

  • ES (72) — Extra Data Segment: допълнителен сегмент за данни; ползван от стрингови операции (MOVS, CMPS) като дестинационен сегмент
  • CS (76) — Code Segment: сегментът, от който се изпълняват инструкциите; определя CPL при изпълнение
  • SS (80) — Stack Segment: сегментът на стека; ESP/EBP са отмествания в него
  • DS (84) — Data Segment: основен сегмент за данни; повечето достъпи до памет ползват DS по подразбиране
  • FS (88) — допълнителен данни сегмент; в Linux и Windows ползван за Thread Information Block (TIB)
  • GS (92) — допълнителен данни сегмент; в 64-битов режим ОС го ползва за per-CPU данни
  • LDT Segment Selector (96) — селекторът на Local Descriptor Table на задачата в GDT; всяка задача може да има своя LDT с локални сегменти, невидими за другите задачи → изолация на адресното пространство

При превключване процесорът записва всичките 6 сегментни регистъра на излизащата задача тук и зарежда запазените стойности на влизащата задача. Заедно с CR3, тези полета реализират пълна изолация на адресното пространство на всяка задача.


(2) Относителни адреси 32..43 — EIP, EFLAGS, EAX

  • EIP (offset 32–35): Instruction Pointer — адресът в CS на инструкцията, от която задачата ще продължи изпълнение при следващото превключване към нея. При излизане от задача процесорът записва текущия EIP тук; при влизане зарежда EIP от тук.

  • EFLAGS (offset 36–39): Флагов регистър — съдържа статусните флагове (CF, ZF, SF, OF…) и системните флагове (IF, TF, IOPL, NT, VM…) на задачата в момента на превключване. Ако NT=1 е запазен тук, IRET ще предизвика обратно превключване към предишната задача.

  • EAX (offset 40–43): Първият регистър с общо предназначение (акумулатор) — стойността му към момента на превключване. Заедно с EIP и EFLAGS e началото на блока от 8 GPR (EAX–EDI), съхранявани на offsets 40–68.

Значение: EIP и EFLAGS са критични — те дефинират откъде и при какви условия задачата ще продължи изпълнение. EAX е първият от поредицата GPR полета. При рестартиране на задача процесорът зарежда EIP → CS и EFLAGS → флаговете → прескача към инструкцията на задачата.