x86

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 13:30, 12 января 2019.

Open book.svg Авторство
В.И. Ромашов
Согласовано: 24.04.2016
x86
Дизайнер Intel, AMD
Биты 16-bit, 32-bit and 64-bit
Представлен 1978 (16-bit), 1985 (32-bit), 2003 (64-bit)
Дизайн CISC
Тип Register-memory
Кодирование Variable (1 to 15 bytes)
Разветвление Status register
Порядок байтов Little
Размер страницы 8086i286: None
i386, i486: 4 KB pages
P5 Pentium: added 4 MB pages
(Legacy PAE: 4 KB→2 MB)
x86-64: added 1 GB pages
Расширения x87, IA-32, MMX, SSE, SSE2, x86-64, SSE3, SSSE3, SSE4, SSE5, AVX
Открыто Partly. For some advanced features, x86 may require license from Intel; x86-64 may require an additional license from AMD. The 80486 processor has been on the market for more than 20 years[1] and so cannot be subject to patent claims. The pre-586 subset of the x86 architecture is therefore fully open.
Регистры
Общее назначение
  • 16-bit: six semi-dedicated registers, BP and SP are not general-purpose
  • 32-bit: eight GPRs, including EBP and ESP
  • 64-bit: 16 GPRs, including RBP and RSP
FPU (Floating Point Unit)
  • 16-bit: optional separate x87 FPU
  • 32-bit: optional separate or integrated x87 FPU, integrated SSE2 units in later processors
  • 64-bit: integrated x87 and SSE2 units

x86 (англ. Intel 80x86) — архитектура процессора c одноимённым набором команд, впервые реализованная в процессорах компании Intel. Название образовано от двух цифр, которыми заканчивались названия процессоров Intel ранних моделей — 8086, 80186, 80286 (i286), 80386 (i386), 80486 (i486). За время своего существования набор команд постоянно расширялся, сохраняя совместимость с предыдущими поколениями. Помимо Intel архитектура также была реализована в процессорах других производителей: AMD, VIA, Transmeta, IDT и др.

История

X86.png

x86 — это CISC-архитектура. Доступ к памяти происходит по «словам». «Слова» размещаются по принципу little-endian, известному также как Intel-формат. Современные процессоры включают в себя декодеры команд x86 для преобразования их в упрощённый внутренний формат с последующим их выполнением.

Архитектура x86 в 1978 году с первым 16-разрядным процессором Intel, 8086, представила старые 8-разрядные процессоры 8080 и 8085 предназначенные для замены. Хотя 8086 не был изначально очень успешен, была поставлена IBM в 1981 году на первый компьютер. Из-за огромного успеха IBM PC и его многочисленных клонов, называемых IBM совместимыми персональными компьютерами, архитектура x86 была в течение нескольких лет одной из самых успешных архитектур процессоров в мире, и осталась таковой и в наши дни.

Процессоры

Процессоры Intel

Поколение Первый процессор Преемник Год запуска
1. Intel 8086 1978
1a. Обновление первого поколения, Intel 80186 1982
2. Intel 80286 1982
3. Intel 80386 1985
4. Intel 80486 1989
5. Pentium Nx586, Cyrix 5x86, WinChip, mP6, AMD K5 1993
6. Pentium Pro Pentium II, Celeron (PII), Xeon (PII), Pentium III, Pentium M, Intel Core) Cyrix 6x86, AMD K6, K6-2, K6-III, VIA C3, Transmeta Crusoe 1995
7. Athlon (K7) Pentium 4 , C7, Efficeon 1999
8. Opteron (K8) Athlon 64) Xeon (Core) Core 2 2003
9. Intel Core i-Serie 2008
Рис. 2. Intel 8086 в корпусе DIP 40.

8086

16-разрядный процессор Intel 8086, был создан в июне 1978 года. Сначала работал на частотах 4,77 МГц, затем на 8 и 10 МГц. Изготавливался по технологии 3 мкм и имел 29 000 транзисторов. (см. Рис 2)

Рис. 3. Intel 8088.

8088

Чуть позже, в 1979 году, был разработан Intel 8088, который работал на тех же частотах, что и Intel 8086, но использовал 8-разрядную шину данных (внутренняя шина процессора осталась 16-разрядной) для обеспечения большей совместимости с имевшейся в то время в ходу периферией. Благодаря более низкой цене, широко использовался в ранних системах IBM PC вместо 8086. (см. Рис 3)

80386 (i386)

Первый 32-разрядный процессор, работал на частотах 16-40 МГц. Появился в 1985 году. Знаменовал собой революцию в мире процессоров x86. Основные принципы, заложенные в этом чипе, без кардинальных изменений дожили и до наших дней (за всё это время изменения касались, в основном, повышения производительности, расширения набора команд, увеличения разрядности). Первые 386 процессоры содержали серьёзную ошибку, приводящую к невозможности функционирования в защищенном режиме. Исправленная версия называлась 386DX.

Также выпускались более дешевые процессоры i386SX с урезанной до 16 бит внешней шиной данных и 24-битной шиной адреса. Для встроенного применения выпускался и выпускается процессор i386EX. Он имеет на кристалле последовательные порты, программируемые таймеры (совместимые с Intel 8254), контроллеры приоритетных прерываний (совместимые с Intel 8259A) и контроллеры прямого доступа к памяти (совместимые с Intel 8237A). i386 — первый процессор, который мог использовать кэш-память (расположенную на внешнем чипе).

Рис. 4. Intel 80486 (i486) DX2.

80486 (i486)

Процессор i486 (1989 год) является усовершенствованным 386 процессором и первым скалярным процессором Intel (ряд операций выполнялись за один такт). Имел встроенный FPU (Floating Point Unit — блок вычислений с плавающей запятой) и впервые — встроенную кэш-память (8 Кбайт). 80486 — первый процессор Intel, для которого была применена технология умножения частоты шины FSB (в моделях DX2-50, DX2-66, DX4-75 и DX4-100). (см. Рис. 4) Для ноутбуков и встраиваемых систем в начале 1990-х была выпущена «облегченная» модификация i486SX без встроенного блока FPU. Существовала также модификация для встроенных применений — i486GX. Она представляла собой низковольтный 486SX с шиной данных, урезанной до 16-ти бит. Корпусировка i486GX — TQFP-176, частоты — от 16 МГц при Vcore = 2,0 В до 33 МГц при 2,7 В.

Pentium (i586)

Pentium (1993 год. Intel отказалась от номерных названий типа 8086, 80286 и др., потому что не могла запатентовать числа) — первый суперскалярный и суперконвейерный процессор Intel. Суперскалярность — означает, что процессор позволяет выполнять более одной операции за один такт. Суперконвейерность означает, что процессор имеет несколько вычислительных конвейеров. У Pentium их два, что позволяет ему при одинаковых частотах в идеале быть вдвое производительней 486, выполняя сразу 2 инструкции за такт. Кроме того, особенностью процессора Pentium являлся полностью переработанный и очень мощный на то время блок FPU, производительность которого оставалась недостижимой для конкурентов вплоть до конца 1990-х годов.

Pentium II (i686)

Pentium II (май 1997 года) — модификация ядра Pentium Pro с целью сделать его более доступным. Интегрированный кэш и тег кэша были вынесены на отдельные микросхемы с пониженной в два раза частотой. Это упростило и удешевило процессор, хотя и сделало его более медленным, чем Pentium Pro. Первые процессоры Pentium II выпускались с кэш-памятью второго уровня емкостью 256 Кбайт, затем её объём был увеличен до 512 Кбайт. Новая конструкция процессора потребовала размещения элементов на печатной плате, что, в свою очередь, привело к изменению конструктива процессора. Данные ЦПУ выпускались в виде картриджей SECC, устанавливающихся в специальный разъём на плате (Slot 1). Кроме того, в ядро Pentium II был добавлен блок MMX.

Рис. 5. Intel Celeron.

Celeron

Celeron — упрощённая модификация процессоров Pentium II / III / IV / Core / Core 2 для построения недорогих компьютеров. Первый Celeron (ядро Covington, частоты 266/300 МГц) представлял собой Pentium II, лишенный кеша второго уровня и пластикового картриджа. Печатная плата также была упрощена. Такая упаковка получила название SEPP (Single Edge Processor Package). В результате эти процессоры демонстрировали удручающе низкую производительность, хотя стоили очень недорого и легко прибавляли до 50 % частоты при разгоне. Все последующие варианты этого процессора имели интегрированный полночастотный кеш второго уровня. Основные отличия процессоров Celeron в объёме этого кэша и частоте шины, а также часто в увеличенной латентности доступа к кэш-памяти по отношению к оригинальному процессору (см. Рис 5).

Вторая модификация Celeron (ядро Mendocino, частоты 300…533 МГц) на многих задачах демонстрировала более высокую производительность, чем равночастотный Pentium II. Это объяснялось тем, что маленький (128 Кбайт) кеш Mendocino располагался на одном кристалле с ядром и работал на частоте ядра, в то время как большой (512 Кбайт) кеш Pentium II находился достаточно далеко от ядра и работал на половинной частоте. Больше таких промашек фирма Intel не допускала, и все последующие Celeron гарантированно медленнее полноценных процессоров того же поколения.

Pentium III (i686)

Pentium III, изготовленный изначально по технологическому процессу 0,18 мкм, отличается от P2 главным образом добавлением инструкций SSE. Поздние процессоры этой серии изготавливались по технологическому процессу 0,13 мкм, получили интегрированную в кристалл ядра полночастотную кэш-память (сначала 256 Кбайт, затем — 512 Кбайт) и послужили прообразом процессоров архитектуры Pentium M. Выпускались в конструктивах как SECC/SECC2 (Slot 1), так и FCPGA-370 (PGA-370).

Рис. 6. Intel Pentium 4.

Pentium 4

Pentium 4 — принципиально новый процессор с гиперконвейеризацией (hyperpipelining) — с конвейером, состоящим из 20 ступеней. Согласно заявлениям Intel, процессоры, основанные на данной технологии, позволяют добиться увеличения частоты примерно на 40 % относительно семейства P6 при одинаковом технологическом процессе (при «правильной» загрузке процессора). На практике же, первое поколение процессоров работало даже медленнее, чем Pentium III. Позже были дополнены поддержкой Hyper-threading и 64-битного кода (см. Рис. 6).

Рис. 7. Intel Core 2 Duo.

Core / Core 2

После провала последнего поколения процессоров Pentium 4 на ядре Tejas, было решено обратиться к другой ветви продукции. В основе новых процессоров лежит переработанное ядро Pentium M. Таким образом, ядро P6, использованное ещё в процессорах Pentium Pro, продолжило свою эволюцию, нарастив частоту со 150 МГц до 3,2 ГГц и обзаведясь новой системной шиной, поддержкой многоядерности, мультимедийных инструкций (см. Рис. 7). Процессоры Core — решение для ноутбуков, одно- и двухъядерное, исполняющее 32-битный код. Процессоры Core 2 — выпускаются как в настольном, так и мобильном исполнении, включают ряд микроархитектурных улучшений и способны исполнять 64-битный код. Количество ядер варьируется от одного до четырёх.

Core i7/Core i5/Core i3

Дальнейшее развитие идей, заложенных в процессорах Core 2. Сохранив основную конструкцию процессорных ядер, появившийся первым Core i7 получил модульную структуру, позволяющую легко варьировать их количество, встроенный контроллер памяти (трёхканальной DDR3 в высшем сегменте и двухканальной DDR3 в массовом) и новую шину, соединяющую процессор с чипсетом. Микроархитектурные улучшения позволяют Core i7 показывать повышенную производительность в сравнении с Core 2 на равных частотах. Большое внимание было уделено вопросу энергоэффективности нового процессора. Позже появились более дешевые Core i5/i7 с двухканальным контроллером памяти и четырьмя ядрами, затем — Core i3/i5 с двумя ядрами и встроенным видеоядром. В секторе наиболее производительных решений выпускаются также процессоры Core i7 с трехканальным контроллером памяти и шестью ядрами. Благодаря использованию технологии Hyper-threading эти процессоры способны одновременно исполнять до 12 потоков команд. Также в ассортименте компании Intel есть особо производительные процессоры для домашних ПК: Core i7 с трехканальным контроллером памяти и восемью ядрами. Количество потоков возросло до 16.

Xeon

Семейство процессоров, ориентированных на серверы и многопоточные вычисления. Первый представитель этого семейства базировался на архитектуре Pentium II, представлял собой картдридж с печатной платой, на которой монтировались ядро, кэш-память второго уровня и тег кэша. Монтировался в гнездо Slot 2. Современные Xeon базируются на архитектуре Core 2/Core i7.

Процессоры AMD

Рис. 8. Am386.

Am8086 / Am8088 / Am186 / Am286 / Am386 / Am486

Клоны соответствующих процессоров от Intel. Обычно выпускались с максимальной частотой на ступеньку выше, чем у оригинала. Так, Am386DX выпускался с максимальной частотой 40 МГц, тогда как i386DX — 33 МГц. Вплоть до 486DX2-66 других различий между процессорами не было. Программно отличить эти процессоры было невозможно. 5x86 Клон i486. В то время, как Intel для i486 остановился на частоте 100 МГц, AMD выпускала процессоры с частотами до 133 МГц. Также они отличались увеличенным объёмом кэша первого уровня (16 Кбайт) и множителем (×4). (см. Рис. 8)

K6

Принципиально новый процессор AMD (апрель 1997 года), основанный на ядре, приобретённом у NexGen. Данный процессор имел конструктив пятого поколения, однако относился к шестому поколению и позиционировался как конкурент Pentium II. Включал в себя блок MMX и несколько переработанный блок FPU. Однако данные блоки всё равно работали на 15-20 % медленнее, чем у аналогичных по частоте процессоров Intel. Процессор имел 64 Кбайт кэша первого уровня. В целом, сравнимая с Pentium II производительность, совместимость со старыми материнскими платами и более ранний старт (AMD представила К6 на месяц раньше, чем Intel представила P-II) и более низкая цена сделали его достаточно популярным, однако проблемы с производством у AMD значительно испортили репутацию данного процессора.

Athlon

Очень успешный процессор, благодаря которому фирма AMD сумела восстановить почти утраченные позиции на рынке микропроцессоров. Кэш первого уровня — 128 Кбайт. Первоначально процессор выпускался в картридже с размещением кэша второго уровня (512 Кбайт) на плате и устанавливался в разъём Slot A (который механически, но не электрически совместим со Slot 1 от Intel). Затем перешёл на разъём Socket A и имел 256 Кбайт кэша второго уровня в ядре. По быстродействию — примерный аналог Pentium III. Duron Урезанная версия Athlon, отличается от родителя объёмом кэша второго уровня (всего 64 Кбайт, зато интегрированным в кристалл и работавшем на частоте ядра). Конкурент Celeron поколений Pentium III / Pentium 4. Производительность заметно выше, чем у аналогичных Celeron, и при выполнении многих задач соответствует Pentium III.

Athlon 64

Первый несерверный процессор, поддерживающий архитектуру x86-64.

Рис. 9. Amd Athlon 64 X2.

Athlon 64 X2

Продолжение архитектуры Athlon 64, имеет 2 вычислительных ядра. (см. Рис. 9)

Phenom

Дальнейшее развитие архитектуры Athlon 64, выпускается в вариантах с двумя (Athlon 64 X2 Kuma), тремя (Phenom X3 Toliman) и четырьмя (Phenom X4 Agena) ядрами.

Phenom II

Модификация Phenom. Небольшие архитектурные изменения, переход на более тонкий технологический процесс и добавление кэша L3 объёмом от 4 до 6 Мбайт позволили нарастить производительность этих процессоров на 10-20 % по сравнению с предшественниками. Выпускаются в конструктивах Socket AM2+ и Socket AM3. При этом первые могут работать только с памятью DDR2, а вторые — как с DDR2, так и с DDR3. Максимальное число ядер выросло до шести.

Athlon II

Phenom II без кеша L3 и количеством ядер не более четырёх.

Рис. 10. МЦСТ R1000.

Процессоры, выпускавшиеся в СССР и России

КР1810ВМ86

КР1834ВМ86/ЭКР1834ВМ86 — аналог 8086. К1810ВМ88 — аналог 8088. КФ1847ВМ286 (позднее ЭКФ1847ВМ2) — аналог 80286. Опытные образцы выпускались заводом имени Дзержинского (разработчик НТЦ «Белмикросистемы») НПО «Интеграл».

Процессоры МЦСТ

Компанией ЗАО МЦСТ выпущена серия микропроцессоров «Эльбрус», позволяющих работать в режиме двоичной совместимости с архитектурой x86. Совместимость обеспечивается за счёт программной динамической трансляции x86-кодов с использованием аппаратной поддержки, заложенной в архитектуру микропроцессора «Эльбрус». (см. Рис. 10)

Сведения общего характера

Понятие архитектуры

Архитектура как совместимость с кодом

Наверняка вы часто встречались с термином «x86», или «Intel-совместимый процессор» (или «IBM PC compatible» — но это уже по отношению к компьютеру). Иногда также встречается термин «Pentium-совместимый» (почему именно Pentium — вы поймете сами чуть позже). Что за всеми этими названиями скрывается на самом деле? На данный момент наиболее корректно с точки зрения автора выглядит следующая простая формулировка: современный x86-процессор — это процессор, способный корректно исполнять машинный код архитектуры IA32 (архитектура 32-битных процессоров Intel). В первом приближении это код, исполняемый процессором i80386 (известным в народе как «386-й»), окончательно же основной набор команд IA32 сформировался с выходом процессора Intel Pentium Pro. Что означает «основной набор» и какие есть еще? Для начала ответим на первую часть вопроса. «Основной» в данном случае означает то, что с помощью исключительно этого набора команд, может быть написана любая программа, которая вообще может быть написана для процессора архитектуры x86 (или IA32, если вам так больше нравится).

Кроме того, у архитектуры IA32 существуют «официальные» расширения (дополнительные наборы команд) от разработчика самой архитектуры, компании Intel: MMX, SSE, SSE2 и SSE3. Также существуют «неофициальные» (не от Intel) расширенные наборы команд: EMMX, 3DNow! и Extended 3DNow! — их разработала компания AMD. Впрочем, «официальность» и «неофициальность» в данном случае понятие относительное — де-факто все сводится к тому, что некоторые расширения набора команд Intel как разработчик изначального набора признает, а некоторые — нет, разработчики же программного обеспечения используют то, что им лучше всего подходит. В отношении расширенных наборов команд существует одно простое правило хорошего тона: прежде чем их использовать, программа должна проверить, поддерживает ли их процессор. Иногда отступления от этого правила встречаются (и могут приводить к неправильному функционированию программ), но объективно это является проблемой некорректно написанного программного обеспечения, а не процессора.

Для чего предназначены дополнительные наборы команд? В первую очередь — для увеличения быстродействия при выполнении некоторых операций. Одна команда из дополнительного набора, как правило, выполняет действие, для которого понадобилась бы небольшая программа, состоящая из команд основного набора. Опять-таки, как правило, одна команда выполняется процессором быстрее, чем заменяющая ее последовательность. Однако в 99% случаев, ничего такого, чего нельзя было бы сделать с помощью основных команд, с помощью команд из дополнительного набора сделать нельзя.

Таким образом, упомянутая выше проверка программой поддержки дополнительных наборов команд процессором, должна выполнять очень простую функцию: если, например, процессор поддерживает SSE — значит, считать будем быстро и с помощью команд из набора SSE. Если нет — будем считать медленнее, с помощью команд из основного набора. Корректно написанная программа обязана действовать именно так. Впрочем, сейчас практически никто не проверяет у процессора наличие поддержки MMX, так как все CPU, вышедшие за последние 5 лет, этот набор поддерживают гарантированно. Для справки приведем табличку, на которой обобщена информация о поддержке различных расширенных наборов команд различными десктопными (предназначенными для настольных ПК) процессорами.

Различия между ядрами одной микроархитектуры

«Процессорное ядро» (как правило, для краткости его называют просто «ядро») — это конкретное воплощение [микро]архитектуры (т.е. «архитектуры в аппаратном смысле этого слова»), являющееся стандартом для целой серии процессоров. Например, NetBurst — это микроархитектура, которая лежит в основе многих сегодняшних процессоров Intel: Celeron, Pentium 4, Xeon. Микроархитектура задает общие принципы: длинный конвейер, использование определенной разновидности кэша кода первого уровня (Trace cache), прочие «глобальные» особенности. Ядро — более конкретное воплощение. Например, процессоры микроархитектуры NetBurst с шиной 400 МГц, кэшем второго уровня 256 килобайт, и без поддержки Hyper-Threading — это более-менее полное описание ядра Willamette. А вот ядро Northwood имеет кэш второго уровня уже 512 килобайт, хотя также основано на NetBurst. Ядро AMD Thunderbird основано на микроархитектуре K7, но не поддерживает набор команд SSE, а вот ядро Palomino — уже поддерживает. Таким образом, можно сказать что «ядро» – это конкретное воплощение определенной микроархитектуры «в кремнии», обладающее (в отличие от самой микроархитектуры) определенным набором строго обусловленных характеристик. Микроархитектура — аморфна, она описывает общие принципы построения процессора. Ядро — конкретно, это микроархитектура, «обросшая» всевозможными параметрами и характеристиками. Чрезвычайно редки случаи, когда процессоры сменяли микроархитектуру, сохраняя название. И, наоборот, практически любое наименование процессора хотя бы несколько раз за время своего существования «меняло» ядро. Например, общее название серии процессоров AMD — «Athlon XP» — это одна микроархитектура (K7), но целых четыре ядра (Palomino, Thoroughbred, Barton, Thorton). Разные ядра, построенные на одной микроархитектуре, могут иметь, в том числе разное быстродействие.

Частота работы ядра

Как правило, именно этот параметр в просторечии именуют «частотой процессора». Хотя в общем случае определение «частота работы ядра» всё же более корректно, так как совершенно не обязательно все составляющие CPU функционируют на той же частоте, что и ядро (наиболее частым примером обратного являлись старые «слотовые» x86 CPU — Intel Pentium II и Pentium III для Slot 1, AMD Athlon для Slot A — у них L2-кэш функционировал на 1/2, и даже иногда на 1/3 частоты работы ядра). Ещё одним распространённым заблуждением является уверенность в том, что частота работы ядра однозначным образом определяет производительность. На самом деле это дважды не так: во-первых, каждое конкретное процессорное ядро (в зависимости от того, как оно спроектировано, сколько содержит исполняющих блоков различных типов, и т.д. и т.п.) может исполнять различное количество команд за один такт, частота же — это всего лишь количество таких тактов в секунду. Таким образом (приведенное далее сравнение, разумеется, очень сильно упрощено и поэтому весьма условно) процессор, ядро которого исполняет 3 инструкции за такт, может иметь на треть меньшую частоту, чем процессор, исполняющий 2 инструкции за такт — и при этом обладать полностью аналогичным быстродействием.

Во-вторых, даже в рамках одного и того же ядра, увеличение частоты вовсе не всегда приводит к пропорциональному увеличению быстродействия.. Дело в том, что скорость исполнения команд ядром процессора — это вовсе не единственный показатель, влияющий на скорость выполнения программы. Не менее важна скорость поступления команд и данных на CPU. Представим себе чисто теоретически такую систему: быстродействие процессора — 10'000 команд в секунду, скорость работы памяти — 1000 байт в секунду. Таким образом, следует понимать: невозможно непрерывно наращивать одну только частоту ядра, не ускоряя одновременно подсистему памяти, так как в этом случае начиная с определённого этапа, увеличение частоты CPU перестанет сказываться на увеличении быстродействия системы в целом.

Кодирование инструкций

Префиксы (каждый из них опционален):

  • Однобайтовый префикс смены режима адресации AddressSize (значение 67h (положим, что h - это обозначение шестнадцатиричной записи, здесь и далее)).
  • Однобайтовый префикс изменения сегмента Segment (значения 26h, 2Eh, 36h, 3Eh, 64h и 65h).
  • Однобайтовый префикс BranchHint для указания предпочтительной ветки перехода (значения 2Eh и 3Eh).
  • Двухбайтовый или трёхбайтовый сложноструктурированный префикс Vex (первый байт всегда имеет значение C4h для двухбайтового варианта или C5h для трёхбайтового).
  • Однобайтовый префикс Lock для запрета модификации памяти другими процессорами или ядрами (значение F0h).
  • Однобайтовый префикс OperandsSize для изменения размера операнда (значение 66h).
  • Однобайтовый префикс Mandatory для уточнения инструкции (значения F2h и F3h).
  • Однобайтовый префикс Repeat означает повторение (значения F2h и F3h).
  • Однобайтовый структурированный префикс Rex нужен для указания 64-битных или расширенных регистров (имеет значения 40h..4Fh).
  • Префикс Escape. Всегда состоит как минимум из одного байта 0Fh. За этим байтом опционально идёт байт 38h или 3Ah. Предназначен для уточнения инструкции.

Встроенные в инструкцию данные (опциональны):

  • Смещение или адрес в памяти (Displacement). Целое число со знаком размером 8, 16, 32 или 64 бита.
  • Первый или единственный непосредственный операнд (Immediate). Может быть размером 8, 16, 32 или 64 бита.
  • Второй непосредственный операнд (Immediate2). Если присутствует, то обычно имеет размер в 8 бит.

В списке выше и далее для технических имён принято наименование «только латиница, арабские цифры» и знак минуса «-» со знаком подчёкивания «_», а регистр — CamelCase (любое слово начинается с прописной, а далее только строчные даже если аббревиатура: «UTF-8» → «Utf8» — все слова вместе). Префиксы AddressSize, Segment, BranchHint, Lock, OperandsSize и Repeat могут перемешаны между собой. Остальные элементы должны идти именно в указанном порядке. И видно что байтовые значения некоторых префиксов совпадают. Их назначение и наличие определяет уже сама инструкция. Префиксы переопределения сегмента могут применяться с большинством инструкций, а префиксы BranchHint применяются только с инструкциями условного перехода. Аналогичная ситуация с префиксами Mandatory и Repeat — где-то они уточняют инструкцию, а где-то указывают на повторение. Префикс OperandSize вместе в префиксами Mandatory ещё относят к префиксам SIMD-инструкции. Отдельно следует сказать про префикс Vex. Он заменяет префиксы Rex, Mandatory, Escape и OperandsSize, компактизируя их в себе. С ним не допустимо использование префикса Lock. Сам же префикс Lock может добавляться когда приёмником является операнд в памяти.

Обзорный список всех интересующих режимов с точки зрения кодирования инструкций:

  • 16-битный («Real Mode», реальный режим с сегментной адресацией).
  • 32-битный («Protected Mode», защищённый режим с плоской моделью памяти).
  • 64-битный («Long Mode», как 32-битный защищённый с плоской моделью памяти, но адреса уже 64-битные).

В скобках английские названия режимов соответствуют официальным. Ещё есть синтетические режимы на вроде нереального (Unreal x86 Mode), но они все вытекают из этих трёх (по сути это гибриды, которые отличаются лишь размером адреса, операндов и прочим). В каждом из них используется «родной» режим адресации, но его можно сменить на альтернативный префиксом OperandsSize. В 16-битном режиме включится 32-битный режим адресации, в 32-битном режиме — 16-битный, а в 64-битном — 32-битный. Но если это делать, то адрес расширяется с дополнением нулями (если он меньше) или же его старшие биты сбрасываются (если он больше).

Дизайн

Архитектура x86 использует CISC набор команд с переменной длиной инструкции. Доступ к памяти по размеру слова также могут не выровнено по границе слова адреса памяти. Слова в Little Endian хранящегося направлении. Easy портативность Intel 8085 на ассемблере код был движущей силой развития архитектуры. Это вызвало некоторые неоптимальные и проблематичные в ретроспективе проектных решений.

Современные x86 процессоры гибридные процессоры CISC/RISC, так как они переводят инструкции x86 установить первый в RISC - инструкции -Mikro постоянной длины, могут быть применены к современным микроархитектуры оптимизаций. Передача изначально к так называемым резервировании, то есть для малых буферов, выше по потоку от различных вычислительных устройств. Первый гибридный процессор x86 был Pentium Pro.

64 бита

Примерно в 2002 году, расширение памяти современных x86 машин достиг вызвано 32-битного адресного ограничения размера адресации в инструкции x86 архитектуру набора 4 Гб. Хотя Intel имел Pentium Pro представила способ решения более 4 Гб оперативной памяти, но ее использование программно трудоемким и процесс в доступной памяти остался так до сих пор ограничен до 4 Гб.

Intel изначально хотел сделать скачок до 64 бит с новой архитектурой процессора под названием IA-64, однако, удалось установить их только в качестве продукта ниши в сегменте рынка серверов и рабочих станций. AMD, с другой стороны продлили 32-битную архитектуру процессора до 64 бит и назвал это расширение AMD64 . Позже Intel взяла на себя большую часть этого расширения под названием EM64T, а затем, наконец, под широко используется сегодня в продуктах Intel название Intel 64 .

Для 64-разрядных процессоров, которые основаны на архитектуре x86, термин x86-64 или вскоре x64 используется.

Виртуализация

Несмотря на то, виртуализации процессоров x86 усложняется из - за полной архитектуры, есть несколько продуктов, которые обеспечивают виртуальный процессор x86 доступны, в том числе VMware, Hyper-V и Virtual PC или с открытым исходным кодом программного обеспечения, таких как Xen или VirtualBox. Виртуализация аппаратная сторона также доступна в качестве расширения, он будет на Intel " Intel VT " (для технологии виртуализации), с AMD " AMD Virtualization".

Режимы работы

Реальный режим

В реальном режиме при вычислении линейного адреса, по которому процессор собирается читать содержимое памяти или писать в неё, сегментная часть адреса умножается на 16 (или, то же самое, что и сдвиг влево на 4 бита) и суммируется со смещением (если процессору передаётся не полный адрес из двух 16-битных значений — сегмента и смещения, — а только 16-битное смещение, то сегмент берётся из одного из сегментных регистров). Таким образом, адреса 0400h:0001h и 0000h:4001h ссылаются на один и тот же физический адрес, так как 400h×16+1 = 0×16+4001h.

Такой способ вычисления физического адреса позволяет адресовать 1 Мб + 64 Кб − 16 байт памяти (диапазон адресов 0000h…10FFEFh). Однако в процессорах 8086/8088 всего 20 адресных линий, поэтому реально доступен только 1 мегабайт (диапазон адресов 0000h…FFFFFh), а при адресации выше (в диапазоне 100000h…10FFEFh) происходит «заворот» — старший единичный бит адреса игнорируется и происходит обращение к 64 килобайтам в начальных адресах (0000h…FFEFh).

Процессор 80286 имеет 24-битную адресную шину (возможна адресация 224 = 16 Мб памяти), поэтому в них переполнения не происходит. Компьютеры IBM PC/AT построены на процессоре Intel 80286, но, из соображений совместимости с IBM PC и IBM PC/XT, построенных на Intel 808x, в них был введён логический элемент (вентиль), управляющий работой 21-го адресного провода (A20). Этот логический элемент, получивший название "Gate A20", по умолчанию отключен, что соответствует режиму совместимости, но управляется через контроллер клавиатуры (микросхема Intel 8042).

Рис. 11. Схема образования линейного адресного пространства

Линейная адресация памяти

Линейная адресация памяти — схема адресации памяти компьютера в защищённом режиме (начиная с Intel 80386 и других совместимых x86-процессорах). Используется большинством современных многозадачных ОС. (см. Рис. 11)

Благодаря механизму линейной адресации можно создавать любое (ограниченное только размерами оперативной памяти) количество независимых виртуальных адресных пространств. Причём каждая страница линейного адресного пространства может находиться по любому физическому адресу или даже быть выгруженной на диск.

При использовании линейной адресации 32-битный логический адрес делится на три части:

  • Номер записи в каталоге страниц (номер таблицы страниц) — биты 31-22 (10 бит). Одна запись из каталога страниц определяет отображение 4 МБайт адресного пространства.
  • Номер записи в таблице страниц (номер страницы в таблице страниц) — биты 21-12 (10 бит). Одна запись из таблицы страниц определяет отображение 4 КБайт адресного пространства.
  • Смещение в рамках страницы — биты 11-0 (12 бит).

Защищенный режим

В дополнение к реальному режиме Intel 80286 поддерживает защищенный режим, расширение адресацией физической памяти до 16 МБ и адресуемой виртуальной памяти до 1 Гб, а также предоставление защищенной памяти, которая предотвращает программы от разлагающего друг от друга. Это делается с помощью сегментных регистров только для хранения индекса в таблице дескрипторов, которая хранится в памяти. Есть две такие таблицы, тем Глобальная таблица дескрипторов (GDT) и таблица дескрипторов Local (LDT), каждая из которых содержит до 8192 дескрипторов сегментов, каждый сегмент дает доступ к 64 Кбайт памяти. В 80286, дескриптор сегмента обеспечивает 24-битную в базовый адрес , и этот базовый адрес добавляется к 16-битным смещением , чтобы создать абсолютный адрес. Базовый адрес из таблицы выполняет ту же роль , что буквальное значение регистра сегмента выполняет в режиме реального времени; сегментные регистры были преобразованы из прямых регистров косвенных регистров. Каждый сегмент может быть назначен один из четырех кольцевых уровней , используемых для аппаратной компьютерной безопасности . Каждый дескриптор сегмента содержит также предельное поле сегмента, который определяет максимальное смещение , которое может быть использовано с сегментом. Поскольку Смещения 16 бит, сегменты по - прежнему ограничены до 64 Кбайт каждый в 80286 защищенном режиме.

Суть защищённого режима в следующем: программист и разрабатываемые им программы используют логическое адресное пространство, размер которого может составлять 1 гигабайт. Логический адрес преобразуется в физический адрес автоматически с помощью схемы управления памятью (MMU). При этом содержимое сегментного регистра не связано напрямую с физическим адресом, а является номером сегмента в соответствующей таблице. Благодаря защищённому режиму, в памяти может храниться только та часть программы, которая необходима в данный момент, а остальная часть может храниться во внешней памяти (например, на жёстком диске). В случае обращения к той части программы, которой нет в памяти в данный момент, операционная система может приостановить программу, загрузить требуемую секцию кода из внешней памяти и возобновить выполнение программы. Следовательно, становятся допустимыми программы, размер которых больше объёма имеющейся памяти, и пользователю кажется, что он работает с большей памятью, чем на самом деле.

Физический адрес формируется следующим образом. В сегментных регистрах хранится селектор, содержащий индекс дескриптора в таблице дескрипторов (13 бит), 1 бит, определяющий к какой таблице дескрипторов будет производиться обращение (к локальной или к глобальной) и 2 бита запрашиваемого уровня привилегий. Далее происходит обращение к соответствующей таблице дескрипторов и соответствующему дескриптору, который содержит начальный 24-битный адрес сегмента, размер сегмента и права доступа, после чего вычисляется необходимый физический адрес путём сложения адреса сегмента со смещением из 16-разрядного регистра.

Режим виртуального 8086

Существует также суб-режим работы в защищенном режиме 32-бит (так называемый 80386 защищенный режим) называется виртуальный режим 8086 , также известный как режим V86. Это в основном специальный гибрид рабочий режим, позволяющий программам реального режима и операционные системы для запуска в то время как под контролем супервизора операционной системы защищенном режиме. Это позволяет большую гибкость в управлении как программы для защищенного режима и программ реального режима одновременно. Этот режим предназначен исключительно для 32-разрядной версии защищенного режима; она не существует в 16-битной версии защищенного режима, или в длительном режиме.

Примечания

  1. Pryce, Dave (May 11, 1989). "80486 32-bit CPU breaks new ground in chip density and operating performance. (Intel Corp.) (product announcement) EDN" (Press release). 

Источники

  1. Intel Architecture Software Developer’s Manual, Volume 1: Basic Architecture
  2. AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions
  3. http://www.x86-guide.com/
  4. http://www.intel.com/content/www/us/en/history/historic-timeline.html