8086 стал первым процессором x86 - Intel к тому времени уже выпустила модели 4004, 8008, 8080 и 8085. Этот 16-битный процессор мог работать с 1 Мбайт памяти по внешней 20-битной адресной шине. Тактовая частота, выбранная IBM (4,77 МГц) была довольно низкой, и к концу своей карьеры процессор работал на 10 МГц.

Первые ПК использовали производную процессора 8088, которая имела всего 8-битную внешнюю шину данных. Что интересно, системы управления в американских шаттлах используют процессоры 8086, и NASA пришлось в 2002 году покупать процессоры через eBay, поскольку Intel их больше не производила.

Intel 8086
Кодовое название Н/Д
Дата выпуска 1979
Архитектура 16 битов
Шина данных 16 битов
Шина адреса 20 битов
Макс. объём памяти 1 Мбайт
Кэш L1 Нет
Кэш L2 Нет
Тактовая частота 4,77-10 МГц
FSB Равная частота CPU
FPU 8087
SIMD Нет
Техпроцесс 3 000 нм
Число транзисторов 29 000
Энергопотребление Н/Д
Напряжение 5 В
Площадь кристалла 16 мм²
Сокет 40-контактный


Выпущенный в 1982 году, процессор 80286 был в 3,6 раза быстрее 8086 на той же тактовой частоте. Он мог работать с памятью объёмом до 16 Мбайт, но 286 всё ещё оставался 16-битным процессором. Он стал первым процессором x86, оснащённым диспетчером памяти (memory management unit, MMU), который позволял работать с виртуальной памятью. Подобно 8086, процессор не содержал блока работы с плавающей запятой (floating-point unit, FPU), но мог использовать чип-сопроцессор x87 (80287). Intel выпускала 80286 на максимальной тактовой частоте 12,5 МГц, хотя конкурентам удалось добиться 25 МГц.

Intel 80286
Кодовое название Н/Д
Дата выпуска 1982
Архитектура 16 битов
Шина данных 16 битов
Шина адреса 24 бита
Макс. объём памяти 16 Мбайт
Кэш L1 Нет
Кэш L2 Нет
Тактовая частота 6-12 МГц
FSB Равная частоте CPU
FPU 80287
SIMD Нет
Техпроцесс 1500 нм
Число транзисторов 134 000
Энергопотребление Н/Д
Напряжение 5 В
Площадь кристалла 49 мм²
Сокет 68-контактный

386: 32-битный и с кэш-памятью


Intel 80836 стал первым процессором x86 с 32-битной архитектурой. Вышло несколько версий этого процессора. Две наиболее известные: 386 SX (Single-word eXternal), который использовал 16-битную шину данных, и 386 DX (Double-word eXternal) с 32-битной шиной данных. Можно отметить ещё две версии: SL, первый процессор x86 с поддержкой кэша (внешнего) и 386EX, который использовался в космической программе (например, телескоп "Хаббл" использует этот процессор).

Intel 80386 DX
Кодовое название P3
Дата выпуска 1985
Архитектура 32 бита
Шина данных 32 бита
Шина адреса 32 бита
Макс. объём памяти 4096 Мбайт
Кэш L1 0 кбайт (иногда присутствует контроллер)
Кэш L2 Нет
Тактовая частота 16-33 МГц
FSB Равная частоте CPU
FPU 80387
SIMD Нет
Техпроцесс 1500-1000 нм
Число транзисторов 275 000
Энергопотребление 2 Вт @ 33 МГц
Напряжение 5 В
Площадь кристалла 42 мм² @ 1 мкм
Сокет 132 контакта

Процессор 486 для многих стал знаковым, поскольку с него началось знакомство с компьютером целого поколения. На самом деле, знаменитый 486 DX2/66 долгое время считался минимальной конфигурацией для геймеров. Этот процессор, выпущенный в 1989 году, обладал рядом новых интересных функций, подобно встроенному на кристалл сопроцессору FPU, кэшу данных и впервые представил множитель. Сопроцессор x87 был встроен в линейку 486 DX (не SX). В процессор был интегрирован кэш первого уровня объёмом 8 кбайт (сначала со сквозной записью/write-through, затем с обратной записью/write-back с чуть более высокой производительностью). Существовала возможность добавления кэша L2 на материнскую плату (работал на частоте шины).

Второе поколение 486 процессоров обзавелось множителем CPU, поскольку процессор работал быстрее, чем FSB, появились версии DX2 (множитель 2x) и DX4 (множитель 3x). Ещё один анекдот: "487SX", продаваемый как FPU для 486SX, представлял собой, по сути, полноценный процессор 486DX, который отключал и заменял оригинальный CPU.

Intel 80486 DX
Кодовое название P4, P24, P24C
Дата выпуска 1989
Архитектура 32 бита
Шина данных 32 бита
Шина адреса 32 бита
Макс. объём памяти 4096 Мбайт
Кэш L1 8 кбайт
Кэш L2 На материнской плате (на частоте FSB)
Тактовая частота 16-100 МГц
FSB 16-50 МГц
FPU На кристалле
SIMD Нет
Техпроцесс 1000-800 нм
Число транзисторов 1 185 000
Энергопотребление Н/Д
Напряжение 5 В - 3,3 В
Площадь кристалла 81 - 67 мм²
Сокет 168 контактов

У DX4 было 16 кбайт кэша и больше транзисторов - 1,6 млн. Этот процессор, изготавливаемый по 600-нм техпроцессу с площадью кристалла 76 мм², потреблял меньше энергии, чем оригинальный 486 (при напряжении 3,3 В).


Pentium, представленный в 1993 году, был интересен по многим причинам. Он стал первым процессором x86, с которым было решено отказаться от традиционных модельных номеров в пользу звучного названия, поскольку Intel не могла создать торговую марку только на одних числах. Кроме того, процессор прославился своей ошибкой. На Pentium первого поколения некоторые операции деления приводили к выдаче неверного результата. Intel заменила процессор, но ущерб компании был нанесён немалый. Ошибка, которая проявляла себя очень редко, вызвала настоящую шумиху в ИТ-прессе.

Pentium продавался в трёх разных линейках, первая была без множителя CPU, вторая - с множителем (включая знаменитый Pentium 166), а последняя обзавелась набором инструкций SIMD для x86 под названием MMX. У Pentium MMX был увеличен размер кэша L1, а также сделаны другие мелкие улучшения. Процессор Pentium стал первым x86 от Intel, способным выполнять две инструкции параллельно. У этих процессоров кэш L2 располагался на материнской плате (он работал на частоте FSB).

Intel Pentium (MMX)
Кодовое название P5, P54
Дата выпуска 1993 1997
Архитектура 32 бита 32 бита
Шина данных 64 бита 64 бита
Шина адреса 32 бита 32 бита
Макс. объём памяти 4096 Мбайт 4096 Мбайт
Кэш L1 8 + 8 кбайт 16 + 16 кбайт
Кэш L2 Материнская плата (на частоте FSB)
Тактовая частота 60-200 МГц 133-300 МГц
FSB 50-66 МГц 60-66 МГц
FPU На кристалле На кристалле
SIMD Нет MMX
Техпроцесс 800-600-350 нм 350 нм
Число транзисторов 3,1-3,3 млн. 4,5 млн.
Энергопотребление 8-16 Вт 4-17 Вт
Напряжение 5 - 3,3 В 2,8 В
Площадь кристалла 294-163-90 мм² 141 мм²
Сокет Socket 4, 5 or 7 Socket 7

Позвольте дать небольшое пояснение по поводу ошибки Pentium: некоторые вычисления на FPU приводили к ошибочному результату. Ошибка появлялась редко - хотя разные источники дают разные оценки по поводу того, насколько редко - и Intel заменила дефектные процессоры бесплатно. Ниже приведён пример ошибки Pentium.

4195835,0/3145727,0 = 1,333 820 449 136 241 002 (правильный результат)

4195835,0/3145727,0 = 1,333 739 068 902 037 589 (неправильный результат на дефектном Pentium)


Pentium Pro, выпущенный в 1995 году, стал первым процессором x86, способным работать с объёмом памяти более 4 Гбайт благодаря расширению Physical Address Extension (PAE), то есть переходу на 36-битное адресное пространство, позволявшее адресовать 64 Гбайт ОЗУ. Что интересно, этот процессор оказался первым с архитектурой P6 (в принципе, в какой-то мере архитектура Core 2 наследована от неё) и также стал первым CPU x86, который содержал кэш L2 на процессоре, а не на материнской плате. По сути, кэш-память от 256 кбайт до 1 Мбайт располагалась рядом с CPU, в той же упаковке, но не на одном кристалле, и работала на той же частоте, что и CPU.

У процессора были некоторые проблемы с производительностью. Он прекрасно работал с 32-битными приложениями, но оказался намного медленнее с программным обеспечением, которое было написано в 16-битном коде (как некоторые части Windows 95). Причина была простая: доступ к 16-битным регистрам вызывал проблемы с управлением 32-битными регистрами, что отменяло преимущества внеочередной архитектуры Pentium Pro

Intel Pentium Pro
Кодовое название P6
Дата выпуска 1995
Архитектура 32 бита
Шина данных 64 бита
Шина адреса 36 битов
Макс. объём памяти 64 Гбайт
Кэш L1 8 + 8 кбайт
Кэш L2 Внешний, 256-1024 кбайт (на частоте CPU)
Тактовая частота 150-200 МГц
FSB 60-66 МГц
FPU Встроенный
SIMD Н/Д
Техпроцесс 600-350 нм
Число транзисторов 5 500 000 + кэш
Энергопотребление 29-47 Вт
Напряжение 3,3 В
Площадь кристалла 306-196 мм² + кэш
Сокет Socket 8

Площадь кристалла с кэшем составляла 202 мм² (256 кбайт на 500 нм), 242 мм 2 (512 кбайт на 350 нм) или 484 мм 2 (1 Мбайт на 350 нм). Число транзисторов в кэше составляло 15,5 млн. (256 кбайт), 31 млн. (512 кбайт) или 62 млн. (1 Мбайт).


Выпущенный в 1997, процессор Pentium II являлся адаптацией Pentium Pro для массового рынка. Он был очень похож на Pentium Pro, но кэш-память различалась. Вместо использования кэша на той же частоте, что и процессор (это было дорого), 512 кбайт кэша L2 работали на половинной частоте. Кроме того, Pentium II оставил классический сокет в пользу картриджа, содержащего процессор и кэш второго уровня, который теперь размещался в картридже, а не на материнской плате или упаковке процессора.

Среди новых функций по сравнению с Pentium Pro можно отметить поддержку MMX (SIMD) и удвоенный размер кэша L1. Первый Pentium III (Katmai) был очень похож на Pentium II. Выпущенный в 1999 году, он добавил поддержку инструкций SSE (SIMD), но в остальном остался идентичен.

Intel Pentium II and III
Кодовое название Klamath (Pentium II 0,35 мкм), Deschutes (Pentium II 0,25 мкм), Katmai (Pentium III)
Дата выпуска 1997, 1998, 1999
Архитектура 32 бита
Шина данных 64 бита
Шина адреса 36 битов (32 бита на P III)
Макс. объём памяти 64 Гбайт (4 Гбайт на P III)
Кэш L1 16 + 16 кбайт
Кэш L2 Внешний, 512 кбайт (1/2 частоты CPU)
Тактовая частота 233-300 МГц (Klamath), 300-450 МГц (Deschutes), 450-600 МГц (Klamath)
FSB 66-100-133 МГц
FPU Встроенный
SIMD MMX (SSE)
Техпроцесс 350 нм (Klamath), 250 нм (Deschutes, Katmai)
Число транзисторов 7 500 000 + кэш (Pentium II), 9 500 000 + кэш (Pentium III)
Энергопотребление 25-35 Вт
Напряжение 2,8 В (0,35 мкм), 2 В (0,25 мкм)
Площадь кристалла 204 мм² (0,35 мкм), 131 мм 2 (0,25 мкм), 128 мм 2 (PIII) + кэш
Сокет Slot 1

Pentium II и III оснащались 512 кбайт кэша L2 (31 млн. транзисторов). Но одна разновидность процессора Pentium II оснащалась кэшем L2 объёмом 256 кбайт на кристалле - Pentium II Mobile Dixon. Он использовал 180-нм техпроцесс и был существенно быстрее, чем настольные версии.


В конце 90-х годов Intel выпустила две широко известных марки процессоров: Celeron и Xeon. Первый был нацелен на "бюджетный" рынок, а последней - на серверы и рабочие станции. Первый Celeron (Covington) представлял собой Pentium II без кэша второго уровня и давал слишком низкую производительность, а Pentium II Xeon, напротив, оснащался кэшем большого объёма. Обе марки до сих пор существуют: Celeron для рынка начального уровня (как правило, со сниженным размером кэша и менее скоростной FSB) и Xeon для серверов (с быстрой FSB, иногда с большим кэшем и более высокими тактовыми частотами).

Intel быстро добавила к Celeron 128 кбайт кэша второго уровня в модели Mendocino. Celeron 300A славился своими прекрасными возможностями разгона, позволяя достигать прирост частоты 50% или больше по сравнению со штатной частотой - весьма немало в то время.

Intel Celeron и Intel Xeon
Кодовое название Covington, Mendocino Drake
Дата выпуска 1998 1998
Архитектура 32 бита 32 бита
Шина данных 64 бита 64 бита
Шина адреса 32 бита 36 битов
Макс. объём памяти 4 Гбайт 64 Гбайт
Кэш L1 16 + 16 кбайт 16 + 16 кбайт
Кэш L2 0 кбайт/128 кбайт (встроенный, на частоте CPU) Внешний, 512 - 2408 кбайт (на частоте CPU)
Тактовая частота 266-300 МГц/300-533 МГц 400-450 МГц
FSB 66 МГц 100 МГц
FPU Встроенный Встроенный
SIMD MMX MMX
Техпроцесс 250 нм 250 нм
Число транзисторов 7 500 000/19 000 000 7 500 000 + кэш
Энергопотребление 16-28 Вт 30-46 Вт
Напряжение 2 В 2 В
Площадь кристалла 131 мм²/154 мм 2 131 мм² + кэш
Сокет Slot1/Socket 370 PPGA Slot 2

Подобно Pentium II, процессор Xeon обладал внешним кэшем L2 внутри картриджа процессора. Его ёмкость составляла от 512 кбайт до 2 Мбайт, а число транзисторов - от 31 до 124 млн.

Pentium III достигает 1 ГГц



Нажмите на картинку для увеличения.

Pentium III Coppermine стал первым серийным процессором x86, который смог достичь частоты 1 ГГц; была выпущена даже версия на 1,13 ГГц, но она быстро покинула рынок из-за проблем со стабильностью. Новая версия Pentium III отличалась улучшенным кэшем второго уровня - теперь он "поселился" на кристалл. Он был быстрее, чем 512 кбайт внешнего кэша на первой модели, и в то время рекламировался как функция, увеличивающая скорость работы в Интернете. Процессор был выпущен ещё в трёх версиях: серверной (Xeon), начального уровня (Celeron) и мобильной (с первым вариантом технологии SpeedStep).

Intel Pentium III
Кодовое название Coppermine
Дата выпуска 1999
Архитектура 32 бита
Шина данных 64 бита
Шина адреса 32 бита
Макс. объём памяти 4 Гбайт
Кэш L1 16 + 16 кбайт
Кэш L2 Встроенный, 256 кбайт (на частоте CPU)
Тактовая частота 500-1133 МГц
FSB 100-133 МГЦ
FPU Встроенный
SIMD MMX (SSE)
Техпроцесс 180 нм
Число транзисторов 28,1 млн.
Энергопотребление 25-35 Вт
Напряжение 1,6 В, 1,8 В
Площадь кристалла 106 мм²
Сокет Slot 1-Socket 370 FCPGA

В 2002 году появилась чуть более улучшенная версия Tualatin с большим кэшем L2 (512 кбайт) и 130-нм техпроцессом. Она позиционировалась на серверы (PIII-S) и мобильные устройства, и в компьютерах потребительского уровня встречалась нечасто.

Pentium 4: много шума, мало толку


Нажмите на картинку для увеличения.

В ноябре 2000 года Intel анонсировала новый процессор Pentium 4. Он обладал более высокой тактовой частотой (1400 МГц, как минимум), однако существенно уступал конкурирующим CPU, если сравнивать производительность на такт. AMD Athlon (и даже Pentium III) оказывались на равных частотах быстрее. Что ещё усложняло ситуацию, Intel попыталась перейти на память Rambus RDRAM (единственный стандарт памяти в то время, который удовлетворял требованиям FSB CPU), но успеха не добилась. Очень дорогой и горячий, Pentium 4 всё равно смог, после многих модификаций и доработок, выйти на конкурентоспособный уровень через несколько лет (в немалой степени благодаря добавлению кэша L3 и таких технологий, как Hyper-Threading).

Intel Pentium 4 32-bit
Кодовое название Willamette Northwood Prescott
Дата выпуска 2000 2001 2004
Архитектура 32 бита 32 бита 32 бита
Шина данных 64 бита 64 бита 64 бита
Шина адреса 32 бита 32 бита 32 бита
Макс. объём памяти 4 Гбайт 4 Гбайт 4 Гбайт
Кэш L1 8 кбайт + 12 Kµops 8 кбайт + 12 Kµops 16 кбайт + 12 Kµops
Кэш L2 256 кбайт 512 кбайт 1024 кбайт
Тактовая частота 1,3-2 ГГц 1,8-3,4 ГГц 2,4-3,8 ГГц
FSB 400 МГц QDR 400, 533, 800 МГц QDR 533, 800 МГц QDR
SIMD MMX, SSE, SSE2 MMX, SSE, SSE2 MMX, SSE, SSE2, SSE3
SMT/SMP Нет Hyper-Threading (некоторые версии) Hyper-Threading
Техпроцесс 180 нм 130 нм 90 нм
Число транзисторов 42 млн. 55 млн. 125 млн.
Энергопотребление 66-100 Вт 54-137 Вт 94-151 Вт
Напряжение 1,7 В 1,55 В 1,25-1,5 В
Площадь кристалла 217 мм² 146 мм² 112 мм²
Сокет Socket 423/Socket 478 Socket 478 Socket 478/LGA775

У Pentium 4 вышли мобильные версии (с изменяемым множителем), версии Celeron (с меньшим кэшем L2) и версии Xeon (с кэшем L3). Hyper-Threading и кэш L3 стали двумя технологиями, которые сначала появились на серверах, а затем были адаптированы для обычных процессоров (хотя кэш L3 был доступен только в дорогой линейке EE).

Нам следует также упомянуть и частоту FSB, эффективная частота которой в четыре раза превосходит номинальную (физическую) благодаря использованию технологии Quad Data Rate (QDR): 400-МГц шина на самом деле работает на частоте 100 МГц, 533-МГц - на 133 МГц и т.д. Наконец, в 2005 году появились 64-битные версии Pentium 4, но мы поговорим о них позже.

Pentium M: ноутбуки стали мощнее


Нажмите на картинку для увеличения.

В 2003 году рынок ноутбуков стал расти огромными темпами, но Intel могла предложить только два процессора: стареющий Pentium III Tualatin и Pentium 4, чьё энергопотребление делало его малопригодным для мобильной сферы. Но спасение пришло от израильской команды разработчиков: Banias (или Pentium M). Этот процессор, основанный на архитектуре P6 (та же самая, что и в Pentium Pro), обеспечивал высокую производительность при низком энергопотреблении. Он даже обгонял Pentium 4, потребляя при этом меньше энергии. Этот процессор был использован в 2003 году для платформы Centrino, и за ним в 2004 году последовала ещё более быстрая модель Dothan. Pentium M прекрасно зарекомендовал себя с мобильном мире, и процессор Stealey (A100) по-прежнему использует архитектуру Dothan (с меньшими частотами и TDP).

Intel Pentium M
Кодовое название Banias Dothan
Дата выпуска 2003 2004
Архитектура 32 бита 32 бита
Шина данных 64 бита 64 бита
Шина адреса 32 бита 32 бита
Макс. объём памяти 4 Гбайт 4 Гбайт
Кэш L1 32 + 32 кбайт 32 + 32 кбайт
Кэш L2 1024 кбайт 2048 кбайт
Тактовая частота 0,9-1,7 ГГц 1-2,13 ГГц
FSB 400 МГц QDR 400, 533 МГц QDR
SIMD MMX, SSE, SSE2 MMX, SSE, SSE2
SMT/SMP Нет Нет
Техпроцесс 130 нм 90 нм
Число транзисторов 77 млн. 140 млн.
Энергопотребление 9-30 Вт 6-35 Вт
Напряжение 0,9-1,5 В 0,9-1,4 В
Площадь кристалла 82 мм² 87 мм²
Сокет Socket 479 Socket 479

Как и в случае Pentium 4, шина FSB работает с эффективной частотой, в четыре раза превышающей физическую (QDR). Сокет процессора Socket 479 использует 478 ножек, но они были расположены по-другому, чтобы отличаться от Pentium 4 Socket 478 (хотя существуют переходники).

Pentium 4 получает 64 бита и ещё одно ядро



Нажмите на картинку для увеличения.

В 2005 году Intel дважды улучшила Pentium 4. Сначала появился Prescott-2M, а затем Smithfield. Первый стал 64-битным процессором на основе дизайна Prescott, а последний - первым процессором с двумя ядрами. По сути они очень похожи и обладают схожими проблемами с другими CPU Pentium 4: низким числом исполняемых инструкций за такт (IPC) и сложностью повышения тактовых частот из-за высокого тепловыделения. Два этих процессора, призванных как-то компенсировать нелёгкое положение компании на рынке в ожидании Core 2 Duo, хвалили редко. И хотя процессор Pentium D (коммерческое название для Smithfield) действительно обладал двумя ядрами, они представляли собой два кристалла Prescott в одной упаковке.

Intel Pentium 4
Кодовое название Prescott-2M Smithfield
Дата выпуска 2005 2005
Архитектура 64 бита 64 бита
Шина данных 64 бита 64 бита
Шина адреса 64 (действительно 36) бита 64 (действительно 36) бита
Макс. объём памяти 64 Гбайт 64 Гбайт
Кэш L1 16 кбайт + 12 Kµops 2 x 16 кбайт + 12 Kµops
Кэш L2 2048 кбайт 2 x 1024 кбайт
Тактовая частота 3-3,6 ГГц 2,8-3,2 ГГц
FSB 800 МГц QDR 800 МГц QDR
SIMD MMX, SSE, SSE2, SSE3 MMX, SSE, SSE2, SSE3
SMT/SMP Hyper-Threading Два ядра (Hyper-Threading на некоторых моделях)
Техпроцесс 90 нм 90 нм
Число транзисторов 169 млн. 230 млн.
TDP 84-115 Вт 95-130 Вт
Напряжение 1,2 В 1,2 В
Площадь кристалла 135 мм² 206 мм²
Сокет LGA775 LGA775

Интересно отметить, что хотя процессоры Pentium 4, предназначенные для массового рынка, не поддерживали технологию PAE (которая обеспечивает 36-битную работу с памятью против 32-битной) и были ограничены 4 Гбайт ОЗУ, эти модели могли превышать этот порог. На практике шина адреса всё равно была ограничена 36 битами (40 битами у Xeon), но технология PAE (управления 4-Гбайт страницами) осталась в прошлом - 64-битные программы могут использовать всю доступную память.

Hyper-Threading, технология виртуальной многопроцессорности Intel (SMT), тоже была доступна на некоторых моделях (Xeon и Extreme Edition). Наконец, позднее появилась 65-нм линейка (модельный ряд 9x0) Pentium 4, но она не содержала каких-либо важных улучшений.

Первый мобильный двуядерный процессор



Нажмите на картинку для увеличения.

В 2006 году Intel объявила процессор Core Duo. Этот первый двуядерный процессор для ноутбуков обеспечивал великолепную производительность - намного лучшую, чем у Pentium 4. Он также оказался первым "настоящим" двуядерным процессором x86. Кэш, например, был общий (в то время как Pentium D был больше похож на сборку двух кристаллов в одной упаковке). Процессор стал частью новой платформы Centrino Duo и оказался весьма успешен. Единственный недостаток - он оставался 32-битным процессором, подобно Pentium 4.

Intel Core Duo
Кодовое название Yonah
Дата выпуска 2006
Архитектура 32 бита
Шина данных 64 бита
Шина адреса 32 бита
Макс. объём памяти 4 Гбайт
Кэш L1 32 + 32 кбайт
Кэш L2 2048 кбайт общий
Тактовая частота 1,06-2,33 ГГц
FSB 667 МГц
SIMD MMX, SSE, SSE2, SSE3
SMT/SMP Два ядра
Техпроцесс 65 нм
Число транзисторов 151 млн.
TDP 9-31 Вт
Напряжение 0,9-1,3 В
Площадь кристалла 91 мм²
Сокет Socket 479

Была доступна и версия Core Solo с одним ядром, а также и варианты со сниженным энергопотреблением, которые использовали 533-МГц шину QDR (133 МГц) против 667-МГц. Этот процессор стал использоваться и в серверах (кодовое название Sossaman), что было впервые для процессора, разрабатывавшегося для мобильной сферы. Обратите внимание, что процессор на самом деле не использует архитектуру Core, которая была введена вместе с Core 2 Duo, и он был быстро заменён в ноутбуках вариантом Core 2 Duo (Merom). Кроме того, Socket 479 у Yonah отличается от гнезда Socket 479 других процессоров Pentium M.

Современный лидер: Core 2 Duo


Нажмите на картинку для увеличения.

В 2006 году Intel представила процессор, который быстро стал хитом продаж: Core 2 Duo. При его разработке был в немалой степени почерпнут опыт Pentium M, но процессор использует новую архитектуру Core. До него Intel выпускала две линейки процессоров: Pentium 4 для настольных ПК, Pentium M для ноутбуков и обе линейки для серверов. Но теперь, напротив, у Intel есть единая микроархитектура для всех линеек. 64-битный Core 2 Duo представлен на всех сегментах, от нижнего до верхнего, для настольных ПК, ноутбуков и серверов.

Существует много версий архитектуры, что привело к конфигурациям с разным числом ядер (от одного до четырёх, то есть от Solo до Quad), кэш-памяти (от 512 кбайт до 12 Мбайт) и частотой FSB (от 400 до 1600 МГц QDR). На иллюстрации показана оригинальна модель Core 2 Duo, но существуют и более скоростные версии (45 нм).

Intel Core 2 Duo
Кодовое название Conroe
Дата выпуска 2006
Архитектура 64 бита
Шина данных 64 бита
Шина адреса 64 (действительно 36) бита
Макс. объём памяти 64 Гбайт
Кэш L1 32 + 32 кбайт
Кэш L2 2048 кбайт общий
Тактовая частота 1,8-3 ГГц
FSB 800-1066-1333 МГц
SIMD MMX, SSE, SSE2, SSE3, SSSE3
SMT/SMP Два ядра
Техпроцесс 65 нм
Число транзисторов 291 млн.
TDP 65 Вт
Напряжение 1,5 В
Площадь кристалла 143 мм²
Сокет LGA 775

Мобильные версии (Merom), по сути, идентичные (но не такие быстрые, с менее скоростной FSB), а варианты Extreme Edition более скоростные. Core 2 Duo существует и в четырёхъядерном варианте, где используются два двуядерных кристалла Conroe в одной упаковке. У 45-нм версии Core 2 Duo (Penryn) объём кэша больше, а тепла выделяется меньше, но основа осталась такой же, как у первой модели.

Будущее: Nehalem, Atom и т.д.



Нажмите на картинку для увеличения.

Как вы могли догадаться, это только первая статья в серии. За ней последует вторая статья, посвящённая процессорам AMD (включая часть по поводу видеокарт AMD ATI). Но история процессоров Intel x86 не заканчивается на Core 2 Duo, в будущем нас ждут новые модели. Nehalem и Atom тоже являются процессорами x86. И что-то нам подсказывает, что грядущий выход Intel на графический рынок под названием Larrabee тоже построен на нескольких ядрах x86.

x86 или x64: Что это значит?

Наверняка многих эти обозначения заводят в тупик, и сегодня из него мы и будем выбираться.

На самом деле x86, x64 – всего лишь обозначения разрядности операционной системы, измеряемой в битах (32 и 64 бита соответственно). Есть, к слову, и 16 бит – но встретить процессоры, понимающие только эту разрядность уже довольно сложно. Для этого надо вернуться лет на 10 назад. В любом случае “познакомить” их с x86 или x64 системами не получится.

Для чего это всё ?

Всё это позволяет определить разрядность чисел с которыми процессор вашего ПК будет иметь дело. И по этой причине под x86 или x64 системы имеются свои версии программ, драйверов и тому подобного.

Более высокая разрядность (x64) позволяет, помимо прочих моментов, позволяет заметно повысить точность вычислений. Но такой нужды у рядового пользователя нет и единственный момент, ради которого ему стоит использовать 64-разрядную систему – если оперативной памяти в компьютере свыше 4-х гигабайт.

Дело в том, что 32-разрядные системы не “видят” более 4-х гигабайт оперативки.

Так что в итоге: x86 или x64 ?

Если у вас имеется 4 Gb оперативной памяти или меньше – 32-х битной (x86) системы вам будет достаточно. В ином случае используйте x64.

Когда-то я очень путался, увидев в описании программ x86 или x64 и не мог понять, почему если для 64-битной указывают x64, то для 32-битной x86, а не x32. Последнее должно быть намного привычнее и логичнее, а x86 не то что бы не запомнить, логике эта цифра не поддаётся: математически 86 больше чем 64, а на деле оказывается меньше в два раза. Из чисел "x86 x64 x32" таким образом можно даже загадку сделать. А ведь на самом деле...

x86 равна x32, а также равна и x64

При всей этой путанице на деле оказывается всё просто и как всегда ошибка идет за теми авторами, кто пишет вместе связку x86 и x64. Это попросту неправильно, несмотря на то, что так пишут практически все.

Дело в том, что x86 - это архитектура микропроцессора и аппаратная платформа, которая применима к тридцати двух битным и к шестидесяти четырех битным программам. Название x86 получено от наименования первого процессора intel i8086 и ряда последующих, в которых в конце всегда приписывалась 86. Через какое-то время цифровые обозначения новых процессоров стали заменяться именами, так публика узнала о Pentium и Celeron, но платформа x86 не изменилась до наших дней.

Значения два, а обозначения три? x86, x32 и x64 - как правильно писать?

И если x86 это архитектура процессора, то x32 и x64 это его разрядность – адресное пространство, а также количество информации, которую процессор в силах обработать за один такт.

Когда же пишут о совместимости программ указывая разрядность x86, подразумевая 32-битную платформу, это неправильно и только вводит в заблуждение. Правильно указывать х86_32bit или х86_64bit. Либо сокращенно интуитивно понятные x32 или x64.

Так что можно подытожить: сейчас x86 указывают по старинке (даже Майкрософт этим грешит), когда эта платформа была в единственном числе и 64-битных еще никто не знал. При появлении платформы x64 её стали указывать как есть, а прежняя 32-битная так и осталась в большинстве случаев как x86. И сейчас это не актуально, ошибочно и сбивает с толку тех, кто не понимает суть. А вы её теперь понимаете. :)

x32 или x64? Что выбрать? Что лучше?

Очень часто возникает вопрос, выбрать операционную систему x32 или x64? То есть тридцати двух битную или шестидесяти четырех битную?
Это вопрос риторический, теоретический и спорный. Очевидно, что x64 лучше, но не всегда и не в случае, если вы пользуетесь Windows. Нет, любая Windows x64 работает чуть шустрее чем Windows x32, но только если есть все программы и все драйвера под 64-битную систему. Очень часто, если компьютер современный, все системные драйвера к комплектующим у него обычно есть. Но проблема кроется тогда в программах и особенно видео и аудио кодеках. Обязательно чего-то да не будет. И если тридцати двух битные программы могут работать в системе x64, то драйвера и кодеки к ней обязательно нужны тоже x64. Год от года эта проблема исчезает, но до сих пор она не развеяна полностью. С системами x32 таких проблем нет и для дома лучше выбирать именно такую.
p.s. до 2010 года действительно существовала дилемма выбора 32-битной или 64-битной операционной системы. Причины описаны абзацем выше. Прошло с тех пор пять лет и такой проблемы уже не наблюдается. Безусловно, лучше поставить 64-битную даже не задумываясь, если, конечно же, не существует каких-то особых важных причин в пользу 32-битности.

В наше время существует две самые популярные архитектуры процессоров. Это x86, которая была разработана еще 80х годах и используется в персональных компьютерах и ARM - более современная, которая позволяет сделать процессоры меньше и экономнее. Она используется в большинстве мобильных устройств или планшетов.

Обе архитектуры имеют свои плюсы и минусы, а также сферы применения, но есть и общие черты. Многие специалисты говорят, что за ARM будущее, но у нее остаются некоторые недостатки, которых нет в x86. В нашей сегодняшней статье мы рассмотрим чем архитектура arm отличается от x86. Рассмотрим принципиальные отличия ARM или x86, а также попытаемся определить что лучше.

Процессор - это основной компонент любого вычислительного устройства, будь то смартфон или компьютер. От его производительности зависит то, насколько быстро будет работать устройство и сколько оно сможет работать от батареи. Если говорить просто, то архитектура процессора - это набор инструкций, которые могут использоваться при составлении программ и реализованы на аппаратном уровне с помощью определенных сочетаний транзисторов процессора. Именно они позволяют программам взаимодействовать с аппаратным обеспечением и определяют каким образом будут передаваться данные в память и считываться оттуда.

На данный момент существуют два типа архитектур: CISC (Complex Instruction Set Computing) и RISC (Reduced Instruction Set Computing). Первая предполагает, что в процессоре будут реализованы инструкции на все случаи жизни, вторая, RISC - ставит перед разработчиками задачу создания процессора с набором минимально необходимых для работы команд. Инструкции RISC имеют меньший размер и более просты.

Архитектура x86

Архитектура процессора x86 была разработана в 1978 году и впервые появилась в процессорах компании Intel и относится к типу CISC. Ее название взято от модели первого процессора с этой архитектурой - Intel 8086. Со временем, за неимением лучшей альтернативы эту архитектуру начали поддерживать и другие производители процессоров, например, AMD. Сейчас она является стандартом для настольных компьютеров, ноутбуков, нетбуков, серверов и других подобных устройств. Но также иногда процессоры x86 применяются в планшетах, это довольно привычная практика.

Первый процессор Intel 8086 имел разрядность 16 бит, далее в 2000 годах вышел процессор 32 битной архитектуры, и еще позже появилась архитектура 64 бит. Мы подробно рассматривали в отдельной статье. За это время архитектура очень сильно развилась были добавлены новые наборы инструкций и расширения, которые позволяют очень сильно увеличить производительность работы процессора.

В x86 есть несколько существенных недостатков. Во-первых - это сложность команд, их запутанность, которая возникла из-за длинной истории развития. Во-вторых, такие процессоры потребляют слишком много энергии и из-за этого выделяют много теплоты. Инженеры x86 изначально пошли по пути получения максимальной производительности, а скорость требует ресурсов. Перед тем, как рассмотреть отличия arm x86, поговорим об архитектуре ARM.

Архитектура ARM

Эта архитектура была представлена чуть позже за x86 - в 1985 году. Она была разработана известной в Британии компанией Acorn, тогда эта архитектура называлась Arcon Risk Machine и принадлежала к типу RISC, но затем была выпущена ее улучшенная версия Advanted RISC Machine, которая сейчас и известна как ARM.

При разработке этой архитектуры инженеры ставили перед собой цель устранить все недостатки x86 и создать совершенно новую и максимально эффективную архитектуру. ARM чипы получили минимальное энергопотребление и низкую цену, но имели низкую производительность работы по сравнению с x86, поэтому изначально они не завоевали большой популярности на персональных компьютерах.

В отличие от x86, разработчики изначально пытались получить минимальные затраты на ресурсы, они имеют меньше инструкций процессора, меньше транзисторов, но и соответственно меньше всяких дополнительных возможностей. Но за последние годы производительность процессоров ARM улучшалась. Учитывая это, и низкое энергопотребление они начали очень широко применяться в мобильных устройствах, таких как планшеты и смартфоны.

Отличия ARM и x86

А теперь, когда мы рассмотрели историю развития этих архитектур и их принципиальные отличия, давайте сделаем подробное сравнение ARM и x86, по различным их характеристикам, чтобы определить что лучше и более точно понять в чем их разница.

Производство

Производство x86 vs arm отличается. Процессоры x86 производят только две компании Intel и AMD. Изначально эта была одна компания, но это совсем другая история. Право на выпуск таких процессоров есть только у этих компаний, а это значит, что и направлением развития инфраструктуры будут управлять только они.

ARM работает совсем по-другому. Компания, разрабатывающая ARM, не выпускает ничего. Они просто выдают разрешение на разработку процессоров этой архитектуры, а уже производители могут делать все, что им нужно, например, выпускать специфические чипы с нужными им модулями.

Количество инструкций

Это главные различия архитектуры arm и x86. Процессоры x86 развивались стремительно, как более мощные и производительные. Разработчики добавили большое количество инструкций процессора, причем здесь есть не просто базовый набор, а достаточно много команд, без которых можно было бы обойтись. Изначально это делалось чтобы уменьшить объем памяти занимаемый программами на диске. Также было разработано много вариантов защит и виртуализаций, оптимизаций и многое другое. Все это требует дополнительных транзисторов и энергии.

ARM более прост. Здесь намного меньше инструкций процессора, только те, которые нужны операционной системе и реально используются. Если сравнивать x86, то там используется только 30% от всех возможных инструкций. Их проще выучить, если вы решили писать программы вручную, а также для их реализации нужно меньше транзисторов.

Потребление энергии

Из предыдущего пункта выплывает еще один вывод. Чем больше транзисторов на плате, тем больше ее площадь и потребление энергии, правильно и обратное.

Процессоры x86 потребляют намного больше энергии, чем ARM. Но на потребление энергии также влияет размер самого транзистора. Например, процессор Intel i7 потребляет 47 Ватт, а любой процессор ARM для смартфонов - не более 3 Ватт. Раньше выпускались платы с размером одного элемента 80 нм, затем Intel добилась уменьшения до 22 нм, а в этом году ученые получили возможность создать плату с размером элемента 1 нанометр. Это очень сильно уменьшит энергопотребление без потерь производительности.

За последние годы потребление энергии процессорами x86 очень сильно уменьшилось, например, новые процессоры Intel Haswell могут работать дольше от батареи. Сейчас разница arm vs x86 постепенно стирается.

Тепловыделение

Количество транзисторов влияет еще на один параметр - это выделение тепла. Современные устройства не могут преобразовывать всю энергию в эффективное действие, часть ее рассеивается в виде тепла. КПД плат одинаковый, а значит чем меньше транзисторов и чем меньше их размер - тем меньше тепла будет выделять процессор. Тут уже не возникает вопрос ARM или x86 будет выделять меньше теплоты.

Производительность процессоров

ARM изначально не были заточены для максимальной производительности, это область преуспевания x86. Отчасти этому причина меньше количество транзисторов. Но в последнее время производительность ARM процессоров растет, и они уже могут полноценно использоваться в ноутбуках или на серверах.

Выводы

В этой статье мы рассмотрели чем отличается ARM от x86. Отличия довольно серьезные. Но в последнее время грань между обоими архитектурами стирается. ARM процессоры становятся более производительными и быстрыми, а x86 благодаря уменьшению размера структурного элемента платы начинают потреблять меньше энергии и выделять меньше тепла. Уже можно встретить ARM процессор на серверах и в ноутбуках, а x86 на планшетах и в смартфонах.

А как вы относитесь к этим x86 и ARM? За какой технологией будущее по вашему мнению? Напишите в комментариях! Кстати, .

На завершение видео о развитии арихтектуры ARM:

x86-64 - 64-битное расширение для архитектуры x86, разработанное компанией AMD, позволяющее выполнять программы в 64-разрядном режиме.

История

Оригинальная спецификация разработана компанией AMD в 2000 г. Первым процессором, реализовавшим архитектуру, стал AMD K8 (выпущен в 2003 г.).

В те годы (конец девяностых и начало двухтысячных) компании HP и Intel разрабатывали свою 64-битную архитектуру IA-64 (Intel Itanium). Но она была кардинально другой, основана на принципе VLIW (very long instruction word), и была несовместима с 32-битной архитектурой x86. Из-за того, что огромная масса ранее написанного софта не работала на IA-64, этой архитектуре не удалось завоевать популярность. Хотя в конце 2001 года для IA-64 была выпущена специальная версия Windows XP 64-bit for IA-64.

Архитектура x86 ведёт свою историю с 1978 г., начиналась как 16-битная, в 1985 г. стала 32-битной. Архитектура обладает большим количеством костылей для обратной совместимости. Ей предрекали смерть вместе с 32-разрядыми вычислениями. Однако появление x86-64 дало ей новую жизнь.

Именование

Существует несколько вариантов названий этой технологии, которые иногда приводят к путанице.

  • x86-64 - первоначальный вариант. Именно под этим названием фирмой AMD была опубликована первая предварительная спецификация.
  • x64 - официальное название версий операционных систем Windows, также используемое как название архитектуры фирмами Microsoft и Oracle.
  • AMD64 - после выпуска первых процессоров Clawhammer и Sledgehammer в названии архитектуры появилось название фирмы-разработчика AMD. Сейчас является официальным для реализации AMD.
  • EM64T - первое официальное название реализации Intel. Расшифровывалось как Extended Memory 64 Technology.
  • Intel 64 - текущее официальное название архитектуры Intel.

Иногда упоминание AMD вводит пользователей в заблуждение, вплоть до того, что они отказываются использовать дистрибутивы родных версий операционной системы, мотивируя это тем, что на их процессоре Intel версия для AMD не будет работать. На самом деле распространители ПО используют название amd64 лишь потому, что именно AMD была пионером в разработке этой технологии.

Часто пользователи путают архитектуру x86-64 с IA-64. Во избежание подобных ошибок следует помнить, что Intel 64 и IA-64 - это совершенно разные, несовместимые между собой микропроцессорные архитектуры. В 2017 году вы вряд ли встретите где-либо процессор архитектуры IA-64 (Itanium).

Распространённость

Суперкомпьютеры

В списке суперкомпьютеров TOP-500 архитектура x86-64 вытеснила ранее популярные RISC-архитектуры и 32-битные версии. Intel пыталась продвигать свой Itanium (макс. доля достигнута в 2004 г.), но безуспешно.

Дата-центры

Servers using x86 chips still maintain a more than 90 percent market share. http://www.common.org/servers/x86-servers-data-center/

Во всех дата-центрах корпорации Google сейчас используются процессоры Intel с известной всем архитектурой x86. Тем не менее, корпорация Google планирует использовать и альтернативные решения. https://habrahabr.ru/company/ibm/blog/282820/

В 2017 году алгоритмы обработки больших объёмов информации в подавляющем большинстве случаев выполняются именно на архитектуре x86-64, поэтому мы и рассматриваем её в магистратуре АиСОБОИ.

Регистры

Архитектура x86-64 имеет:

  • 16 целочисленных 64-битных регистров общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 - R15);
  • 8 80-битных регистров с плавающей точкой (ST0 - ST7);
  • 8 64-битных регистров MMX (MM0 - MM7, имеют общее пространство с регистрами ST0 - ST7);
  • 16 128-битных регистров SSE (XMM0 - XMM15);
  • 64-битный указатель RIP и 64-битный регистр флагов RFLAGS.

Операции над 64-битными регистрами (сложение, вычитание и пр.) работают столько же времени, сколько операции над 32-битными регистрами.

Может показаться удивительным, но операции над младшими 32-битными половинами регистров обнуляют старшие 32 бита. Например,

mov eax, ebx

автоматически занулит старшие биты в rax.

Так сделано для оптимизации. Это позволяет процессору разрывать цепочки зависимостей (не надо ждать, пока посчитаются старшие биты, для продолжения операций с младшими, потому что старшие почти наверняка никому не будут нужны).

Современный процессор устроен очень сложно. Модель процессора, описанная в руководстве по архитектуре, плохо описывает реальный механизм работы современного ядра. В частности, понятие регистров процессора не соответствует действительности, «в железе» нет такой вещи, как регистр eax или rax. Понятие регистров процессора виртуализируется. Эта технология называется переименованием регистров (register renaming). Декодер команд выделяет регистр из большого банка регистров. Когда инструкция завершается, значение этого динамически распределенного регистра записывается обратно в любой регистр, в котором в настоящее время хранится значение, скажем, rax. Чтобы сделать эту работу эффективно и одновременно выполнять несколько инструкций, очень важно, чтобы операции не имели взаимозависимости. Плохо, когда значение регистра зависит от других инструкций.

Инструкции

x86-64 относится к типу CISC (complex instruction set computing). Является чуть ли не единственной современной CISC-архитектурой. Другие популярные архитектуры строятся по принципу RISC (reduced instruction set computer).

При этом современные х86-процессоры, хотя и CISC-совместимы, но являются процессорами с RISC-ядром, и в формальном смысле считаются гибридными. В таких гибридных CISC-процессорах CISC-инструкции преобразовываются в набор внутренних RISC-команд, при этом одна команда x86 может порождать несколько RISC-команд, исполнение команд происходит на суперскалярном конвейере одновременно по несколько штук. Небольшие инструкции легко выполнять одновременно.

Инструкции кодируются последовательностью байт переменной длины, на практике от 1 до 15 байт.

Ликвидированные возможности

В x86-64 по сравнению с x86 удалили некоторые устаревшие инструкции. Это двоично-десятичная арифметика BCD и инструкции типа aam (ASCII adjust for multiplication). Большая часть устаревших инструкций, тем не менее, оставлена.

Режимы

Процессоры данной архитектуры поддерживают два режима работы: Long mode («длинный» режим) и Legacy mode («унаследованный», режим совместимости с 32-битным x86).

Long mode

«Длинный» режим - «родной» для процессоров x86-64. Этот режим даёт возможность воспользоваться всеми дополнительными преимуществами, предоставляемыми архитектурой. Для использования этого режима необходима 64-битная операционная система.

Этот режим позволяет выполнять 64-битные программы; также (для обратной совместимости) предоставляется поддержка выполнения 32-битного кода, например, 32-битных приложений, хотя 32-битные программы не смогут использовать 64-битные системные библиотеки, и наоборот. Чтобы справиться с этой проблемой, большинство 64-разрядных операционных систем предоставляют два набора необходимых системных файлов: один - для родных 64-битных приложений, и другой - для 32-битных программ.

Legacy mode

Данный «унаследованный» режим позволяет процессору выполнять инструкции, рассчитанные для процессоров x86, и предоставляет полную совместимость с 32-битным кодом и операционными системами. В этом режиме процессор ведёт себя точно так же, как x86-процессор, например Athlon или Pentium III, и дополнительные функции, предоставляемые архитектурой x86-64 (например, дополнительные регистры), недоступны. В этом режиме 64-битные программы и операционные системы работать не будут.

Этот режим включает в себя подрежимы:

  • Реальный режим (real mode)
  • Защищённый режим (protected mode)
  • Режим виртуального 8086 (virtual 8086 mode)

Реальный режим использовался в MS-DOS, в реальном режиме выполнялся код BIOS при загрузке компьютера. Защищённый режим используется в 32-битных версиях современных многозадачных операционных систем. Режим виртуального 8086 - подрежим защищённого, предназначался главным образом для создания т. н. «виртуальных DOS-машин». Если из 32-битной версии Windows вы запускаете 16-битное DOS-приложение, то работает эмулятор NTVDM, который использует этот режим процессора. Другой эмулятор, DOSBox, не использует этот режим V86, а выполняет полную эмуляцию.

Переход между режимами

Из длинного режима нельзя перейти в реальный или режим виртуального 8086 без перезагрузки. Поэтому в 64-битных версиях Windows не работает NTVDM и нельзя запускать 16-битные программы.

Самый современный процессор x86-64 полностью поддерживает реальный режим. Если загрузка выполняется через BIOS, то код загрузчика (из сектора #0) исполняется в реальном режиме. Однако если вместо BIOS используется UEFI, то переход в Long mode происходит ещё раньше, и никакого кода в реальном режиме уже не выполняется. Можно считать, что современный компьютер сразу начинает работать в 64-битном длинном режиме.

Трансляция адресов в памяти

Упрощённо говоря, процессор обращается к памяти через шину. Адресами памяти, которыми обмениваются в шине, являются физические адреса, то есть сырые числа от нуля до верхней границы доступной физической памяти (например, до 2 33 , если у вас установлено 8 ГБ оперативки). Ранее между процессором и микросхемами памяти располагался северный мост, но в реализации Intel начиная с Sandy Bridge он интегрирован на кристалл процессора.

Физические адреса являются конкретными и окончательными - без трансляции, без подкачки, без проверки привилегий. Вы выставляете их на шину и всё. Однако программы используют адреса логической памяти, которые должны быть оттранслированы в физические адреса до того, как будет выполнен доступ к памяти. Концептуально трансляция выглядит следующим образом:

Это не физическая схема, а только описание процесса преобразования адресов.

Трансляция начинается, когда CPU выполняет инструкцию, которая ссылается на адрес памяти. Первым шагом является перевод этого логического адреса в линейный адрес. Но, спрашивается, зачем это делать вместо того, чтобы напрямую использовать линейные адреса в программе? Это результат эволюции. Чтобы действительно понять смысл сегментации x86, нам нужно вернуться в 1978 год.

Сегментация памяти в реальном режиме

16-битный процессор 8086 использовал 16-битные регистры и мог напрямую адресовать только 2 16 байт памяти. Инженеры придумывали, как же можно заставить его работать с большим объёмом памяти, не расширяя разрядность регистров.

Были придуманы сегментные регистры, которые должны были задавать, к какому именно 64-килобайтному куску памяти относится данный 16-битный адрес.

Решение выглядит логичным: сначала вы устанавливаете сегментный регистр, по сути говоря “так, я хочу работать с куском памяти начиная с адреса X”; затем 16-битный адрес уже используется как смещение в рамках этого куска.

Всего предусматривалось сначала четыре 16-битных сегментных регистра, потом добавили ещё два:

  • CS = Code Segment
  • DS = Data Segment
  • ES = Destination Segment
  • SS = Stack Segment

Для вычисления линейного адреса ячейки памяти процессор вычисляет физический адрес начала сегмента - умножает сегментную часть виртуального адреса на число 16 (или, что то же самое, сдвигает её влево на 4 бита), а затем складывает полученное число со смещением от начала сегмента. Таким образом, сегменты частично перекрывались, и всего можно было адресовать около 1 МБ физической памяти. Спрашивается, почему не умножать значение сегментного регистра сразу на 65536, ведь тогда можно было бы адресовать 4 ГБ памяти. Тогда это было не нужно и только растило стоимость чипа.

В реальном режиме отсутствует защита памяти и разграничение прав доступа.

Программы были маленькие, поэтому их стек и код полностью помещались в 64 КБ, не было проблем. В языке C тех древних времён обычный указатель был 16-битный и указывал относительно сегмента по умолчанию, однако существовали также far-указатели, которые включали в себя значение сегментного регистра.

#include int main() { char far * p = (char far * ) 0x55550005 ; char far * q = (char far * ) 0x53332225 ; * p = 80 ; (* p) ++; printf ("%d" ,* q) ; return 0 ; }

Тут оба указателя указывают на один и тот же физический адрес 0x55555 .

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

В 32-битном защищенном режиме также используется сегментированная модель памяти, однако уже организованная по другому принципу: расположение сегментов описывается специальными структурами (таблицами дескрипторов), расположенными в оперативной памяти.

Сегменты памяти также выбираются все теми же сегментными регистрами. Значение сегментного регистра (сегментный селектор) больше не является сырым адресом, но вместо этого представляет собой структуру такого вида:

Существует два типа дескрипторных таблиц: глобальная (GDT) и локальная (LDT). Глобальная таблица описывает сегменты операционной системы и разделяемых структур данных, у каждого ядра своя. Локальная таблица может быть определена для каждой конкретной задачи (процесса). Бит TI равен 0 для GDT и 1 для LDT. Индекс задаёт номер дескриптора в таблице дескрипторов сегмента. Поле RPL расшифровывается как Requested Privilege Level.

Сама таблица представляет собой просто массив, содержащий 8-байтные записи (дескрипторы сегмента), где каждая запись описывает один сегмент и выглядит так:

Помимо базового адреса сегмента дескрипторы содержат размер сегмента (точнее, максимально доступное смещение) и различные атрибуты сегментов, использующиеся для защиты памяти и определения прав доступа к сегменту для различных программных модулей. Базовый адрес представляет собой 32-битный линейный адрес, указывающий на начало сегмента, а лимит определяет, насколько большой сегмент. Добавление базового адреса к адресу логической памяти дает линейный адрес (никакого умножения на 16 уже нет). DPL (Descriptor Privilege Level) - уровень привилегий дескриптора; это число от 0 (наиболее привилегированный, режим ядра) до 3 (наименее привилегированный, пользовательский режим), которое контролирует доступ к сегменту.

Когда CPU находится в 32-битных режимах, регистры и инструкции могут в любом случае адресовать всё линейное адресное пространство. Итак, почему бы не установить базовый адрес в ноль и позволить логическим адресам совпадать с линейными адресами? Intel называет это «плоской моделью», и это именно то, что делают современные ядра x86. Это эквивалентно отключению сегментации.

Длинный режим

На архитектуре x86-64 в длинном (64-битном) режиме сегментация не используется. Для четырёх сегментных регистров (CS, SS, DS и ES) базовый адрес принудительно выставляются в 0. Сегментные регистры FS и GS по-прежнему могут иметь ненулевой базовый адрес. Это позволяет ОС использовать их для служебных целей.

Например, Microsoft Windows на x86-64 использует GS для указания на Thread Environment Block, маленькую структурку для каждого потока, которая содержит информацию об обработке исключений, thread-local-переменных и прочих per-thread-сведений. Аналогично, ядро Linux использует GS-сегмент для хранения данных per-CPU.

Практика: просмотр регистров

(gdb) info registers rax 0x40052d 4195629 rbx 0x0 0 rcx 0x0 0 rdx 0x7fffffffde78 140737488346744 rsi 0x7fffffffde68 140737488346728 rdi 0x1 1 rbp 0x7fffffffdd80 0x7fffffffdd80 rsp 0x7fffffffdd80 0x7fffffffdd80 r8 0x7ffff7dd4e80 140737351863936 r9 0x7ffff7dea700 140737351952128 r10 0x7fffffffdc10 140737488346128 r11 0x7ffff7a32e50 140737348054608 r12 0x400440 4195392 r13 0x7fffffffde60 140737488346720 r14 0x0 0 r15 0x0 0 rip 0x400531 0x400531 eflags 0x246 [ PF ZF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0

Кольца защиты

Вы, вероятно, знаете интуитивно, что приложения имеют ограниченные полномочия на компьютерах Intel x86 и что только код операционной системы может выполнять определенные задачи. Как это работает? Уровни привилегий x86 - механизм, с помощью которого ОС и ЦП ограничивают возможности программ пользовательского режима. Существует четыре уровня привилегий: от 0 (наиболее привилегированных) до 3 (наименее привилегированных) и три основных ресурса: память, порты ввода-вывода и возможность выполнения определенных машинных инструкций. В любой момент времени процессор x86 работает на определенном уровне привилегий, который определяет, какой код может и не может сделать. Эти уровни привилегий часто описываются как защитные кольца, причем самое внутреннее кольцо соответствует самым высоким привилегиям. Большинство современных ядер x86 используют только Ring 0 и Ring 3.

Виртуальное адресное пространство

Хотя виртуальные адреса имеют разрядность в 64 бита, текущие реализации (и все чипы, которые находятся на стадии проектирования) не позволяют использовать всё виртуальное адресное пространство из 2 64 байт (16 экзабайт). Это будет примерно в четыре миллиарда раз больше виртуального адресного пространства на 32-битных машинах. В обозримом будущем большинству операционных систем и приложений не потребуется такое большое адресное пространство, поэтому внедрение таких широких виртуальных адресов просто увеличит сложность и расходы на трансляцию адреса без реальной выгоды. Поэтому AMD решила, что в первых реализациях архитектуры фактически при трансляции адресов будут использоваться только младшие 48 бит виртуального адреса.

Кроме того, спецификация AMD требует, что старшие 16 бит любого виртуального адреса, биты с 48-го по 63-й, должны быть копиями бита 47 (по принципу sign extension). Если это требование не выполняется, процессор будет вызывать исключение. Адреса, соответствующие этому правилу, называются «канонической формой». Канонические адреса в общей сложности составляют 256 терабайт полезного виртуального адресного пространства. Это по-прежнему в 65536 раз больше, чем 4 ГБ виртуального адресного пространства 32-битных машин.

Это соглашение допускает при необходимости масштабируемость до истинной 64-разрядной адресации. Многие операционные системы (включая семейство Windows NT и GNU/Linux) берут себе старшую половину адресного пространства (пространство ядра) и оставляют младшую половину (пользовательское пространство) для кода приложения, стека пользовательского режима, кучи и других областей данных. Конструкция «канонического адреса» гарантирует, что каждая совместимая с AMD64 реализация имеет, по сути, две половины памяти: нижняя половина «растет вверх» по мере того, как становится доступнее больше виртуальных битов адреса, а верхняя половина - наоборот, вверху адресного пространства и растет вниз.

Первые версии Windows для x64 даже не использовали все 256 ТБ; они были ограничены только 8 ТБ пользовательского пространства и 8 ТБ пространства ядра. Всё 48-битное адресное пространство стало поддерживаться в Windows 8.1, которая была выпущена в октябре 2013 года.

Структура таблицы страниц

Вместо двухуровневой системы таблиц страниц, используемой системами с 32-битной архитектурой x86, системы, работающие в длинном режиме, используют четыре уровня таблицы страниц.

Возможные размеры страниц:

  • 4 KB (2 12 байт) - наиболее часто используется (как и в x86)
  • 2 MB (2 21 байт)
  • 1 GB (2 30 байт)

Полная иерархия сопоставления страниц размером 4 КБ для всего 48-битного пространства займет немногим больше 512 ГБ ОЗУ (около 0.195% от виртуального пространства 256 ТБ).

Практика: как скоро оно упадёт?

Понятно, что данный код по стандарту некорректен, содержит Undefined Behavior, а раз так, то компилятор может сделать что угодно, например не упасть вообще. Но тем не менее, если запускать на x86-64, то падает оно в определённый момент...

#include #include char buf[ 1 ] ; #define PAGE_SIZE 4096 int main() { char * ptr = buf; for (;; ) { int offset = (intptr_t ) ptr % PAGE_SIZE; printf ("%p: offset = %d\n " , ptr, offset) ; * ptr = "a" ; // Segmentation fault expected! ++ ptr; } return 0 ; }

Организация стека и вызова функций

В x86-64 по сравнению с x86 заметно выросло число регистров общего назначения (вдвое), что не может не радовать. Поэтому больше регистров можно использовать для передачи аргументов в функции, при этом меньше использовать стек в памяти, тем самым вызов функции ускоряется.

Стек в x86

Стек растёт вниз. Вершина стека на самом деле имеет наименьший адрес.

Используется специальный регистр rsp (Stack Pointer).

Инструкция

Push rax

эквивалентна

Sub rsp, 8 mov , rax

Инструкция

эквивалентна

Mov rax, add rsp, 8

Соглашение вызова в Linux

В Linux и других ОС используется соглашение System V AMD64 ABI.

Для простоты мы ограничимся целочисленными аргументами и указателями.

Первые шесть аргументов передаются через регистры:

Если этого не хватает, то седьмой аргумент уже передаётся через стек.

Если функция хочет использовать регистры rbx, rbp и r12–r15, она перед выходом обязана их вернуть в первоначальное состояние.

Возвращаемое значение до 64 бит сохраняется в rax, до 128 бит - в rax и rdx.

Фрейм стека

Для такой функции

long myfunc(long a, long b, long c, long d, long e, long f, long g, long h) { long xx = a * b * c * d * e * f * g * h; long yy = a + b + c + d + e + f + g + h; long zz = utilfunc(xx, yy, xx % yy) ; return zz + 20 ; }

стек будет иметь такой вид:

Красная зона (red zone)

128-байтовая область за пределами места, на которое указывает rsp, считается зарезервированной и не должна изменяться обработчиками сигналов или прерываний. Функции могут использовать эту область для временных данных, которые не нужны для вызовов функций. В частности, листовые функции (из которых не вызываются другие функции) могут использовать эту область для всего кадра стека, а не изменять указатель стека rsp в начале и конце выполнения.

Это оптимизация. Уменьшение и увеличение rsp - это уже две инструкции, их можно сэкономить.

Например:

long utilfunc(long a, long b, long c) { long xx = a + 2 ; long yy = b + 3 ; long zz = c + 4 ; long sum = xx + yy + zz; return xx * yy * zz + sum; }

Сохранение базового указателя фрейма

Указатель rbp (и его предшественник ebp на x86), будучи стабильной «привязкой» к началу фрейма стека во время выполнения функции, очень удобен для ручного программирования и для отладки. Однако некоторое время назад было замечено, что коду, который генерируется компилятором, rbp действительно не нужен (компилятор может легко отслеживать смещения из rsp).

Вот почему некоторые компиляторы начали пропускать базовый указатель при агрессивных оптимизациях, тем самым сократив пролог и эпилог функции и предоставив дополнительный регистр для общих целей.

gcc сохраняет базовый указатель по умолчанию на x86, но позволяет оптимизировать с помощью флага компиляции -fomit-frame-pointer .

Во всяком случае, еще одна «новинка», которую представил AMD64 ABI, делает базовый указатель явно необязательным. gcc придерживается этой рекомендации и по умолчанию опускает указатель фрейма на x64 при компиляции с оптимизацией. Он дает возможность сохранить его, указав флаг -fno-omit-frame-pointer .

Соглашение вызова в Windows

Ура, больше никаких cdecl/stdcall/fastcall/thiscall/register/safecall, осталось только одно соглашение вызова! Но нет, Microsot разработал vectorcall...

Первые четыре аргумента передаются через регистры: rcx, rdx, r8, r9.

Регистры rbx, rbp, rdi, rsi, rsp, r12, r13, r14 и r15 функция обязана вернуть в исходное состояние.

Практика: сумма чисел 3 : c3 ret

Системные вызовы

Механизмы выполнения системного вызова

Функции C

Когда вы вызываете какую-либо системную функцию, например open() , write() , getpid() из кода на C, вы на самом деле не делаете напрямую сам системный вызов. Просто так вызовом функции в режим ядра (ring 0) из пользовательского (ring 3) перейти не получится. Вызываются обычные функции, реализованные внутри стандартной библиотеки, а уже они внутри делают системный вызов тем или иным методом:

  • через программное прерывание,
  • через инструкцию syscall,
  • через инструкцию sysenter.

Программное прерывание

Прерывания - это как бы сигнал процессору, что надо прервать выполнение (их поэтому и назвали прерываниями) текущего кода и срочно сделать то, что указано в обработчике.

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

Программное прерывание - синхронное прерывание, которое может осуществить программа с помощью специальной инструкции.

В процессорах архитектуры x86 для явного вызова синхронного прерывания имеется инструкция int , аргументом которой является номер прерывания (от 0 до 255). В защищённом и длинном режиме обычные программы не могут обслуживать прерывания, эта функция доступна только системному коду (операционной системе).

В ОС Linux номер прерывания 0x80 используется для выполнения системных вызовов. Обработчиком прерывания 0x80 является ядро Linux. Программа перед выполнением прерывания помещает в регистр eax номер системного вызова, который нужно выполнить. Когда управление переходит в ring 0, то ядро считывает этот номер и вызывает нужную функцию.

Метод этот широко применялся на 32-битных системах, на 64-битных он считается устаревшим и не применяется, но тоже работает (пример показывался на лекции), хотя с целым рядом ограничений (например, нельзя в качестве параметра передать 64-битный указатель).

  • Поместить номер системного вызова в eax .
  • Поместить аргументы в регистры ebx , ecx , edx , esi , edi , ebp .
  • Вызвать инструкцию int 0x80 .
  • Получить результат из eax .

Пример реализации mygetpid() (получение PID текущего процесса) на ассемблере (для системного вызова getpid используется номер 20):

Intel_syntax noprefix . globl mygetpid .text mygetpid: mov eax , 20 int 0x80 ret

Инструкция syscall

Это более современный метод, используется в 64-битном Linux, работает быстрее.

  • Номер системного вызова помещается в rax .
  • Аргументы записываются в rdi , rsi , rdx , r10 , r8 и r9 .
  • Затем вызывается syscall .
  • Результат в rax .

Пример реализации mygetpid() (получение PID текущего процесса) на ассемблере (для системного вызова getpid по таблице используется номер 39):

Intel_syntax noprefix . globl mygetpid .text mygetpid: mov rax , 39 syscall ret

Отслеживание системных вызовов

На Linux инструмент пользовательского режима strace позволяет отслеживать системные вызовы, которые выполняет данная программа.