X86

x86 (aka i80x86, IA-32 и даже x86-64 aka amd64/intel64) — довольно распространенная архитектура процессоров для персональных компьютеров и серверов, благодаря которым ты, да-да, лично ты читаешь этот текст. По совместительству — самая популярная архитектура процессоров для ПеКа, также абсолютный рекордсмен по архитектурным излишествам, их рудиментам и связанным с ними аппаратно-программным изыскам. В последнее время постепенно сдувается под прессом совсем уж бессмысленной и беспощадной платформы — ARM.
Предком x86 были восьмибитные процессоры Intel 8080 и 8085. 8080 имел шину адреса в 16 бит и без особых ухищрений мог адресовать 64 кб, загружая по 8 бит за одно обращение к памяти. Немного спустя его рождение привело к явлению миру и городу первого (персонального) микрокомпьютера Altair 8800 с первым же коммерческим программным продуктом полуподвальной, еще малоизвестной тогда конторки Micro-Soft, состоящей из нескольких друзей-студентов. Ага.
Вскоре после начала производства 8080, группа работников Intel уволилась и создала свой православный аналог 8080, с дополнительными командами и регистрами, полностью бинарно совместимый с 8080. Звался он Z80 и был популярен в домашних компьютерах вплоть до конца 80-х, успешно конкурируя с MOS 6502.
Прогрессивная совковая промышленность, отвечая Интелу, затрещала, но выдержала, родив из своих недр микросхему КР580ВМ80А с тактовой частотой аж в 2.5 МГц. ИЧСХ, под микроскопом сбоку от точки подвеса первой ноги можно лицезреть остатки интеловской маркировки — i80. По мнению совкодрочеров, такой проеб особенно обиден, ибо в почтовых ящиках, НИИ и на оборонных заводах была проделана работа по всесторонней модернизации исходного проца, да так успешно, что новый продукт был лишь функциональным аналогом оригинала. Впрочем, серийное производство освоили лишь в 1977 году, но через год уже вышел 8086 — собственно, первый x86 процессор.
Род x86 начинается с процессора , который представлял собой 16-разрядный процессор с адресным пространством памяти в 1Мб. Адресная шина в 20 бит при этом использовалась специфически: программисту выдавался на руки виртуальный 32-битный адрес, разрубленный на две половины — 16 бит на сегмент, по биту через жопу сдвинутые на 4 разряда влево плюс 16 бит на смещение в сегменте формируют полный адрес. Выражаясь языком Си, real_address=(segment_register«4)+address_register. 16-разрядное ОЗУ для 8086 стоило дорого, потому в тираж кроме него пошел и наполовину восьмибитный 8088, загружавший 16-битное слово за два обращения к памяти.
Фокус с громоздкой адресацией придумали дабы 8086 умел адресовать больше памяти — расово новоанглийский LSI-11 при переползании с родных 16 адресных бит на 22 к концу своей истории потребовал переписывания или в лучшем случае перекомпиляции софта, а в своей 32-разрядной (AKA VAX) ипостаси вообще утратил совместимость с предком, тогда как х86 пережил переход на 24-, а затем и на 32-битные адреса совершенно безболезненно. При этом для сохранения совместимости, на которую в Интеле и по сей день яростно дрочат, с уже имеющимся софтом для 8086, он исполнялся его через «окошко» в те же самые 64 кб с последующим «наращиванием» в CS:IP первой цифры, что сдвигало «окошко» на 1/256 страницы.
8086 был несовместим с 8080 как по выводам, так и по системе команд, что не помешало японской компании NEC выпустить свой процессор v20, который таки был совместим с 8086, но умел выполнять и код для 8080. Применялся он в расово японском компьютере PC-88, знаменитым большим количеством эроге.
Отечественный производитель отметился и тут, и в той стране имел известность в определенных кругах как КР1810ВМ86, что кагбэ намекает на 8086, но запил оказался немного не торт, и почти ниасилил.
Лулз же во всей этой истории заключается в том, что изначально при разработке ПеКа ведущий инженер проекта Дон Эстридж хотел использовать собственную МежДелМашевскую разработку — ROMP, но когда узнал, что боевые слоупоки из процессорного отдела опять кормят его завтраками, и поменял процессор на 68000-й мотороллер — тот самый, на котором через пять лет был построен Мак. Однако у мотороллеров на тот момент (1980 год) были неиллюзорные проблемы с производством, да и обвязка на 6800 стоила как самолёт, поэтому разработчики опять передумали, и остановились на интеловском 8088, который был дёшев, производился массово (IBM даже настояла на продаже Интелом лицензии на его производство AMD), да вдобавок прекрасно работал с копеечной 8-битной обвязкой от 8085. Заслоупоченный же ROMP, когда его наконец доделали, превратился в знаменитую POWER-архитектуру — ту самую, на которую потом перешли в Apple вместо 680х0.
Развитием 8086 стал процессор 80186, не достигший значимых™ успехов на рынке ПеКа, хотя и бывший длительное время весьма популярным для встраиваемой электроники, в связи с чем на рынок были выпущены SoC-версии данного процессора. Архитектурных отличий нет, так, несколько новых команд и немного другой механизм обработки прерываний.
Следующим был 80286. Несмотря на всю его неуклюжесть, для своего времени (1982 г.) являлся значительным шагом вперед благодаря <del>появлению</del> преждевременным родам защищенного режима. При возможности подключения к шине 16 мегабайт, мог адресовать в защищенном режиме гигабайт памяти, что приходилось делать весьма нетривиальным способом. Вернуться же из защищенного режима было невозможно без перезагрузки, поэтому толком использовать больше 1 мб реально умел лишь Microsoft Xenix, и, возможно, Minix (однозадачная unix-подобная ОС, написанная Танненбаумом для демонстрации студентам). Вообще, конечно, были и маньяки, умудрявшиеся на AT 16 MHz и фряху поднять, но пруфлинков на это не осталось. Хотя один релкомовский сервер именно на таком железе в лапки попадался и довольно долго проработал. Это "можно было" сделать, но это была вещь в себе.
Новое революционное достижение Intel — 32-разрядный процессор 80386, родоначальник архитектуры IA-32. Архитектуру оценили сразу и массово, уже вскоре появились DOS-оболочки (DESQview, Windows 2.0 for 386) и полноценные ОС (OS/2, BSD, …) с поддержкой 32-битной архитектуры, включая ядро Linux. Имел полноценное страничное MMU для организации виртуальной памяти. Адресуемое пространство памяти — 4Gb (а с перезагрузкой сегментных регистров — чуть меньше 8 Gb, поскольку база сегмента — 32 разряда, то есть, если задать базу 0xffffffff и лимит 0xfffff страниц). Но это неважно, поскольку адресных линий у i386 было всего 32 (а у SX — и вовсе 24, как у 286). Умопомрачительная величина для эпохи ZX-Spectrum. 386SX появился позже и был «облегченной» версией с 16-разрядной шиной данных, а потому ввиду относительной дешевизны получил распространение в бизнес-сегменте. Значимых изменений архитектуры в целом больше не будет вплоть до настоящего времени, если не считать таковым внедрение 64-битного расширения в 2003 году.
На этом революции заканчиваются и начинается эволюция. В 80486DX появился встроенный сопроцессор, кэш-память и трансляция внешних CISC инструкций во внутренние RISC. В Pentium — конвейерная архитектура с предсказанием ветвлений. Начинается внедрение расширений — MMX, SSE, SSE2, SSE3, Тысячи их! В Pentium Pro появилась возможность адресовать посредством PAE до 64GB памяти и встроенная поддержка многопроцессорности. Немного опередил время Pentium III Tualatin (запиленный, кстати, тем самым Владимиром Пентковским, что запилил в своё время вместе с Борисом Бабаяном пресловутый МЦСТ), имея производительность выше, чем у Pentium IV и энергопотребление ниже, чем у Pentium III Coppermine, но был незаслуженно отброшен маркетологами в гонке за 2 ГГц, но потом наработки из него вернулись в Core2 и Atom.
В 2001 году AMD выпустила спецификацию x86-64, быстро переименовав в AMD64. Несколько позже Intel, эпично сфейлившись с не x86-совместимыми серверным Itanium, подхватила эту концепцию как EM64T, тоже впоследствии переименовав ее в Intel64. Х86-64 привнесло в архитектуру 64-битные расширения, попутно выпилив часть рудиментов, а также, как потом выяснилось, и полезных фич. Это может означать полную победу x86: если ей и предрекали смерть вместе с 32-разрядыми вычислениями, то теперь она фактически обрела новую жизнь, на горе конкурентам и здравому смыслу. Первые 64-разрядные процессоры появились в 2003 году.
В 2006 году предпоследний оплот не-интеловских десктопов, Apple, забил на PowerPC к великой скорби PowerPC-фагов, и стали выпускать основанные на интеловских процессорах десктопы и ноутбуки. В первую очередь потому, что очередное поколение РРС, при всей его производительности оказалось настолько неиллюзорной кофеваркой, что на десктопные маки пришлось запиливать едва ли не первую в мире официальную искароппки систему жидкостного охлаждения. О том, чтобы ставить эдакую хуиту в ноутбуки или компактные машины типа iMac'ов не могло быть и речи, поэтому вместо процессоров G5 мобильные и компактные Маки комплектовались камнями G4, а то и G3, через что стали неиллюзорно делать сасай у Glorious PC Master Race. Учитывая же, что к тому моменту основную прибыль Эпплу приносили именно ноуты, результат немного предсказуем. Так что теперь на этот ваш Мак можно невозбранно заливать самую передовую в мире версию Windows, а на все остальные унылые компы, хоть и не без изъебств, но таки заливать священную Макось на радость нищебродам и копирастам в назидание.
Первый архитектурный геморрой. Имел место в процессоре 80286. Достаточно эпичен. Заключается в том, что установкой этого флага процессор переводится в режим, в котором доступны все его новые фички (включая доступ к памяти до 16 Mb), но при этом он теряет совместимость с 8086, а сбросить этот флаг можно только полным ресетом процессора. А поскольку ко времени появления компьютеров PC AT с этим процессором существовало более 9000 программ под MS-DOS, которая была гвоздями прибита к 8086, то новые возможности процессора оставались невостребованными. Для решения проблемы был придуман костыль: для возврата в реальный режим выполнялся сброс процессора через контроллер клавиатуры, что само по себе было операцией небыстрой. Поэтому использовать память свыше 1 Мб было можно только для виртуальных дисков, кеш-буферов и временных хранилищ. Windows и OS/2, работая в защищенном режиме, пользовались этим костылем для обработки прерываний и запуска программ DOS.
Начиная с процессора 80386 флаг защищенного режима сбрасывать было уже можно, но костыль с контроллером клавиатуры таскают и до сей поры, дабы обеспечить совместимость. Также в 80386 появился режим виртуального 8086, что тоже в какой-то степени решало проблему совместимости с DOS.
Второй по значимости костыль. Дело в том, что ряд нерадивых программистов использовали тот факт, что адреса в сегменте FFFFh процессором 8086 заворачивались на первые 64k памяти.
В 80286, имевшем 24-битовый физический адрес, старшие биты больше не обрезались, и поэтому такие адреса указывали в расширенную память, а в результате такие хитровыебанные программы на этом процессоре не работали. Решили эту проблему, сделав 20-ю адресную линию отключаемой, заведя управление ею на вышеупомянутый контроллер клавиатуры. Костыль также таскают по сей день, хотя уже и о программах-то тех, наверное, давно забыли, как и о самой MS-DOS вспоминают лишь ностальгисты да олдфаги. Область расширенной памяти, адресуемая в реальном режиме (размером в 65520 байт), получила название High Memory Area (HMA), которую, впоследствии, MS-DOS использовала для размещения своего ядра, естественно, при этом потеряв совместимость с A20-зависимыми программами (тем не менее, для их запуска можно было грузить DOS в обычные нижние адреса памяти). Тут следует сделать важное замечание для людей, которые не совсем понимают нафига всё это сделано. Отключать А20 придумали в ibm действительно для совместимости. Если забыть о том, что линии можно(нужно?) отключать и ебанутых долбоёбах, которые использовали memory wrap, то нововведение дескрипторов сегмента не кажется такой плохой идеей, так как вместе с защищенным режимом уже в 286 позволило говорить о какой-никакой многозадачности. Также следует не забывать что в компьютерах 21-го века, управление 20-й адресной линией производится как правило более быстрыми способами, чем через контроллер клавиатуры (опция в BIOS «Gate a20 option», где normal — использование контроллера клавиатуры, а Fast — уже что-то реализуемое через сам чипсет)
Недокументированная команда, имевшаяся в процессоре 80286, которую использовали для обращения к памяти выше 1Мб в реальном режиме. Использовалась драйвером HIMEM.SYS. Говорят, что был выигрыш в скорости, по сравнению с переключением через клавиатурный контроллер. Других преимуществ нет. Маньяки из IBM даже пытались реализовать через нее что-то наподобие виртуальной машины, но сфейлили из-за невысокой скорости работы.
Благодаря своей давней истории и стремлению Интела к сохранению совместимости, сабжевый процессор являет нам ярчайший пример свалки исторического мусора, напоминая тем самым ДНК. Начнём с того, что x86 является чуть ли не единственным современным CISC'ом. А это означает множество режимов адресации, избыточную, неортогональную и не единообразную систему команд, совершенно ебанутую систему префиксов команд и смехотворное количество регистров общего назначения (с последним пунктом в X86-64 дела обстоят <del>несколько</del> в два раза лучше), правда, от последнего помогает условное выполнение и переименование регистров. Въедливый нерд же, ознакомившись со структурой сегментного дескриптора, моментально фалломорфирует от того, что первые 24 бита поля base address хранятся отдельно от последних 8-ми. Может показаться, что причина этого кроется в том, что процессор проектировали конченые укурки, но на самом деле всё много прозаичней: в процессоре 80286 это поле было 24-х разрядным. А когда потребовалось расширить его до 32-х разрядов, старшие 8 бит приткнули куда получилось. И вот из такого леденящего душу пиздеца состоит наш любимый x86 чуть более, чем полностью.
Также известный как Unreal mode (по аналогии с реальным режимом, real mode). Очень интересный костыль, связанный с наличием т. н. «теневой части» сегментного регистра aka дескрипторного кеша. Впервые появился в 80386, с возможностью возвращаться из защищённого режима в реальный. Нехитрый трюк позволяет модифицировать реальный режим так, что в нём становится можно обращаться ко всем четырем гигабайтам адресного пространства. Недокументированная, но вполне полезная и юзабельная в некоторых ситуациях фича. То есть, "была" полезной, когда кто-то ещё использовал для чего-то полезного реальный режим. Сейчас эта фича используется в основном в BIOS-ах, и то только из-за лени программистов.
Некоторые криворукие разработчики использовали частоту процессора для тайминга в своих приложениях, для совместимости с ними был запилен такой костыль, понижающий частоту ЦП до 4.77 мГц (как 8088). Лулз еще в том, что название кнопки противоположно ее действию. Особенность не самого процессора x86, а скорее самой платформы. Использовалась начиная с 286 и порой аж до 486 и первых Pentium, позже была предана анафеме, хотя кнопку можно было встретить и на более новых корпусах. Программные реализации применяются и ныне — ограничение скорости ЦП есть в DOSBox и VirtualBox.
Несмотря на «4-уровневую» систему колец защиты (от наиболее высокого 0-го уровня, где, по идее, работает менеджер Операционной системы, который имеет наиболее высокий приоритет до 3-го, наименее привилегированного), имеется еще один «надуровень» который имеет… еще более высокие привилегии! Точнее, это программный код который вообще никому не виден и который (когда процессор передает ему управление по сигналу #SMI) имеет полный и неограниченный доступ абсолютно ко всем ресурсам системы.
Более того, в архитектуре предусмотрен специальный бит, и если обработчик этого режима (SMI Handler) установит его, то OS даже если и сильно захочет, не сможет не то что блокировать его, но и даже прочитать!
Вообще, всё задумывалось как лучше — SMI-обработчик это на самом деле часть BIOS и управление ему передаётся по сигналу от чипсета при наступлении каких-то событий (например, запись в некоторые порты или сигнал о перегреве) совершенно прозрачно для операционной системы, за исключением потраченного на выполнение этого обработчика времени. То есть, BIOS обеспечивает поддержку или эмуляцию некоторых девайсов чипсета, освобождая ОС от необходимости делать это самой, что даёт нам шансы в старости снова увидеть DOS (да-да, там в 90% случаев было примерно так же: Onboard BIOS Extensions эмулировали сферовакуумное оборудование, а софт работал прямо с этим «оборудованием» без дров).
Хорошо? Хорошо, но не совсем: во-первых, для SMМ нужна поддержка в железе: в чипсете и в процессоре (аж целый специальный режим).
Во-вторых, SMI-обработчики беспардонно отнимают время у задач операционной системы, никак не прерываемы, не откладываемы и приходят ВНЕЗАПНО
В-третьих, факт наличия SMM, именуемого иногда Ring −2, вызывает небеспочвенные опасения у специалистов касательно появления руткитов и прочих троянов, которые не будут брезговать добавлять в BIOS свой резидентный модуль — имея с этого профит в виде повышенной живучести и скрытности, так как выпилить их можно будет только перешивкой биоса, причем — только на программаторе. И совершенно ненапрасно, поскольку первый такой V2P был написан ещё в 1998-ом… И очень интересно глючил систему, «зануляя» по байту с конца массива флэшки за каждую перезагрузку. Отчего порты на матери поражённой такой заразой начинали друг за другом довольно экзотично отмирать даже после того, как антивирь вычищал код-инсталлятор.
В-четвёртых, мысль сумрачных гениев из компании Интел не стоит на месте, и SMM-у ещё в середине девяностых придумали более продвинутую замену: ACPI. Идея ACPI в том, что BIOS всё равно предлагает обработчики для событий чипсета, но в виде аккуратно сложенного в доступную операционной системе табличку байткода. ОС содержит интерпретатор байткода и при необходимости вызывает эти обработчики в своём контексте когда и как хочет. Все довольны. SMМ можно выкидывать на помойку.
Но не тут-то было. Несмотря на моральное устарение, SMM жив даже в последних моделях x86 процессоров и чипсетов. Помереть SMM-у мешает тот факт, что через него реализовано несколько других уродливых костылей, из которых самый главный — эмуляция PS/2 клавиатуры через USB, и вообще эмуляция доисторических клавиатурных портов, которые, помимо своего прямого назначения, позволяют невозбранно ресетить систему и используются для этого многими олдфажными ОС-ями. Алсо, во многих системах SMM управляет кулером процессора, без чего может наступить Пиздец. Все эти костыли опциональны; то есть, если ОС поддерживает ACPI, она при загрузке отключает SMM и дальше делает всё сама через ACPI. ACPI поддерживают все выпущенные за последний десяток лет мейнстримные ОСи (винды, линух, фрибсдя, макось, и другие). Но убрать костыль, как все уже догадались, не позволяет желание сохранить обратную совместимость с доисторическим софтом, а также предпочтением мобильных камушков — управлять собственным кулером самостоятельно, игноря эту директиву (большинство буков Lenovo, Samsung-и почти все, словивший эпичный пиздец на этом эффекте Fujitsu-Siemens и т. п.).
В процессорах начиная с 80286 был введен механизм аппаратного переключения контекстов задач, но практически не использовался разработчиками по причине неуклюжей реализации, и поэтому из x86-64 был выпилен.
Система команд x86 начиная с 8086 значительных изменений не претерпела, она просто все расширяется и расширяется добавлением новых костылей, постепенно превращаясь в один большой фракталоподобный костыль. Работа с 8-, 16-, 32- и 64-битными операндами и новые режимы адресации вводятся путем добавления префиксов или атрибутов сегмента, а число самих режимов скоро перевалит за 9000.
Упомянутое выше архитектурное расширение до 64 бит представляет собой еще один режим работы, несовместимый с реальным режимом, но немного совместимый с защищенным. В этом режиме доступны шестнадцать 64-битных регистров общего назначения и Over 9000 адресного пространства.
Примечателен тем, что разработчиком этой архитектуры была AMD, в то время как Intel <del>скопипиздила</del> переделала технологию (кое-что не доделав), изменив неполиткорректное вражеское название AMD64 на нейтральное EM64T. Сей факт несколько нетипичен, так как крайне редко Intel что-то так дословно копипастила у AMD, обычно все было наоборот. Скопипиздили, кстати, довольно коряво, и первые 64-битные зионы, например, бодро рапортовали о 40 битах физического адреса, имея всего 36. Однако ты, Анон, должен помнить — никто просто так ничего без последствий не пиздит. Вся загогулина есть в том, что существует соглашение о перекрёстном лицензировании технологий, по условиям которого эти две конторки обязаны(!!!) делиться подобными технологиями. Отак-то!
Несмотря на свою молодость, даже этот режим уже пару раз перепилили по всё той же набившей оскомину причине: совместимость с быдлокодом. Дело в том, что так увлекшись избавлением от атавизма сегментной адресации, инженегры AMD заодно выпилили две древнючие команды: LAHF и SAHF, использовавшиеся в основном для анализа флагов состояния не менее древнючего куска кремния по имени 8087(fstsw ax+sahf). Эти команды существовали со времён дедушки 8086, и занимались пересылкой нижнего байта регистра флагов в аккумулятор и обратно. Начиная с Пня-2, эту команду перестали указывать в документации, тщетно надеясь, что быдло-погромисты забудут этот уродливый костыль, и будут пользоваться богоугодными pushfd+pop reg/push reg+popfd, работающими на новых процах с нулевым начислением обращений в память благодаря хитрожопой штуке «очередь записи», но не тут-то было. Оборзевшие от безнаказанности x86-фаги продолжали совать эти команды везде, до куда добирались, в частности — в софт для виртуализации. Ну а дальше приключилась стандартная история для х86-архитектуры: вместо того, чтобы показать быдлокодерам писю, в архитектуру вставили очередной костыль. Да, мой юный друг, на ранних Athlon 64 и соответствующих им интелах невозможно было запустить 64-битного гостя даже если хост был тоже 64-битный. Такие дела.
Революционная идея — выпилить старые костыли методом запила новых — пришла на ум инженерам Intel после очередного сеанса раскуривания какого-то нового типа веществ. Однажды, когда в очередной раз стало подходить к концу пространство опкодов, интелевцы задумались: до коих пор, мать твою, нам городить мелкие костыли, не пора ли запилить такой, чтобы хватило лет этак на десяток? И им пришла в голову гениальная мысль, суть которой в следующем.
Давно известно, что размер опкода в x86 — всего один байт. Ну так вот исторически сложилось. И возможных инструкций можно закодировать всего 256. Поначалу (8086) этого хватало даже с лихвой: можно было, не боясь исчерпать опкодовое пространство, для самых частоиспользуемых операций кодировать индекс регистра непосредственно в коде инструкции: ведь команда занимает всего один байт, а память в те времена была по цене золота. Также среди этих кодов существовали так называемые префиксы, сами не кодирующие никакой операции, но немного (или много) меняющие смысл следующего опкода, грубо говоря, рассматривались с ним как единый целый опкод. И таким, и только таким способом можно было расширять однобайтное пространство. О первом глобальном расширении задумались при разработке 80286: тогда в префикс превратили команду «POP CS» за номером 15, доставив баттхёрта некоторым авторам вирусов, активно её использовавшим. Пространство расширилось еще на 255 кодов. Пиздец же начался с эпохи великого и ужасного SSE, когда новые команды стали расти как грибы после дождя. В дело пошло переопределение префиксов REPNE/REPE и OPSIZE. Появились трехбайтовые команды с длинной цепочкой префиксов (и постфиксов). Когда амдшники создавали свой AMD64, они в порыве энтузиазма расправились с однобайтовыми INC/DEC, превратив их в префикс REX. Код стал состоять из префикс-байтов чуть менее, чем наполовину. И вот, свершилось. Вместо этой цепочки переопределенных однобайтных префиксов решили сделать один многобайтный универсальный. В общем — разумное решение. Но! Где взять для него опкод? Ведь однобайтовое пространство уже давно занято. Но ведь гений костылестроения Intel не знает границ! Решили просто: взяли две, уже не совсем нужные в 10-х годах XXI века команды LES и LDS, вспомнив, что они, помимо всего прочего имеют еще и байт-описатель адресации и не могут использовать регистровый операнд. Дырка найдена! Теперь берём команду LES или LDS, кодируем регистровый операнд, а остальные биты — в нашем распоряжении. Выпиливаем все лишние префиксы и ставим вместо них VEX. Можно даже уподобиться RISC'ам и закодировать трех-, четырёх-, и пятиоперандные команды, битов в префиксе хватит (он бывает двух- и трех-байтовым). Правда, некоторые биты приходится делать инверсными, ибо иначе получится LDS или LES, но разве это костыль против такой революции?
Древняя бага, поражала 80386 еще в те времена, когда они не разделились на 386DX и 386SX. Заключалась в том, что ранние 80386 зависали на 32-битном коде. Лулз заключался в том, что даже Intel могла отличить плохой проц от нормального только после тестирования. Была объявлена программа замены, а дабы не терять PROFIT, Intel оттестировала возвращенные б/у процы и повторно выпустила их в продажу, причем хорошие маркировались расовыми буквами ΣΣ (дабл-сигма), а плохие «16 BIT S/W ONLY» (в те времена на 32-битный код многим было похуй). Нынче и то и другое весьма ценится у коллекционеров пруфлинк.
Одним из эпичнейших фейлов Intel была ошибка в процессоре Пентиум в реализации инструкции lock cmpxchg8b с регистровым аргументом (также известная как F00F bug, по первым байтам команды). Заключалась она в том, что любая пользовательская программа могла запросто завесить всю систему. По идее, любая операция с префиксом lock, не обращающаяся к памяти, бессмысленна, и пень это понимал. Но в случае команды cmpxchg8b он тупил, забывая снять блокировку шины, и подвисал после получения адреса обработчика прерывания, так как операции записи не происходило и опаньки. Для преодоления этой проблемы разработчикам ОС приходилось прибегать к нетривиальным изъебствам. Если у вас есть Pentium с ОС Linux вы можете увидеть при загрузке строки «FOOF bug detected, installing workaround», что означает, что вы обладаете бажным процессором Pentium. Фрюха тоже запускает воркараунд, обнаружив первопень.
—Сколько инженеров Intel нужно, чтобы заменить лампочку?
— 1.9999367, но это вполне приемлемая точность.
Кроме того, первые серии Pentium 60/66 MHz (о, веселые 90-е!) весьма пренебрежительно относились к арифметике — а именно, в некоторых случаях операция деления давала неточный результат. Хотя и утверждалось, что ошибка проявляется в одном случае из 9 миллиардов, Интелу пришлось смириться и массово заменить бажные процессоры (предварительно повыебывавшись: дескать, докажите, что вам нужна такая точность).
Ошибка породила немало лулзов, объясняющих, например, переход от численного именования процессоров (80286, 80386) к именам типа «Pentium» и т. д. Путем нехитрых вычислений можно понять, что номер каждого следующего поколения процессоров получался путем сложения номера предыдущего и числа 100. По логике Intel же 486.0 + 100.0 = 585.999996347. Выпускать процессор 585.999996347 Intel не захотели и дали ему имя «Pentium».
… А если серьёзней, в те далекие, лихие времена, Intel-подобные камни выпускали все кому не лень, при этом оставляли даже систему именования, увеличивая местами циферки — у AMD был Am486, у Cyrix — Cx486 и так далее. По версии Intel такое поведение сторонних фирм негативно отражалось на доходах — гоп-фирмы как бы пользовались этим и выходили в «плюс», а Intel соответственно, в «минус». Жадные до денег манагеры Intel, думали-думали и придумали — раз нельзя сделать циферки торговой маркой, то давайте наш абортарий будет давать имена высерам наших рабов-инженеров. И понеслось…

AMD:
Народное
Учитель информатики ФГОУ СПО ТСТ
Отгрохал новый русский особняк. Позвал гостей. Водит, показывает - все в шоке - всё круто. И тут доходят до ванной, и один из гостей спрашивает: 
- Чо у тя в ванной за плитка? Какая-то непонтовая!
- Да ты знаешь сколько я за нее бабла отвалил?!
- Нет! а скока?
Хозяин шепнул ему на ухо сумму. Тот, сделав удивленное лицо, говорит:
- Фигасе! Платиновая что ли!? А кто делает?
- Интел!
ZX-Ревю]], 1996 год