Изпитен тест — Вариант №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. Основни целочислени типове
| Тип | Размер | Предназначение |
|---|---|---|
| Byte | 8 бита | Символи (ASCII), малки цели числа |
| Word | 16 бита | Сегментни селектори, малки числа |
| Doubleword | 32 бита | Стандартни адреси и числа в 32-битов режим |
| Quadword | 64 бита | 64-битова аритметика (IMUL, DIV), MMX |
| Double Quadword | 128 бита | XMM/SSE операции |
| Octoword | 256 бита | YMM/AVX операции |
2. Числа с плаваща запетая (IEEE 754)
| Формат | Размер | Предназначение |
|---|---|---|
| Single Precision | 32 бита | Стандартна FP аритметика (игри, инженерни изч.) |
| Double Precision | 64 бита | Научни изчисления, стандарт в повечето езици |
| Extended (80-bit) | 80 бита | Вътрешен формат на x87 FPU; максимална точност |
| Half Precision | 16 бита | Машинно обучение, GPU трансфери |
3. BCD типове данни — двоично-кодирани десетични числа; ползват се при финансови изчисления (без закръгляне). Два вида:
- Packed BCD: две BCD цифри в един байт
- Unpacked BCD: една BCD цифра в нисшите 4 бита на байт
4. SIMD пакетирани типове
| Тип | Регистър | Предназначение |
|---|---|---|
| Packed Byte/Word/DW | MM0–MM7 (64-bit) | MMX целочислени операции (multimedia) |
| Packed SP/DP float | XMM0–XMM15 (128-bit) | SSE/SSE2 — графика, физика, DSP |
| Packed float | YMM0–YMM15 (256-bit) | AVX/AVX2 — научни изчисления |
| Packed float | ZMM0–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 и др.):
| Флаг | Бит | Предназначение |
|---|---|---|
| TF | 8 | Trap Flag — при TF=1 процесорът генерира debug изключение (#DB) след всяка инструкция; позволява стъпков (step-by-step) дебъгинг |
| IF | 9 | Interrupt Enable Flag — IF=1: маскируемите прекъсвания са разрешени; IF=0: маскируемите прекъсвания са забранени (CLI/STI го управляват) |
| IOPL | 12–13 | I/O Privilege Level — 2-битово поле; дефинира минималното ниво на привилегия (CPL ≤ IOPL), необходимо за изпълнение на I/O инструкции (IN/OUT) без #GP |
| NT | 14 | Nested Task Flag — NT=1 при вложени задачи (CALL/INT чрез Task Gate); при IRET с NT=1 процесорът превключва обратно към предишната задача чрез полето “Previous Task Link” в TSS |
| RF | 16 | Resume Flag — RF=1 временно потиска debug прекъсвания (#DB) за следващата инструкция; използва се при обслужване на breakpoint изключения, за да се избегне безкраен цикъл |
| VM | 17 | Virtual-8086 Mode — VM=1 в защитен режим превключва процесора в режим V86 (емулация на реален режим); позволява изпълнение на стари реално-режимни програми |
| AC | 18 | Alignment Check — AC=1 (и AM=1 в CR0): генерира #AC изключение при несравнено достъп до памет (напр. word на нечетен адрес) |
| VIF | 19 | Virtual Interrupt Flag — виртуално копие на IF за V86 режим (при VME разширение) |
| VIP | 20 | Virtual Interrupt Pending — VIP=1: сигнализира за чакащо виртуално прекъсване в V86 режим |
| ID | 21 | Identification 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), той:
- Чете Index и TI от селектора
- Изчислява адреса на дескриптора:
Base_GDT/LDT + Index × 8 - Зарежда дескриптора в невидимата (скрита) кеш-памет на сегментния регистър
- Проверява привилегии чрез 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 страницата |
Последователност на адресната трансформация:
-
CR3 (PDBR — Page Directory Base Register) съдържа физическия адрес на Page Directory (PD). CR3[31:12] = база на PD (наравнено на 4 KB).
-
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: управление на кеширането
-
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).
-
Физически адрес = 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).
Структура на сегментния дескриптор:
| Поле | Битове | Описание |
|---|---|---|
| Base | 32 бита (split) | Линеен начален адрес на сегмента |
| Limit | 20 бита (split) | Максималното отместване (в байтове или 4 KB гранули) |
| G | 1 бит | Granularity: G=0 → Limit в байтове; G=1 → Limit × 4 KB |
| D/B | 1 бит | Default operand size: 0=16-bit; 1=32-bit |
| P | 1 бит | Present: P=1 → сегментът е в паметта |
| DPL | 2 бита | Descriptor Privilege Level: 0 (ядро) – 3 (потребител) |
| S | 1 бит | S=0 → системен дескриптор (TSS, LDT Gate); S=1 → код/данни |
| Type | 4 бита | Вид сегмент: код/данни; права за четене/запис/изпълнение |
| AVL | 1 бит | Запазен за ОС |
Проверки при достъп до сегмент:
-
Проверка за наличие (Present):
Pтрябва да е 1, иначе → #NP (Not Present) -
Проверка на Limit: Ефективният адрес (offset) трябва да е ≤ разширен Limit (байтовия размер). При нарушение → #GP или #SS (при стек)
-
Проверка на тип: Четене от код-сегмент без R=1 → #GP. Запис в код-сегмент → #GP. Изпълнение от данни-сегмент → #GP
-
Проверка на привилегии:
- За данни сегменти:
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 Gate | 0101₂ (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 Gate | Interrupt Gate | Trap 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 не може да овладее шината; гарантира атомарност |
Двете действия в логическа и времева последователност:
-
Цикъл на четене (Read Bus Cycle):
- ADS# се активира, A31–A0 задава адреса на операнда, RDWRN = 1 (четене), LOCK# се активира (ниско)
- Паметта поставя данните на DATA шината
- Процесорът прочита текущата стойност от паметта
-
Цикъл на запис (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 Gate | JMP/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 | Поле | Описание |
|---|---|---|
| 0 | Previous Task Link | TSS Selector на предишната задача (при вложени задачи с NT=1) |
| 4 | ESP0 | Стеков указател за ring 0 |
| 8 | SS0 | Стеков сегмент за ring 0 |
| 12 | ESP1 | Стеков указател за ring 1 |
| 16 | SS1 | Стеков сегмент за ring 1 |
| 20 | ESP2 | Стеков указател за ring 2 |
| 24 | SS2 | Стеков сегмент за ring 2 |
| 28 | CR3 (PDBR) | Физически адрес на Page Directory — дефинира виртуалното адресно пространство на задачата |
| 32 | EIP | Адресът на следващата инструкция при рестарт на задачата |
| 36 | EFLAGS | Флаговият регистър на задачата |
| 40 | EAX | Регистър с общо предназначение |
| 44 | ECX | — |
| 48 | EDX | — |
| 52 | EBX | — |
| 56 | ESP | — |
| 60 | EBP | — |
| 64 | ESI | — |
| 68 | EDI | — |
| 72 | ES | Сегментен регистър ES |
| 76 | CS | Сегментен регистър CS (код) |
| 80 | SS | Сегментен регистър SS (стек) |
| 84 | DS | Сегментен регистър DS (данни) |
| 88 | FS | Сегментен регистър FS |
| 92 | GS | Сегментен регистър GS |
| 96 | LDT Segment Selector | Селектор на локалната дескрипторна таблица на задачата |
| 98 | Reserved / T bit | T=1 → генерира debug прекъсване (#DB) при превключване към тази задача |
| 100 | I/O Map Base Address | Offset в 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 → флаговете → прескача към инструкцията на задачата.