Меню
Главная
Случайная статья
Настройки
|
x86 (англ. Intel 80x86) — архитектура процессора и одноимённый набор команд, впервые реализованные в процессорах компании Intel.
Название образовано от двух цифр, которыми заканчивались названия процессоров Intel ранних моделей — 8086, 80186, 80286 (i286), 80386 (i386), 80486 (i486). За время своего существования набор команд постоянно расширялся, сохраняя совместимость с предыдущими поколениями.
Помимо Intel, набор команд x86 также реализован в процессорах других производителей: AMD, VIA, Transmeta, IDT, Zhaoxin[2], МЦСТ (в процессорах Эльбрус) и др. В настоящее время для 32-битной версии архитектуры существует ещё одно название — IA-32 (Intel Architecture — 32).
Содержание
Основные особенности архитектуры
x86 — это CISC-архитектура. Доступ к памяти происходит по «словам». «Слова» размещаются по принципу little-endian, известному также как Intel-формат. Современные процессоры включают в себя декодеры команд x86 для преобразования их в упрощённый внутренний формат с последующим их выполнением.
Сегментная организация памяти
Реальный режим — классический режим адресации, использованный в первых моделях семейства. Адрес ячейки памяти (для работы с данными или для загрузки исполняемой команды процессора) формируется из сегмента (содержимого сегментного регистра) и смещения (константа, регистр, сумма регистра с константой или сумма двух регистров с константой); это записывается в виде SSSS:OOOO (Segment:Offset), где S и O — шестнадцатеричные цифры. Сам адрес вычисляется по формуле «Segment*16 + Offset».
Предельный адрес, к которому можно обратиться — это FFFF:FFFF, то есть FFFF0+FFFF=10FFEF или словами: «один мегабайт + 64 килобайта - 16 байт». Однако, у процессоров 8086, 8088 и 80186 адресная шина была всего 20 бит, и поэтому всё, что выходило за пределы одного мегабайта, оказывалось в начале памяти (в нулевом сегменте). Начиная с процессора 80286, можно было выбирать — работать в этом же режиме для совместимости или же при помощи драйвера HiMem задействовать дополнительный сегмент памяти, в котором можно было разместить DOS и резидентные программы.
(Помимо DOS, на компьютере могли работать другие операционные системы. Информация о том, как они использовали верхнюю память, вряд ли сохранилась.)
Оперативная память при этом оказывалась как бы неоднородной — небольшие блоки данных можно было обрабатывать, манипулируя только регистрами смещения, а для больших блоков данных приходилось манипулировать сегментными регистрами. Для описания этого были введены следующие термины:
- «параграф» — блок памяти размером 16 байт;
- «страница» — блок памяти размером 256 байт (Начиная с protected mode размер увеличивается до 4096 байт) ;
- «сегмент» — блок памяти размером 65536 байт;
(все блоки начинались с адреса, кратного их размеру).
Начиная с процессора 80386, при помощи драйвера DOS4GW появилась возможность использовать реальный режим с 32-битными регистрами и адресовать до четырёх гигабайт памяти. Сами сегменты тут фактически оказались не нужны.
Микропроцессоры 8086/8088, 80186/80188 и 80286 имели четыре сегментных регистра, т.е. могли работать одновременно с четырьмя сегментами памяти, имеющими определённое назначение:
- CS — сегмент кода, используется для выборки команд программы;
- DS — сегмент данных, используется по умолчанию для доступа к данным;
- ES — дополнительный сегмент, является получателем данных в командах обработки строк;
- SS — сегмент стека, используется для размещения программного стека.
В 80386 добавили ещё два, не имеющих специального назначения:
- FS — Дополнительный сегментный регистр, хранит в себе информацию о каждом процессе операционной системы ( в Unix-like системах ).
- GS — Аналогично предыдущему, но в новых процессорах с 64-битной архитектурой имеет особый статус: может использоваться для быстрого переключения контекстов, также используеться для хранения локальной информации ядра процессора.
Несмотря на то, что сегментные регистры имеют специальные назначения, архитектура допускает при некоторых обращениях к данным заменить один сегмент на любой другой. Сегменты кода, стека и получателя строк всегда используют регистры CS, SS и ES и не могут быть изменены.
Сегментный подход позволяет разделить всю память на 16 сегментов, начинающихся с адресов, кратных 64 Кбайт. Эти 16 сегментов называют страницами памяти. Обычно деление на страницы используется для совместного функционирования устройств, интерфейсы которых отображены на адресное пространство памяти; тогда каждое такое устройство использует одну страницу памяти, и адрес ячейки в адресном пространстве устройства будет совпадать со смещением в сегменте памяти компьютера. Так в компьютерах IBM PC адресное пространство распределялось таким образом:
- Первые десять сегментов (640 Кбайт) адресного пространства содержат оперативную память, в которой размещаются:
- векторы прерываний;
- область данных BIOS;
- DOS (если его не заставили разместиться в HiMem);
- код и данные выполняющихся программ.
- Два сегмента отдавались под видеоадаптер — VideoBIOS и «окно» для отображения видеопамяти в адресное пространство процессора (для видеоадаптеров CGA, EGA, VGA и остальных способ отображения очень сильно различался).
- Три сегмента использовались для размещения там разных вещей, например:
- программы, зашитые в ПЗУ, например, интерпретатор BASIC;
- BIOS различных плат расширения, например, SCSI-контроллеров (SCSI-BIOS был необходим в случае, если компьютер должен загружаться с диска, подключённого к данному контроллеру);
- «окна» для отображения туда Expanded-памяти.
- Последний сегмент первого мегабайта предназначался для размещения ПЗУ со стартовым BIOS. В частности, адрес FFFF:0000 — тот, на который передаётся управление при старте компьютера (то есть после аппаратной инициализации процессор начинает выполнение программы с этого адреса).
- Первый сегмент за пределами первого мегабайта — HiMem, о котором говорилось выше.
В реальном режиме отсутствует защита памяти и разграничение прав доступа, поэтому он уже практически вышел из употребления. Однако, реальный режим является режимом по умолчанию для всех моделей процессоров семейства x86 — процессор начинает свою работу именно в реальном режиме, в котором выполняется BIOS, MBR, BR и начальная часть OS-Loader. Поэтому все операционные системы, работающие на процессорах x86, имеют в своём составе некоторое количество стартового кода для этого режима процессора.
Более совершенный режим, впервые появившийся в процессоре 80286 и в дальнейшем многократно улучшавшийся. Имеет большое количество подрежимов, по которым можно проследить эволюцию семейства ЦП. В этом режиме поддерживается защита памяти, контексты задач и средства для организации виртуальной памяти. Аналогично реальному режиму, тут также используется сегментированная модель памяти, однако уже организованная по другому принципу: деление на параграфы отсутствует, а расположение сегментов описывается специальными структурами (таблицами дескрипторов), расположенными в оперативной памяти. Помимо базового адреса сегмента дескрипторы содержат размер сегмента (точнее, максимально доступное смещение) и различные атрибуты сегментов, использующиеся для защиты памяти и определения прав доступа к сегменту для различных программных модулей. Существует два типа дескрипторных таблиц: глобальная и локальная. Глобальная таблица описывает сегменты операционной системы и разделяемых структур данных. Локальная таблица может быть определена для каждой конкретной задачи (процесса). Сегменты памяти также выбираются все теми же сегментными регистрами; однако вместо номера параграфа сегментный регистр содержит специальную структуру (селектор), содержащую индекс дескриптора в таблице. Сам же дескриптор загружается из памяти во внутренний программно недоступный регистр (кэш), привязанный к каждому сегментному регистру и автоматически загружаемый в момент его модификации.
Каждый программный модуль, выполняемый в защищённом режиме, определяется его сегментом кода, описываемым регистром CS, который и определяет его привилегии по доступу к данным и другим модулям. Существует 4 уровня привилегий (0, 1, 2 и 3), называемых кольцами защиты. Кольцо 0 наиболее привилегированное. Оно предназначено для модулей ядра операционной системы. Кольцо 3 — наименее привилегированное, и предназначено для пользовательских программ. Кольца 1 и 2 используются лишь некоторыми операционными системами. Сегменты данных также имеют атрибуты прав доступа, дающие доступ только коду, имеющему такие же или более высокие привилегии. Система колец позволяет гибко распределять доступ к коду и данным.
Процессор 80386, появившийся в 1985 году, в отличие от своих предшественников стал 32-битным. В нём появилась возможность адресовать до 4 гигабайт памяти, что позволило создавать сегменты памяти размером во всё адресное пространство. Поэтому новые операционные системы использовали вырожденную модель организации памяти, когда все сегменты начинаются с нулевого адреса. Такая модель получила название плоской (flat memory model), и адрес задаётся одним целым 32-разрядным числом (хотя по сути он является смещением внутри вырожденного сегмента), а сами сегменты используются исключительно для организации защиты по кольцам привилегий.
Является подрежимом защищенного, но использует адресную модель, аналогичную реальному режиму. Применяется для запуска старых программ 8086 в среде современных операционных систем. В отличие от реального режима, где все программы имеют доступ ко всей памяти (кольцо 0), в режиме V86 программа выполняется в кольце 3 (наименее привилегированном), а особые ситуации и прерывания обрабатываются обычными процедурами защищенного режима.
Сегментное MMU современных процессоров, несмотря на кардинальные различия двух его основных режимов, в обоих работает схожим образом. Это позволяет организовывать нестандартные режимы не описанные в официальной документации, но иногда очень полезные при написании программ. Поскольку известно, что внутренние кэши дескрипторов используются во всех режимах, и именно они используются для адресации памяти, при понимании логики их работы возможна загрузка в них нестандартных значений для текущего режима. В частности, можно создать дескрипторную таблицу в реальном режиме, установить флаг PE, загрузить сегментные регистры уже в защищенном режиме, а потом тут же сбросить флаг PE. До следующей перезагрузки сегментного регистра его кэш дескриптора будет содержать значение, соответствующее защищенному режиму, и если он был загружен должным образом, появится возможность адресации до 4 GiB памяти. Подобные нестандартные режимы получили общее название Unreal mode и активно используются AMI BIOS персональных компьютеров. В процессоре 80286 также была возможность загрузки нестандартных значений дескрипторного кэша при помощи недокументированной команды LOADALL; что было особенно актуально, поскольку процессор 80286 не позволял сбрасывать флаг PE (из защищённого режима выходили с помощью сброса процессора, что сказывалось на производительности).
Страничная организация памяти
В процессорах, начиная с 80386, появилось мощное MMU, позволяющее организовать отображение страниц памяти, что было ещё одним поводом перехода на плоскую модель с приходом 32-разрядных вычислений. Используя трансляцию страниц, операционная система может создать собственное линейное адресное пространство для каждого процесса; также каждая страница имеет атрибуты прав доступа. В отличие от сегментов, таких уровней существует только 2: пользователь и супервизор. Но для большинства современных операционных систем этого вполне достаточно. Страничное MMU доступно только в защищенном режиме.
Расширения
PAE
В более поздних 32-разрядных процессорах (начиная с Pentium Pro) появилось PAE (Physical Address Extension) — расширение адресов физической памяти до 36 бит (возможность адресации 64 Гбайт ОЗУ). Это изменение не затронуло разрядности задач — они остались 32-битными.
MMX
Дополнительный «мультимедийный» (англ. Multi-Media eXtensions) набор инструкций, выполняющих по несколько характерных для процессов кодирования/декодирования потоковых аудио/видеоданных действий за одну машинную инструкцию. Впервые появился в процессорах Pentium MMX. Обеспечивает только целочисленные вычисления.
SSE
SSE (англ. Streaming SIMD Extensions — потоковое SIMD-расширение) — SIMD (англ. Single Instruction, Multiple Data — «одна инструкция — множество данных») набор инструкций, разработанный Intel и впервые представленный в процессорах серии Pentium III. Поддерживает вычисления с плавающей точкой. SSE состоит из восьми 128-битных регистров (с xmm0 до xmm7). Каждый регистр определяет 4 последовательных значения с плавающей точкой одинарной точности. SSE включает в себя инструкции, которые производят операции со скалярными и упакованными типами данных.
SSE2
Улучшенное расширение SSE. Появилось в процессорах Pentium 4. Производит потоковые вычисления с вещественными числами двойной точности (2 числа по 64 бита в одном регистре SSE). Кроме того, добавлены инструкции, аналогичные расширению MMX, работающие с регистрами SSE (16 байт, 8 слов, 4 двойных слова или 2 учетверённых слова в одном регистре). SSE2 включает в себя ряд команд управления кэшем, предназначенных для минимизации загрязнения кэша при обработке неопределенных потоков информации.
SSE3
Продолжение SSE и SSE2, появилось в процессорах Prescott. Набор SSE3 содержит 13 инструкций: FISTTP (x87), MOVSLDUP (SSE), MOVSHDUP (SSE), MOVDDUP (SSE2), LDDQU (SSE/SSE2), ADDSUBPD (SSE), ADDSUBPD (SSE2), HADDPS (SSE), HSUBPS (SSE), HADDPD (SSE2), HSUBPD (SSE2), MONITOR (нет аналога в SSE3 для AMD), MWAIT (нет аналога в SSE3 для AMD). Наиболее заметное изменение — возможность горизонтальной работы с регистрами. Если говорить более конкретно, добавлены команды сложения и вычитания нескольких значений, хранящихся в одном регистре. Эти команды упростили ряд DSP и 3D-операций. Существует также новая команда для преобразования значений с плавающей точкой в целые без необходимости вносить изменения в глобальном режиме округления.
SSSE3
Дополнение к SSE3 для работы с упакованными целыми. Новыми в SSSE3, по сравнению с SSE3, являются 16 уникальных команд, работающих с упакованными целыми. Каждая из них может работать как с 64-битными (MMX), так и с 128-битными (XMM) регистрами, поэтому Intel в своих материалах ссылается на 32 новые команды.
Категории новых инструкций: работа со знаком, сдвиги, перемешивание байт, умножения, горизонтальные сложения и вычитания целых.
SSE4
Новый набор команд Intel, впервые реализованный в процессорах серии Penryn.
SSE4 состоит из 54 инструкций, 47 из них относят к SSE4.1 (они есть только в процессорах Penryn). Полный набор команд (SSE4.1 и SSE4.2, то есть 47 + оставшиеся 7 команд) доступен в процессорах Nehalem. Ни одна из SSE4 инструкций не работает с 64-битными mmx регистрами, только со 128-битными xmm0-15. 32-битных процессоров с SSE4 не было выпущено.
Добавлены инструкции, ускоряющие компенсацию движения в видеокодеках, быстрое чтение из USWC памяти, множество инструкций для упрощения векторизации программ компиляторами. Кроме того, в SSE4.2 добавлены инструкции обработки строк 8/16 битных символов, вычисления CRC32, popcnt. Впервые в SSE4 регистр xmm0 стал использоваться как неявный аргумент для некоторых инструкций.
Новые инструкции SSE4.1 включают ускорение видео, работу с векторными примитивами, вставки/извлечения, скалярное умножение векторов, смешивания, проверки бит, округления, чтение WC-памяти.
Новые инструкции SSE4.2 включают обработку строк, подсчёт CRC32, подсчёт популяции единичных бит, работу с векторными примитивами.
SSE5
Новое расширение x86 инструкций от AMD, названное SSE5. Было анонсировано в 2007 году, но так и не было реализовано как изначально предполагалось. Позднее было заменено XOP, FMA, F16C.
AVX
Следующий набор расширений от Intel. Поддерживается обработка чисел с плавающей запятой упакованных в 256-битные «слова». Для них вводится поддержка тех же команд, что и в семействе SSE. 128-битные регистры SSE XMM0 — XMM15 расширяются до 256-битных YMM0-YMM15
Intel Post 32 nm processor extensions — новый набор инструкций Intel, позволяющий конвертировать числа с половинной точностью в числа с одинарной и двойной, аппаратно получать истинно случайные числа и обращаться к регистрам FS/GS.
AVX2
Дальнейшее развитие AVX. Целочисленные команды SSE начинают работать с 256-битными AVX регистрами.
AES
Расширение системы команд AES — реализация в микропроцессоре шифрования AES.
3DNow!
Набор инструкций для потоковой обработки вещественных чисел одинарной точности. Поддерживается процессорами AMD начиная с K6-2, заканчивая семейством Bulldozer . Процессорами Intel не поддерживается.
Инструкции 3DNow! используют регистры MMX в качестве операндов (в один регистр помещается два числа одинарной точности), поэтому, в отличие от SSE, при переключении задач не требуется отдельно сохранять контекст 3DNow!.
64-битный режим
К началу 2000-х годов стало очевидно, что 32-битное адресное пространство архитектуры x86 ограничивает производительность приложений, работающих с большими объёмами данных. 32-разрядное адресное пространство позволяет процессору осуществлять непосредственную адресацию лишь 4 ГБ данных. Этого может оказаться недостаточным для некоторых приложений, связанных, например, с обработкой видео или обслуживанием баз данных.
Для решения этой проблемы Intel разработала новую архитектуру IA-64 — основу семейства процессоров Itanium. Для обеспечения обратной совместимости со старыми приложениями, использующими 32-разрядный код, в IA-64 был предусмотрен режим эмуляции. Однако на практике данный режим работы оказался чрезвычайно медленным.
Компания AMD предложила альтернативное решение проблемы увеличения разрядности процессора. Вместо того, чтобы изобретать совершенно новую систему команд, было предложено ввести 64-разрядное расширение к уже существующей 32-разрядной архитектуре x86. Первоначально новая архитектура называлась x86-64, позже она была переименована в AMD64. Первоначально новый набор инструкций поддерживался процессорами семейств Opteron, Athlon 64 и Turion 64 компании AMD. Успех процессоров, использующих технологию AMD64, наряду с вялым интересом к архитектуре IA-64, побудили Intel приобрести лицензию на набор инструкций AMD64. При этом был добавлен ряд специфических инструкций, не присутствовавших в изначальном наборе AMD64. Новая версия архитектуры получила название EM64T.
В литературе и названиях версий своих программных продуктов компании Microsoft и Sun используют объединённое именование AMD64/EM64T, когда речь заходит о 64-разрядных версиях их операционных систем Windows и Solaris соответственно. В то же время, поставщики программ для операционных систем семейства Linux, BSD используют метки «x86-64» или «amd64», а в Mac OS X используется метка «x86_64», если необходимо подчеркнуть, что данное ПО использует 64-разрядные инструкции.
Виртуализация
|
|