Архитектура набора команд (ISA)
- Комбинация инструкций, которые понимает процессор, и регистров, которые ему доступны, называется архитектурой набора команды (Instruction Set Architecture, ISA).
- Количество инструкций, которые понимает процессор, ограничено.
- Невозможно определить собственную инструкцию.
- Существует фиксированное количество команд, которые понимает процессор.
- Одна архитектура микропроцессора трактует число 501012 как add r10, r12
- другая архитектура — как load r10, 12
Архитектура набора команд (ISA)
- Какие команды процессор может выполнять (например, сложение, чтение из памяти, переход).
- Как эти команды кодируются в бинарном виде (машинный код).
- Какие регистры (сверхбыстрая память внутри процессора) доступны.
- Как процессор работает с памятью.
- Обработку исключений и прерываний.
Примеры
- Intel и AMD, используют архитектуру набора команд x86.
- A12, A13, A14, M1 от Apple, понимают набор команд ARM.
- Программа компилируется под определенный набор команд.
Архитектура набора команд (ISA)
- Архитектура набора команд сильно влияет на архитектуру процессора.
- Использование определенной архитектуры набора команд может усложнить или упростить задачу по созданию высокопроизводительного или энергоэффективного процессора.
CISC, RISC
- x86 — это то, что называется архитектурой CISC (complex instruction set computing).
- ARM - архитектура RISC (reduced instruction set computer).
- Сейчас границы размыты, идеи заимствованы друг от друга.
CISC
- Раньше: память была очень дорогой. Компиляторы были плохие, а люди писали на ассемблере.
- Так как память была дорогой, люди искали способ минимизировать использование памяти.
- Одно из таких решений — использовать сложные инструкции процессора, которые делают много действий.
- Помогло программистам на ассемблере, так как они смогли писать более простые программы, ведь всегда найдется инструкция, которая выполняет то, что нужно.
CISC
Примеры сложных команд в x86:
- LOOP — уменьшает значение регистра CX на 1 и выполняет переход, если CX не равен нулю. Цикл в одной инструкции.
- REP MOVSB — команда для копирования блока памяти. Процессор сам увеличивает указатели, уменьшает счетчик и повторяет операцию, пока весь блок не будет скопирован.
- ENTER и LEAVE — сложные команды для создания и разрушения стекового фрейма процедуры.
- Команды для работы со строками, которые сами обрабатывают целые массивы.
CISC
Разнообразие способов адресации: CISC-процессоры предоставляют множество гибких способов вычисления адреса операнда в памяти. Это позволяет мощно обращаться к данным "на лету".
- Прямая адресация: MOV AX, [1000h] (загрузить в AX данные по адресу 1000h).
- Косвенная адресация: MOV AX, [BX] (загрузить в AX данные по адресу, хранящемуся в регистре BX).
- Базовая индексная со смещением: MOV AX, [BX + SI + 10h]. Это очень мощный режим, идеально подходящий для работы с массивами и структурами. Вычисление такого сложного адреса берет на себя процессор.
CISC
Команды, работающие непосредственно с памятью
- Один или оба операнда арифметической операции могут находиться прямо в памяти.
- ADD [BX], AX — прибавить значение регистра AX к данным в памяти по адресу в BX.
- В RISC для этого потребовалось бы три команды:
- LOAD R1, [BX] (загрузить данные из памяти в регистр R1)
- ADD R1, R1, AX (выполнить сложение в регистре)
- STORE [BX], R1 (записать результат обратно в память)
CISC
- Через некоторое время все стало сложным.
- Очень сложно создать процессор, который бы быстро выполнял эти запутанные команды с переменной длиной.
- Этап декодирования (преобразования команды в низкоуровневые сигналы для АЛУ) становится "бутылочным горлышком".
- Неравномерное время выполнения: Одни команды выполняются за 1 такт, другие — за десятки. Это крайне усложняет конвейеризацию (pipelining).
- Изначально ее решили с помощью микрокода.
Микрокод
- В программировании повторяющийся код выносится в отдельные подпрограммы (функции), которые можно вызывать множество раз.
- Идея микрокода очень близка к этому.
- Для каждой инструкции из набора создается подпрограмма, которая состоит из простых инструкций и хранится в специальной памяти внутри микропроцессора.
Микрокод
- Таким образом, процессор содержит небольшой набор простых инструкций. На их основе можно создать множество сложных инструкций из набора команд с помощью добавления подпрограмм в микрокод.
- Микрокод хранится в ROM-памяти (Read-Only Memory, только для чтения), которая значительно дешевле оперативной памяти.
Микрокод
- со временем начались проблемы, связанные с подпрограммами в микрокоде.
- В них появились ошибки.
- Исправление ошибки в микрокоде в разы сложнее, чем в обычной программе.
- Нельзя получить доступ к этому коду и протестировать его как обычную программу.
RISC
- Оперативная память стала дешеветь, компиляторы стали лучше, а большинство разработчиков перестало писать на ассемблере.
- большинство сложных инструкций CISC не используются большинством программистов.
- Разработчики компиляторов затруднялись в выборе правильной сложной инструкции.
- Вместо этого они предпочли использовать комбинацию нескольких простых инструкций для решения проблемы.
RISC
- Идея RISC заключается в замене сложных инструкций на комбинацию простых.
- Так не придется заниматься сложной отладкой микрокода.
- Вместо этого разработчики компилятора будут решать возникающие проблемы.
- RISC-код может быть непростым для человека.
- Архитектура RISC оптимизирована для компиляторов, но не для людей.
RISC
- Архитектура "Загрузка-Сохранение" (Load-Store Architecture)
- Арифметические и логические операции (ADD, SUB, AND, OR) могут выполняться только над данными, находящимися в регистрах.
- Память недоступна напрямую для вычислений.
- Для работы с данными в памяти существуют только две отдельные команды:
- LOAD — пересылает данные из памяти в регистр.
- STORE — пересылает данные из регистра в память.
- Это радикально упрощает устройство АЛУ (Арифметико-логического устройства) и систему управления процессора.
RISC, CISC
Архитектура x86
- x86 - это семейство архитектуры наборов команд, первоначально разработанные Intel на основе Intel 8086 микропроцессор и его вариант 8088.
- 8086 был представлен в 1978 году как полностью 16-битное расширение 8-битного 8080 микропроцессора Intel с сегментацией памяти в качестве решение для адресации большего объема памяти, чем может покрыть простой 16-битный адрес.
- Термин «x86» появился потому, что имена нескольких преемников процессора Intel 8086 заканчиваются на «86», включая 80186, 80286, 80386 и 80486 процессоров.
Общие сведения:
- Разработчик: Intel, AMD
- Биты: 16-бит, 32-бит и 64-бит
- Введены: 1978 (16-бит), 1985 (32-бит), 2003 (64-бит)
- Архитектура: CISC
- Тип архитектуры: регистр-память
Общие сведения:
- Переменная: от 1 до 15 байтов
- Ветвление: код условия (регистр состояния)
- Порядок байт: в основном little.
- Размер страницы: 8086 - i286 : нет. i386, i486 : страницы 4 КБ. P5 Pentium : добавлены страницы 4 МБ. (Legacy PAE : 4 КБ → 2 МБ). x86-64 : добавлены страницы 1 ГБ
Архитектура регистр-память
- Позволяет выполнять операции с памятью (или из нее), а также с регистрами
- Если архитектура позволяет всем операндам находиться в памяти, в регистрах или в комбинациях, это называется архитектурой «регистр плюс память».
- В подходе регистр – память один из операндов для операции ADD может быть в памяти, а другой - в регистре.
- Архитектура: загрузки/сохранения: оба операнда для операции ADD должны находиться в регистрах перед ADD.
- Примерами архитектуры регистровой памяти являются IBM System / 360, его преемники и Intel x86. Примеры архитектуры регистр плюс память: VAX
Реальный режим (Real Mode) — 16-бит
- Это режим, в котором работал исходный процессор 8086. Его модель памяти называется Сегментной моделью.
- Адресуемое пространство: 1 МБ (2^20 = 1,048,576 байт).
- Размер адреса: 20 бит. Но регистры были 16-битными! Возникла проблема: как с помощью 16-битного числа адресовать 1 МБ
- Физический адрес вычисляется по формуле: Физический адрес = (Сегментный адрес * 16) + Смещение
- Сегментный регистр (CS, DS, SS, ES): Содержит базовый адрес сегмента. Умножение на 16 (или сдвиг на 4 бита влево) означает, что сегменты выравнены по параграфам (границам 16 байт).
- Смещение (Offset): 16-битное значение, указывающее на конкретный байт внутри сегмента. Это значение находится в одном из универсальных регистров (например, IP, SI, DI, BX, SP, BP).
Реальный режим (Real Mode) — 16-бит
- CS = 0x1234, IP = 0x5678
- Физический адрес = (0x1234 * 16) + 0x5678 = 0x12340 + 0x5678 = 0x179B8
- Сегмент кода (Code Segment, CS): Указывается парой CS:IP. IP (Instruction Pointer) — указатель на следующую команду.
- Сегмент данных (Data Segment, DS): Используется по умолчанию для доступа к данным. Указывается парой DS:[SI/BX/...].
- Сегмент стека (Stack Segment, SS): Указывается парой SS:SP. SP (Stack Pointer) — вершина стека. BP (Base Pointer) используется для доступа к аргументам и переменным в стеке.
- Дополнительный сегмент (Extra Segment, ES): Часто используется для операций со строками, указывая на приемник (ES:DI).
- Проблема реального режима: Нет защиты памяти. Любая программа может получить доступ к любой области памяти, включая память ядра ОС, что приводит к нестабильности системы.
Защищенный режим (Protected Mode)
- Начиная с процессора 80286 (и полноценно с 386), появился защищенный режим. Его главные цели — защита памяти и поддержка виртуальной памяти.
- Виртуальное адресное пространство: До 4 ГБ для каждой программы (32-битная адресация). Каждой программе кажется, что она одна в системе и имеет в распоряжении всё адресное пространство.
- Изоляция: Программы не могут напрямую обращаться к памяти друг друга или к памяти ОС.
- Сегментация + Страничная организация: Сегментация используется для защиты, а страничная организация — для управления виртуальной памятью и подкачкой (swapping).
Защищенный режим (Protected Mode)
- Здесь сегменты — это не просто числа, умноженные на 16. Теперь это защищенные объекты.
- Дескрипторы: Каждый сегмент описывается структурой данных в памяти, называемой дескриптором. Дескриптор содержит:
- Базовый адрес (32 бита) — реальный начальный адрес сегмента в памяти.
- Лимит (предел) (20 бит) — размер сегмента.
- Атрибуты доступа: Уровень привилегий (0-3, где 0 — ядро ОС, 3 — приложение), тип сегмента (код/данные/системный), разрешение на чтение/запись/выполнение.
Защищенный режим (Protected Mode)
- Таблица дескрипторов: Все дескрипторы собраны в таблицы в памяти:
- GDT (Global Descriptor Table): Единственная таблица на всю систему. Содержит дескрипторы, общие для всех задач (например, сегменты кода и данных ОС).
- LDT (Local Descriptor Table): Может быть у каждой задачи (процесса) для описания её собственных сегментов.
- Селекторы: Сегментные регистры (CS, DS, etc.) в защищенном режиме содержат не базовый адрес, а селектор.
- Селектор — это индекс, указывающий на дескриптор в GDT или LDT.
- Также он содержит флаг, указывающий на GDT/LDT, и запрашиваемый уровень привилегий (RPL).
Защищенный режим (Protected Mode)
- Процесс преобразования (логический -> линейный адрес):
- Процессор берет селектор из сегментного регистра (например, CS).
- Находит соответствующий дескриптор в GDT/LDT.
- Проверяет права доступа (можно ли выполнять код из этого сегмента?).
- Берет базовый адрес из дескриптора.
- Прибавляет к нему смещение (из EIP или другого регистра).
- Получается линейный адрес (32 бита).
Защищенный режим (Protected Mode)
- Страничная организация (Paging) — виртуальная память
- Этот механизм преобразует линейный адрес (результат сегментации) в физический адрес. Именно он позволяет реализовать виртуальную память.
- Включение: Страничная организация включается отдельно установкой бита в управляющем регистре CR0.
- Страницы: Память делится на небольшие блоки фиксированного размера — страницы (обычно 4 КБ).
- Виртуальная память: Каждая программа работает со своим 4-ГБ линейным адресным пространством. ОС с помощью страничного механизма отображает виртуальные страницы программы на физические страницы в ОЗУ или на диске (в файле подкачки).
Защищенный режим (Protected Mode)
- Механизм преобразования (линейный -> физический адрес):
- Используется многоуровневая таблица страниц (чаще всего двухуровневая в 32-битном режиме):
- Линейный адрес делится на части:
- Директория (Page Directory): Старшие 10 бит — индекс в таблице каталогов страниц (PD).
- Таблица страниц (Page Table): Следующие 10 бит — индекс в таблице страниц (PT).
- Смещение (Offset): Младшие 12 бит — смещение внутри 4-КБ страницы.
- CR3 (управляющий регистр) содержит физический адрес каталога страниц (Page Directory) текущей задачи.
- Процессор: Использует старшие 10 бит линейного адреса как индекс в каталоге страниц, находит запись (PDE), которая указывает на нужную таблицу страниц
- Использует следующие 10 бит как индекс в таблице страниц, находит запись (PTE), которая содержит физический адрес начала страницы в памяти.
- Прибавляет к этому адресу 12-битное смещение, получая итоговый физический адрес.
Защищенный режим (Protected Mode)
Преимущества страничной организации:
- Swapping: Если страница не нужна, её можно выгрузить на диск, а в PTE отметить "страницы нет в памяти". При обращении к ней процессор сгенерирует исключение (#PF, Page Fault), и ОС загрузит страницу с диска обратно в ОЗУ.
- Разделяемая память: Одна физическая страница может быть отображена в адресные пространства нескольких процессов.
- Защита: Каждая страница имеет атрибуты (Read/Write/Execute).
64-битный режим (Long Mode)
В 64-битном режиме (x86-64) модель памяти была кардинально упрощена:
- Сегментация данных фактически отключена.
- Базовые адреса сегментов CS, DS, ES, SS принудительно устанавливаются в 0, а лимиты — в максимальное значение.
- Это создает плоское (flat) 64-битное адресное пространство. Логический адрес = линейный адрес.
- Сегментные регистры почти не используются, кроме особых случаев (например, FS и GS, которые ОС использует для указания на специальные структуры данных: в Windows GS указывает на структуру KPCR для ядра).
64-битный режим (Long Mode)
Расширение страничной организации
- Адресное пространство: 2^64 байт (теоретически), но обычно процессоры используют 48 или 57 бит для виртуальных адресов (256 ТБ или 128 ПБ).
- Усложнение таблиц страниц: Для адресации огромного пространства используются 4-уровневые (PAE paging) или даже 5-уровневые таблицы страниц.
- Размер страниц: Поддерживаются страницы разного размера (4 КБ, 2 МБ, 1 ГБ), что повышает производительность (меньше уровней таблиц для больших областей памяти).
Регистр состояния
- Регистр, содержащий флаги, дающие дополнительную информацию о результате в процессоре
- Примеры таких регистров включают регистр FLAGS в архитектуре x86
- Отдельные биты неявно или явно считываются и / или записываются инструкциями машинного кода, выполняемыми на процессоре.
- Регистр состояния позволяет инструкции выполнять действия в зависимости от результата предыдущей инструкции.
- Обычно флаги в регистре состояния изменяются в результате арифметических операций и операций манипулирования битами. Например, бит Z может быть установлен, если результат операции равен нулю, и очищен, если он не равен нулю.
Общие флаги
- Z, Нулевой флаг: Указывает, что результат арифметической или логической операции (или, иногда, загрузки) был нулевым.
- C, Флаг переноса: Позволяет добавлять / вычитать числа, превышающие одно слово, путем переноса двоичной цифры из менее значимого слова в наименее значимый бит более значимого слова по мере необходимости.
- S/ N, Знаковый флаг. Отрицательный флаг: Указывает, что результат математической операции отрицательный.
- V/ O/ W, Флаг переполнения: Указывает, что подписанный результат операции слишком велик, чтобы поместиться в ширину регистра с использованием представления с дополнением до двух.
Порядок байт
- Порядок байтов - это порядок или последовательность байтов в слове цифровых данных в памяти компьютера.
- Система с прямым порядком байтов хранит старший значащий байт слова по наименьшему адресу памяти и младший значащий байт по наибольшему.
- Система с прямым порядком байтов, напротив, хранит младший байт по наименьшему адресу.
регистры x86
- Исходные Intel 8086 и 8088 имеет четырнадцать 16- битных регистров.
- Четыре из них (AX, BX, CX, DX) являются регистрами общего назначения (GPR)
- К каждому из них можно обращаться как к каждому байтам (таким образом, как к старшему байту BX можно обращаться как к BH, а к младшему - к BL).
- SP (указатель стека) указывает на «верх» стека
- BP (базовый указатель) часто используется для указания на какое-то другое место в стеке, обычно выше локальные переменные
- Регистры SI, DI, BX и BP являются адресными регистрами
- Четыре сегментных регистратора (CS, DS, SS и ES) используются для формирования адреса памяти.
- указатель инструкции (IP) указывает на инструкцию, которая будет извлечена из памяти и затем выполнена; к этому регистру нельзя получить прямой доступ (чтение или запись) для программы.
Классификация
- 1 поколение — способность исполнять код i8086 (IA16).
- 1+ поколение — частичная паралеллизация исполнения команд, специализация ФУ.
- 2 поколение — поддержка виртуальной памяти, многозадачности и 32-битности (IA32).
- 2+ поколение — L1-кэш.
- 3 поколение — встроенный FPU, исполнительный конвейер (не обязательно для RISC-подобных микроопераций).
- 3+ поколение — умножитель частоты ядра.
Классификация
- 4 поколение — IPC>=2, специализация L1.
- 4+ поколение — SIMD: 4/2/1-байтовые целые (обозначено как 4i).
- 5 поколение — конвейеризованный FPU, OoO, L2-кэш.
- 5+ поколение — IPC>=3, SIMD: вещественные одинарной (SP) и двойной (DP) точности, 8/4/2/1-байтовые целые (SP+4i и DP+8i).
- 6 поколение — многоядерность, 64-битность (x86-64).
- 6+ поколение — встроенный контроллер памяти, L3-кэш.
Правила формирования поколений
- Процессор относится к определённому поколению в том случае, если у него присутствуют все признаки этого и всех предыдущих поколений.
- Правило образования исключений: процессор может быть продвинут вперёд на полпоколения, даже если у него отсутствует требуемая функциональность, но присутствует другая функциональность более позднего поколения.
Умножитель частоты
- ФАПЧ (PLL - Phase-Locked Loop) или "петля фазовой автоподстройки частоты".
- Множитель процессора (коэффициент умножения) — это число, на которое умножается частота шины.
- В результате получаем реальную (внутреннюю) частоту процессора.
- Например, частота шины (FSB) составляет 533 Mhz, коэффициент умножения — 4.5, получаем: 533 x 4.5 = 2398,5 Мгц.
- Почти у всех современных процессоров данный параметр является заблокированным на уровне ядра и не поддается изменению.
- Сложная система, которая синхронизирует фазы сигналов.
Умножитель частоты
- Тактовый генератор (Generator): Генерирует опорную частоту (это и есть базовая частота шины, например, 100 МГц).
- Делитель частоты (Divider): Делит высокочастотный сигнал, поступающий из процессора, на коэффициент умножения (N).
- Детектор фазы (Phase Detector): Сравнивает фазу опорного сигнала (100 МГц) и фазу сигнала, поделённого внутри процессора.
- Если фазы совпадают — система стабильна.
- Если есть расхождение — детектор выдаёт сигнал ошибки.
Умножитель частоты
- Фильтр (Loop Filter): "Сглаживает" сигнал ошибки, превращая его в постоянное напряжение.
- Управляемый генератор (VCO - Voltage-Controlled Oscillator). Он генерирует конечную, высокую частоту для ядра процессора. Частота VCO напрямую зависит от управляющего напряжения с фильтра.
- Если частота VCO слишком низкая — детектор фазы скорректирует напряжение, и VCO ускорится.
- Если частота VCO слишком высокая — напряжение скорректируется в другую сторону, и VCO замедлится.
- Система входит в равновесие, и VCO стабильно генерирует частоту, которая ровно в N раз превышает опорную.
Умножитель частоты
- Базовая частота (BCLK/FSB): Это "шаг" или "квант", от которого отталкивается вся система. В старых системах это была частота FSB. В современных — это Base Clock (BCLK), обычно равная 100 МГц. От неё зависят не только частота процессора, но и частоты памяти, шины PCIe и других компонентов (через свои множители).
- Коэффициент умножения (CPU Multiplier / Ratio): Целое число или дробное (например, x47), на которое умножается BCLK. Именно этот параметр в основном и определяет итоговую частоту процессора.
- Заблокированный множитель: У большинства процессоров множитель заблокирован сверху. Производитель устанавливает его на максимальном значении, и вы не можете его повысить для разгона.
- Разблокированный множитель: Процессоры серий Intel K/KF и AMD Black Edition/Ryzen (серия X и без индекса) имеют разблокированный множитель. Это позволяет легко увеличивать частоту процессора (разгонять его) простым изменением этого множителя в BIOS/UEFI, не затрагивая BCLK и не нарушая стабильность других компонентов.
Умножитель частоты
- Эпоха FSB (Front-Side Bus): В процессорах Pentium, Core 2 Duo использовалась шина FSB. Её частота (например, 266, 333, 400 МГц) умножалаcь на множитель, чтобы получить частоту ядра. Память тоже работала на частоте, зависящей от FSB.
- Современная архитектура (Intel и AMD): Концепция FSB устарела. Теперь используется Base Clock (BCLK ~100 МГц). Каждый компонент (ядро, кеш-память, оперативная память, шина PCIe) имеет свой независимый множитель по отношению к BCLK.
- Частота Ядра = BCLK * CPU Ratio
- Частота Памяти = BCLK * Memory Ratio
- Частота Шины PCIe = BCLK * PCIe Ratio (обычно фиксирован)
- Это сделало систему гибче и стабильнее. При разгоне можно менять только множитель CPU, не трогая BCLK, чтобы не "сломать" работу оперативной памяти и видеокарты.
Расширения: модуль с плавающей точкой (FPU)
- Часть процессора для выполнения широкого спектра математических операций над вещественными числами.
- x87 — это специальный набор инструкций для работы с математическими вычислениями, являющийся подмножеством архитектуры процессоров x86.
- инструкции не являются строго необходимыми для построения рабочей программы, но будучи аппаратно реализованными, общие математические задачи они позволяют выполнять гораздо быстрее.
- Например, в наборе инструкций x87 присутствуют команды для расчёта значений синуса или косинуса.
Расширения: модуль с плавающей точкой (FPU)
- Сопроцессор подключен к шинам центрального процессора, а также имеет несколько специальных сигналов для синхронизации процессоров между собой.
- Часть командных кодов центрального процессора зарезервирована для сопроцессора, он следит за потоком команд, игнорируя другие команды.
- Центральный процессор, наоборот, игнорирует команды сопроцессора, занимаясь только вычислением адреса в памяти, если команда предполагает к ней обращение.
- Центральный процессор делает цикл фиктивного считывания, позволяя сопроцессору считать адрес с адресной шины. Если сопроцессору необходимо дополнительное обращение к памяти (для чтения или записи результатов), он выполняет его через захват шины.
- После получения команды и необходимых данных сопроцессор начинает её выполнение.
Расширения: модуль с плавающей точкой (FPU)
- Регистры FPU организованы не в виде массива, а как регистровый стек.
- FPU представляет собой стековый калькулятор, работающий по принципу обратной польской записи
- Это означает, что команды всегда используют верхнее значение в стеке для проведения операций
- Доступ к другим хранящимся значениям обычно обеспечивается в результате манипуляций со стеком
Расширения: модуль с плавающей точкой (FPU)
- Внутри FPU числа хранятся в 80-битном формате с плавающей запятой (расширенная точность)
- Вещественные числа в трёх форматах: коротком (32 бита), длинном (64 бита) и расширенном (80 бит).
- Двоичные целые числа со знаком в трёх форматах: 16, 32 и 64 бита.
- Упакованные целые десятичные числа (BCD-числа) — длина максимального числа составляет 18 упакованных десятичных цифр (72 бита).
- не-число (англ. not-a-number (NaN)). Различают два вида не-чисел.
- SNaN (Signaling Not-a-Number) — сигнальные не-числа. Сопроцессор реагирует на появление этого числа в регистре стека возбуждением исключения недействительной операции.
- QNaN (Quiet Not-a-Number) — спокойные (тихие) не-числа. Сопроцессор может формировать спокойные не-числа в качестве реакции на определённые исключения, например, число вещественной неопределённости.
Расширения: модуль с плавающей точкой (FPU)
- В FPU можно выделить три группы регистров:
- Стек процессора: регистры R0..R7. Размерность каждого регистра: 80 бит.
- Регистр состояния процессора SWR (Status Word Register) — информация о текущем состоянии сопроцессора. Размерность: 16 бит.
- Управляющий регистр сопроцессора CWR (Control Word Register) — управление режимами работы сопроцессора. Размерность: 16 бит.
- Регистр слова тегов TWR (Tags Word Register) — контроль над регистрами R0..R7 (например, для определения возможности записи). Размерность: 16 бит.
- Указатель данных DPR (Data Point Register). Размерность: 48 бит.
- Указатель команд IPR (Instruction Point Register). Размерность: 48 бит.
Расширения: модуль с плавающей точкой (FPU)
- Команды передачи данных
- Команды сравнения данных
- Арифметические команды
- Трансцендентные команды
- Команды управления
Расширения: MMX
- MMX (сокр. от MultiMedia eXtensions - мультимедийные расширения)
- набор инструкций микропроцессора, предназначенных для ускорения обработки аудио- и видеоданных.
- Технология MMX разработана компанией Intel и впервые использована в 1997 году в процессорах Pentium MMX.
- Представляет собой 57 дополнительных команд и восемь 64-битных регистров
- Позволяет процессору за одну машинную операцию обрабатывать 64-битное бинарное слово которое может включать сразу несколько более мелких однотипных "частичек" - 8 байтов (1 байт = 8 битов), 4 слова (по 16 бит) или 2 двойных слова (по 32 бита).
- За счет этого в программах, разработанных с учетом поддержки MMX, процессору для обработки большого массива однотипных данных (которыми, по сути, и являются мультимедийные данные) требуется значительно меньше времени.
Расширения: MMX
- Например, при работе с цифровым изображением с глубиной цвета 16 бит процессор с MMX, в отличие от процессора без этого набора инструкций, может одновременно обрабатывать не один, а сразу 4 пиксела.
- По результатам синтетических тестов, MMX обеспечивает в среднем почти пятикратное увеличение производительности при работе с мультимедиа. На практике эти цифры несколько скромнее - около 1,5 - 1,7 раза (в оптимизированных приложениях).
- Недостатком MMX является то, что она может быть использована процессором только для обработки целых чисел.
- Кроме того, MMX имеет общие с сопроцессором регистры, так что одновременно задействовать инструкции MMX и инструкции сопроцессора процессор не может.
Расширения: 3DNow!
- 3DNow! — технология, разработанная компанией AMD. Впервые использована в 1998 году в процессоре AMD K6-2.
- 3DNow! является развитием технологии MMX.
- Она представляет собой 21 дополнительную инструкцию процессора, предоставляющую ему возможность оперировать 32-битными вещественными числами в регистрах MMX.
- Этим 3DNow! устранила один из главных недостатков MMX, которая ограничивалась ускорением только целочисленных операций одинарной точности. 3DNow! также существенно оптимизировала работу с кешем.
- По состоянию на 1998 г. 3DNow! позволила процессорам от AMD существенно опередить конкурентов от Intel в области обработки мультимедийных данных.
Расширения: SSE
- SSE (сокр. от Streaming SIMD Extensions) – технология, разработанная компанией Intel. SIMD расшифровывается как Single Instruction Multiple Data, что значит "одна инструкция - множество данных".
- Впервые SSE была использована в 1999 году в процессорах Pentium ІІІ с ядром Katmai. Изначально она называлась KNI (Katmai New Instructions).
- SSE стала своеобразным ответом Intel на разработанную годом ранее компанией AMD технологию 3DNow!.
- Так же, как и 3DNow!, SSE применяется процессором, когда нужно совершить одни и те же действия над разными данными и обеспечивает осуществление до 4 таких вычислений за 1 такт.
- Этим достигается существенный прирост быстродействия. При этом, данные могут быть как целочисленными, так и вещественными.
- Преимуществом SSE по сравнению с 3DNow! является использование собственных регистров, благодаря чему вместе с инструкциями SSE процессор может задействовать инструкции математического сопроцессора (регистры 3DNow! являются общими с сопроцессором и использовать их одновременно процессор не может).
Расширения: SSE
- 70 новых инструкций;
- 8 (в 64-битных процессорах - 16) 128-битных регистров, каждый из которых разделён на четыре 32-битных регистра с плавающей точкой;
- одного 32-битного (в 64-битных процессорах - одного 64-битного) регистра управления, необходимого также для проверки состояния SSE инструкций.
- Каждый 128-битный регистр SSE может одновременно хранить не только 4 32-битных числа. За один такт процесор может обрабатывать любые данные, помещающиеся в 128 бит (при условии использования оптимизированного программного обеспечения).
Расширения: SSE2
- SSE2 - набор инструкций, разработанный компанией Intel и впервые использованный ею в процессорах Pentium 4 (2000 - 2001 гг.).
- По сути SSE2 является дополнением к технологии SSE, разработанной Intel в 1999 году.
- Этот набор инструкций добавил к SSE 144 новые команды (в SSE их было только 70).
- дополнительные регистры не вводились.
- инструкции SSE2 используют все те же восемь 128-битных регистров SSE и позволяют процессору улучшить работу с ними.
- В частности, SSE2 дает возможность в регистрах SSE эффективно производить разнообразные операции со скалярными и упакованными типами данных, вещественными числами
- SSE2 включает в себя сложные дополнения к командам преобразования чисел, а также алгоритмы управления кэшем процессора, минимизирующие его загрязнения при обработке объёмных потоков данных.
Расширения: SSE3
- SSE3 является развитием технологий MMX, SSE, SSE2, представляет собой набор из 13 дополнительных команд, позволяющих процессору более эффективно использовать 128-битные регистры SSE.
- инструкцию по преобразованию чисел с плавающей точкой в целые числа;
- три инструкции дублирования данных;
- инструкцию загрузки невыровненных переменных;
- две инструкции одновременного сложения/вычитания;
- четыре инструкции горизонтального сложения/вычитания;
- две инструкции синхронизации потоков.
Расширения: AVX
- AVX (Advanced Vector Extensions) - расширение системы команд процессора, разработанное компанией Intel в 2008 году, которое, как и SSE, SSE2, SSE3, SSSE3, SSE4, стало дальнейшим развитием технологий SIMD (Single Instruction - Multiple Data, то есть "одна инструкция - множество данных").
- в 2 раза были увеличены регистры SIMD (со 128 до 256 бит)
- добавлен набор дополнительных 256-битных инструкций, выполняемых в этих регистрах
- При этом, сохранилась поддержка существующих 128-битных SSE-инструкций процессора, которые теперь использовали только первую половину новых 256-битных регистров.
- Благодаря расширению регистров, процессор с поддержкой AVX за каждый такт может обрабатывать до 2 раз больше информации в интенсивных вычислениях с плавающей точкой
Расширения: AVX
- Трёхоперандный синтаксис: Это фундаментальное улучшение с точки зрения программирования и эффективности.
- Старый синтаксис (SSE): DEST = DEST OP SRC
- Пример: ADDPS XMM0, XMM1 // XMM0 = XMM0 + XMM1
- Проблема: Исходный регистр-приёмник (XMM0) перезаписывается. Если его значение нужно было сохранить, приходилось делать лишнюю операцию копирования.
- Новый синтаксис (AVX): DEST = SRC1 OP SRC2
- Пример: VADDPS YMM0, YMM1, YMM2 // YMM0 = YMM1 + YMM2
- Преимущество: Исходные регистры (YMM1, YMM2) не разрушаются. Это позволяет создавать более эффективный код без лишних операций пересылки данных, что упрощает работу компиляторов.
- Инструкции AVX используют префикс V (например, VADDPS), чтобы отличаться от старых SSE-инструкций (ADDPS)
Расширения: AVX
- AVX Tax (Налог AVX): Когда процессор выполняет тяжёлые AVX-инструкции, он потребляет значительно больше энергии и, как следствие, сильнее нагревается.
- Автоматическое снижение частоты (AVX Offset): Чтобы оставаться в пределах теплового пакета (TDP), современные процессоры при длительной нагрузке AVX могут автоматически снижать свою тактовую частоту на несколько сотен мегагерц. Это необходимо для предотвращения перегрева.
- 256-битные исполнительные блоки внутри ядра процессора — это огромные, сложные и энергоёмкие схемы. Их активная работа требует большой мощности.
Расширения: AVX
- AVX2 (Haswell, 2013): Значительное развитие AVX.
- Добавила поддержку целочисленных операций на 256-битных регистрах (AVX1 работала только с float).
- Ввела мощные инструкции, такие как FMA (Fused Multiply-Add), которые выполняют операцию a = a + (b * c) за один такт, что критически важно для линейной алгебры.
- Расширила набор инструкций (сборки-разборки векторов, сдвиги).
- AVX-512 (Xeon, затем Core): Следующий шаг — удвоение до 512 бит.
- 512-битные регистры (ZMM): 16 чисел single-precision или 8 чисел double-precision за такт.
- Маскирование (opmask): Позволяет выполнять операции только над выбранными элементами вектора, исключая необходимость в условных переходах.
- Ещё больше новых инструкций для специализированных задач.
- Из-за очень высоких требований к энергии и площади кристалла поддержка AVX-512 в потребительских процессорах была неоднозначной, но остаётся ключевой для серверов и HPC.
Расширения: FMA
- FMA (Fused Multiply-Add) — это инструкция, которая выполняет операцию умножения с последующим сложением за одну операцию, без промежуточного округления.
- Базовая операция выглядит так: a = a + (b * c)
- Или в более общем виде:
d = a + (b * c)
- Ключевое слово — "Fused" (Объединённое). Это означает, что операция выполняется как единое целое внутри процессора.
Расширения: FMA
- Без FMA (Раздельные операции)
- Умножение: temp = b * c
- Процессор выполняет умножение.
- Результат округляется до ближайшего представимого числа с плавающей запятой согласно стандарту IEEE 754.
- Промежуточный результат сохраняется в временную переменную temp.
- Сложение: a = a + temp
- Процессор выполняет сложение.
- Результат снова округляется.
- Две операции: Требуется два такта процессора (или два прохода через конвейер).
- Два округления: Каждое округление вносит небольшую ошибку (погрешность). Накопление таких ошибок может привести к значительной потере точности в длинных вычислениях.
Расширения: FMA
- С FMA (Объединённая операция)
- Объединённое умножение-сложение: a = FMA(b, c, a)
- Процессор выполняет всю операцию a + (b * c) за один такт.
- Округление происходит только один раз — в самом конце.
- Скорость: Одна операция вместо двух. Удвоение пропускной способности для цепочек умножений-сложений.
- Точность: Одно округление вместо двух. Это не просто "немного точнее", в некоторых случаях это кардинально меняет результат, делая его более корректным с математической точки зрения.
Расширения: AES-NI
- AES-NI — это набор инструкций для аппаратного ускорения алгоритма шифрования AES (Advanced Encryption Standard)
- специализированный "сопроцессор" внутри основного CPU, который заточен под выполнение операций, критически важных для шифрования и дешифрования по алгоритму AES.
- Вместо того чтобы выполнять сотни стандартных команд для каждого шага шифрования, процессор делает это одной специализированной инструкцией.
- Алгоритм AES состоит из множества раундов (10, 12 или 14 в зависимости от длины ключа), каждый из которых включает в себя
- SubBytes (замена байт по таблице)
- ShiftRows (перестановка строк)
- MixColumns (сложение и умножение в поле Галуа)
- AddRoundKey (сложение с ключом)
Расширения: AES-NI
- AES-NI — это набор инструкций для аппаратного ускорения алгоритма шифрования AES (Advanced Encryption Standard)
- специализированный "сопроцессор" внутри основного CPU, который заточен под выполнение операций, критически важных для шифрования и дешифрования по алгоритму AES.
- Вместо того чтобы выполнять сотни стандартных команд для каждого шага шифрования, процессор делает это одной специализированной инструкцией.
- Алгоритм AES состоит из множества раундов (10, 12 или 14 в зависимости от длины ключа), каждый из которых включает в себя
- SubBytes (замена байт по таблице)
- ShiftRows (перестановка строк)
- MixColumns (сложение и умножение в поле Галуа)
- AddRoundKey (сложение с ключом)
Расширения: AES-NI
- Эти операции, особенно в поле Галуа (GF(2⁸)), не очень эффективны для общего процессора.
- В результате шифрование/дешифрование становится "узким местом", потребляя значительные ресурсы CPU и ограничивая скорость работы приложений, использующих шифрование.
- AES-NI решает эту проблему, предоставляя специальные инструкции, которые выполняют целые раунды AES или их ключевые части за один такт процессора.
Расширения: AES-NI
- Набор состоит из шести инструкций, которые работают с регистрами SSE (XMM):
- AESENC (AES Encrypt) — Выполняет один раунд шифрования.
- AESENCLAST (AES Encrypt Last) — Выполняет финальный раунд шифрования.
- AESDEC (AES Decrypt) — Выполняет один раунд дешифрования.
- AESDECLAST (AES Decrypt Last) — Выполняет финальный раунд дешифрования.
- AESKEYGENASSIST (AES Key Generation Assist) — Помощь в генерации раундовых ключей из основного ключа.
- AESIMC (AES Inverse Mix Columns) — Выполняет операцию Inverse Mix Columns для подготовки ключей к дешифрованию.
Расширения: AES-NI
- Скорость: Обработка данных ускоряется в 3–10 раз по сравнению с чисто программной реализацией.
- Загрузка CPU: Нагрузка на процессор при шифровании одного и того же потока данных снижается в 5–10 раз. Это критически важно для серверов, которые одновременно обслуживают сотни или тысячи зашифрованных соединений.
- Энергоэффективность: Поскольку задача выполняется быстрее и меньшим количеством инструкций, процессор тратит меньше энергии на шифрование, что увеличивает время автономной работы мобильных устройств.
Расширения: AES-NI
- Полнодисковое шифрование (FDE): BitLocker (Windows), FileVault (macOS), dm-crypt/LUKS (Linux).
- Без AES-NI работа с зашифрованным диском могла бы приводить к заметным "подтормаживаниям" системы. С AES-NI разница в производительности между зашифрованным и незашифрованным диском практически незаметна для пользователя.
- Протоколы HTTPS (TLS/SSL), VPN (OpenVPN, IPsec, WireGuard), SSH.
- Любой веб-сервер (например, Google, Cloudflare), обрабатывающий миллионы HTTPS-запросов в секунду, был бы неспособен это делать без AES-NI.
- Шифрование данных "на лету" (transparent data encryption) в СУБД, таких как Microsoft SQL Server, Oracle.
- Зашифрованные виртуальные диски и контейнеры (VeraCrypt).
Расширения: AES-NI
- Intel: Впервые появилось в процессорах на микроархитектуре Westmere (2010 год). Сегодня поддерживается практически во всех процессорах для клиентов и серверов, начиная с Intel Core i5/i7 и Xeon.
- AMD: Добавили поддержку, начиная с микроархитектуры Bulldozer (2011 год). Поддерживается всеми современными процессорами Ryzen и EPYC.
- Проверка поддержки: В ОС Windows можно проверить наличие AES-NI с помощью утилиты CPU-Z (вкладка "Instructions"), в Linux — командой grep aes /proc/cpuinfo.
Расширения: Intel SGX
- Intel SGX (Software Guard Extensions) — это набор инструкций, который позволяет создавать защищённые области памяти, называемые энклавами (enclaves).
- Код и данные внутри энклава изолируются и шифруются аппаратно, так, что они становятся недоступными для любого другого программного обеспечения, включая:
- Операционную систему (даже с правами ядра)
- Гипервизоры (VMM) и виртуальные машины
- Системные администраторы с физическим доступом к машине
- Даже сам процессор Management Engine (ME)
Расширения: Intel SGX
- Энклавы (Enclaves)
- Это изолированные регионы памяти, защищённые аппаратно.
- Их содержимое (и код, и данные) автоматически шифруется контроллером памяти перед записью в RAM и расшифровывается при чтении обратно в процессор.
- Ключи шифрования генерируются аппаратно и уникальны для каждого процессора.
Расширения: Intel SGX
- Жизненный цикл энклава
- Создание (ECREATE): Приложение инициирует создание энклава в своей адресной памяти.
- Загрузка кода/данных (EADD): Критический код и данные загружаются в энклава. На этом этапе их целостность измеряется (хэшируется), создавая уникальный "отпечаток" (MRENCLAVE).
- Инициализация (EINIT): Энклава "запечатывается". После этого никакой код, даже с привилегиями ядра, не может изменить его содержимое. Любая попытка модификации приведёт к уничтожению энклава.
- Вызов (ECALL): Внешнее приложение может "войти" в энклава через специальные защищённые точки входа для выполнения кода внутри.
- Выход (OCALL): Код внутри энклава может выйти наружу (в небезопасное пространство) для вызова сервисов ОС (например, для работы с файлами или сетью), но делает это через строго определённые интерфейсы.
Расширения: Intel SGX
- Аттестация (Remote Attestation)
- Энклава генерирует криптографический отчёт, который включает её "отпечаток" (MRENCLAVE) и данные внутри.
- Этот отчёт подписывается аппаратным ключом, вшитым в процессор и известным только Intel.
- Удалённая сторона проверяет эту подпись через службу аттестации Intel.
- Если проверка проходит, сервер может быть уверен, что общается с доверенным кодом, и может передавать ему секретные данные (например, ключи шифрования, персональные данные).
- Энклава может "запечатать" свои данные перед выключением, зашифровав их ключом, привязанным либо к самому энклава, либо к процессору. Позже, при следующем запуске, тот же самый энклава (или другой, но с тем же идентификатором) может "распечатать" эти данные. Это позволяет сохранять состояние между сеансами работы.