X86
Материал из Lurkmore
« |
Архитектура x86 — это победа маркетинга над здравым смыслом. | » |
— Старожил кремниевой долины |
x86 (aka i80x86, IA-32 и даже x86-64) — довольно распространенная архитектура процессоров для персональных компьютеров и серверов, благодаря которым ты, да-да, лично ты читаешь этот текст. По совместительству — самая популярная архитектура процессоров для ПеКа, также абсолютный рекордсмен по архитектурным излишествам, их рудиментам и связанным с ними аппаратно-программным изыскам. В последнее время постепенно сдувается под прессом совсем уж бессмысленной и беспощадной платформы — 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 начинается с процессора 8086, который представлял собой 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 г.) являлся значительным шагом вперед благодаря появлению преждевременным родам защищенного режима. При возможности подключения к шине 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[1]. Имел полноценное страничное 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 Мб было можно только для виртуальных дисков, кеш-буферов и временных хранилищ[2]. Windows и OS/2, работая в защищенном режиме, пользовались этим костылем для обработки прерываний и запуска программ DOS. Начиная с процессора 80386 флаг защищенного режима сбрасывать было уже можно, но костыль с контроллером клавиатуры таскают и до сей поры, дабы обеспечить совместимость. Также в 80386 появился режим виртуального 8086, что тоже в какой-то степени решало проблему совместимости с DOS.
Адресная линия A20
Второй по значимости костыль. Дело в том, что ряд нерадивых программистов использовали тот факт, что адреса в сегменте FFFFh процессором 8086 заворачивались на первые 64k памяти.
В 80286, имевшем 24-битовый физический адрес, старшие биты больше не обрезались, и поэтому такие адреса указывали в расширенную память, а в результате такие хитровыебанные программы на этом процессоре не работали. Решили эту проблему, сделав 20-ю адресную линию отключаемой, заведя управление ею на вышеупомянутый контроллер клавиатуры. Костыль также таскают по сей день[3], хотя уже и о программах-то тех, наверное, давно забыли, как и о самой MS-DOS вспоминают лишь ностальгисты да олдфаги. Область расширенной памяти, адресуемая в реальном режиме (размером в 65520 байт), получила название High Memory Area (HMA), которую, впоследствии, MS-DOS использовала для размещения своего ядра, естественно, при этом потеряв совместимость с A20-зависимыми программами (тем не менее, для их запуска можно было грузить DOS в обычные нижние адреса памяти). Тут следует сделать важное замечание для людей, которые не совсем понимают нафига всё это сделано. Отключать А20 придумали в ibm действительно для совместимости. Если забыть о том, что линии можно(нужно?) отключать и ебанутых долбоёбах, которые использовали memory wrap, то нововведение дескрипторов сегмента не кажется такой плохой идеей, так как вместе с защищенным режимом уже в 286 позволило говорить о какой-никакой многозадачности. Также следует не забывать что в компьютерах 21-го века, управление 20-й адресной линией производится как правило более быстрыми способами, чем через контроллер клавиатуры (опция в BIOS «Gate a20 option», где normal — использование контроллера клавиатуры, а Fast — уже что-то реализуемое через сам чипсет)
Команда LOADALL
Недокументированная команда, имевшаяся в процессоре 80286, которую использовали для обращения к памяти выше 1Мб в реальном режиме. Использовалась драйвером HIMEM.SYS. Говорят, что был выигрыш в скорости, по сравнению с переключением через клавиатурный контроллер. Других преимуществ нет. Маньяки из IBM даже пытались реализовать через нее что-то наподобие виртуальной машины, но сфейлили из-за невысокой скорости работы.
Архитектурный пиздец эволюции
Благодаря своей давней истории и стремлению Интела к сохранению совместимости, сабжевый процессор являет нам ярчайший пример свалки исторического мусора, напоминая тем самым ДНК. Начнём с того, что x86 является чуть ли не единственным современным CISC'ом. А это означает множество режимов адресации, избыточную, неортогональную и не единообразную систему команд, совершенно ебанутую систему префиксов команд и смехотворное количество регистров общего назначения (с последним пунктом в X86-64 дела обстоят несколько в два раза лучше), правда, от последнего помогает условное выполнение и переименование регистров. Въедливый нерд же, ознакомившись со структурой сегментного дескриптора, моментально фалломорфирует от того, что первые 24 бита поля base address хранятся отдельно от последних 8-ми. Может показаться, что причина этого кроется в том, что процессор проектировали конченые укурки, но на самом деле всё много прозаичней: в процессоре 80286 это поле было 24-х разрядным. А когда потребовалось расширить его до 32-х разрядов, старшие 8 бит приткнули куда получилось. И вот из такого леденящего душу пиздеца состоит наш любимый x86 чуть более, чем полностью.
«Расширенный» реальный режим
Также известный как Unreal mode (по аналогии с реальным режимом, real mode). Очень интересный костыль, связанный с наличием т. н. «теневой части» сегментного регистра aka дескрипторного кеша. Впервые появился в 80386, с возможностью возвращаться из защищённого режима в реальный. Нехитрый трюк позволяет модифицировать реальный режим так, что в нём становится можно обращаться ко всем четырем гигабайтам адресного пространства. Недокументированная, но вполне полезная и юзабельная в некоторых ситуациях фича. То есть, была полезной, когда кто-то ещё использовал для чего-то полезного реальный режим. Сейчас эта фича используется в основном в BIOS-ах, и то только из-за лени программистов.
Turbo-режим (и соответствующая кнопка)
Некоторые криворукие разработчики использовали частоту процессора для тайминга в своих приложениях, для совместимости с ними был запилен такой костыль, понижающий частоту ЦП до 4.77 мГц (как 8088). Лулз еще в том, что название кнопки противоположно ее действию. Особенность не самого процессора x86, а скорее самой платформы. Использовалась начиная с 286 и порой аж до 486 и первых Pentium, позже была предана анафеме, хотя кнопку можно было встретить и на более новых корпусах. Программные реализации применяются и ныне - ограничение скорости ЦП есть в DOSBox и VirtualBox.
SMM (System Management Mode)
Несмотря на «4-уровневую» систему колец защиты (от наиболее высокого 0-го уровня, где, по идее, работает менеджер Операционной системы, который имеет наиболее высокий приоритет до 3-го, наименее привилегированного), имеется еще один «надуровень» который имеет… еще более высокие привилегии! Точнее, это программный код который вообще никому не виден и который (когда процессор передает ему управление по сигналу #SMI) имеет полный и неограниченный доступ абсолютно ко всем ресурсам системы.
Более того, в архитектуре предусмотрен специальный бит, и если обработчик этого режима (SMI Handler) установит его, то OS даже если и сильно захочет, не сможет не то что блокировать его, но и даже прочитать!
Вообще, всё задумывалось как лучше — SMI-обработчик это на самом деле часть BIOS и управление ему передаётся по сигналу от чипсета при наступлении каких-то событий (например, запись в некоторые порты или сигнал о перегреве) совершенно прозрачно для операционной системы, за исключением потраченного на выполнение этого обработчика времени. То есть, BIOS обеспечивает поддержку или эмуляцию некоторых девайсов чипсета, освобождая ОС от необходимости делать это самой, что даёт нам шансы в старости снова увидеть DOS (да-да, там в 90% случаев было примерно так же: Onboard BIOS Extensions эмулировали сферовакуумное оборудование, а софт работал прямо с этим «оборудованием» без дров).
Хорошо? Хорошо, но не совсем: во-первых, для SMМ нужна поддержка в железе: в чипсете и в процессоре (аж целый специальный режим).
Во-вторых, SMI-обработчики беспардонно отнимают время у задач операционной системы, никак не прерываемы, не откладываемы и приходят ВНЕЗАПНО (прощай риалтайм, для которого x86 изначально был годен чуть менее чем никак).
В-третьих, факт наличия 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 был выпилен[4][5].
Система команд
Система команд x86 начиная с 8086 значительных изменений не претерпела, она просто все расширяется и расширяется добавлением новых костылей, постепенно превращаясь в один большой фракталоподобный костыль. Работа с 8-, 16-, 32- и 64-битными операндами и новые режимы адресации вводятся путем добавления префиксов или атрибутов сегмента, а число самих режимов скоро перевалит за 9000.
Длинный режим
Упомянутое выше архитектурное расширение до 64 бит представляет собой еще один режим работы, несовместимый с реальным режимом, но немного совместимый с защищенным. В этом режиме доступны шестнадцать 64-битных регистров общего назначения и Over 9000 адресного пространства.
Примечателен тем, что разработчиком этой архитектуры была AMD, в то время как Intel скопипиздила переделала технологию[6] (кое-что не доделав), изменив неполиткорректное вражеское название 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-битный. Такие дела.
VEX префикс
Революционная идея — выпилить старые костыли методом запила новых — пришла на ум инженерам 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-битный код многим было похуй). Нынче и то и другое весьма ценится у коллекционеров пруфлинк.
F00F bug
Одним из эпичнейших фейлов Intel была ошибка в процессоре Пентиум в реализации инструкции lock cmpxchg8b с регистровым аргументом (также известная как F00F bug, по первым байтам команды). Заключалась она в том, что любая пользовательская программа могла запросто завесить всю систему. По идее, любая операция с префиксом lock, не обращающаяся к памяти, бессмысленна, и пень это понимал. Но в случае команды cmpxchg8b он тупил, забывая снять блокировку шины, и подвисал после получения адреса обработчика прерывания, так как операции записи не происходило и опаньки. Для преодоления этой проблемы разработчикам ОС приходилось прибегать к нетривиальным изъебствам. Если у вас есть Pentium с ОС Linux вы можете увидеть при загрузке строки «FOOF bug detected, installing workaround», что означает, что вы обладаете бажным процессором Pentium. Фрюха тоже запускает воркараунд, обнаружив первопень.
Арифметический баг Pentium
—Сколько инженеров Intel нужно, чтобы заменить лампочку? |
Народное |
Кроме того, первые серии 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 такое поведение сторонних фирм негативно отражалось на доходах — гоп-фирмы как бы пользовались этим[7] и выходили в «плюс», а Intel соответственно, в «минус». Жадные до денег манагеры Intel, думали-думали и придумали — раз нельзя сделать циферки торговой маркой, то давайте наш абортарий будет давать имена высерам наших рабов-инженеров. И понеслось…
Народные названия компьютеров и процессоров
- IBM PC — по правде говоря, в тогдашние 80-е годы он почти всегда назывался Персональный Компьютер, с придыханием, ибо стоил в СССР дороже в два раза, чем новые Жигули;
- IBM PC XT — Эксти, Иксти, ХаТэ, Икстишка;
- IBM PC PS/2 — ПиЭс Пополам, Писипополам, P.S.:, Постскриптум, Полупись (по аналогии с полуосью — OS/2);
- IBM PC AT — Эйти, Айти, Айтишка, Эйтишка, А-Тэ, Атэшка;
- 286 — Двойка, Двушка;
- 386 — Тройка, Трешка;
- 486 — Четвёрка;
- Pentium — Пень, Пентюх, Пенёк, Первопень, Пент;
- Также Pentium-ы II, !!! и 4 в народе иногда именуются «Двойкой», «Трешкой», «Четверкой», уже забыв про их тезок-предков 80x86; или просто "пеньком" или пренебрежительно — писюком.
- Pentium Pro — Пропентюх, Пэ-про, Прошка;
- Pentium II — Пень два, Два пенька, Пэ-два, Тупень, Второпень, Второй пень, Двупень; Прим: В конце 90-х, когда процессор характеризовал уровень компьютера в целом, часто были недопонимания, когда говорили «У меня комп двойка (тройка, четверка)», и под этим мог иметься в виду как PII, так и 286.
- Pentium !!! (sic!) — Пень три, Пэ-три, Третий пень, Трипень, Тройка, Трёшка, "пятихатка" (если 500 МГц);
- Celeron — Селерон, Целерон (Целерон два), Целка, Целер, Кселерон, Целик, Селик, Селика, Сельдерей, Цэл. (Значительно реже: Келерон, Суслерон, Соплерон, Лохотрон, Дохлерон, Карлсон, Селекон, Саурон, Селика, Калорон, Затычка для сокета, заглушка для материнки, эмулятор процессора). Процессор с урезанным относительно старшего ядра функционалом, например кэш меньшего объема, и т. д.;
- Pentium 4 — Четвертый пень, Пэ-четыре, квадропень. Было их под одной циферкой аж 4 поколения:
- Первое Williamtte. Сокет 423, ничем непримечательно, "трешки" рвали их как грелку.
- Второе - Northwood. Появились где-то в районе ввода сокета "478 ног". Рулили и педалили. Выигрывали в большинстве задач у Prescott-ов хотя бы из-за удачности тепловыброса. Анонимусом замечены даже в ноутбуках (sic!)
- Третье - Prescott. В народе - Печка, Духовка, Scott-ина (до сих пор Linux на таком проце сразу при включении готов заорать "TEMPERATURE ABOVE THRESHOLD!!!").
- Четвертое - Cedar Mill, "сидор", "цезарь", "мель", 65-нанометровый апгрейд Prescott-а. Тепловыделение чуть ниже, но грабли те же.
- Prescott/Cedar Mill - лютый фейл штеуда: За каким-то хреном сильно растянут конвейер и добавлен второй виртуальный поток[8], в теории призванный увеличить производительность от 30% до 50% (в кукурузных тестах) по сравнению с однопоточным ядром. В итоге процессор получил очень сильно возросшее тепловыделение и энергопотребление, а во многих задачах из-за длинного конвейера люто сливал своему предшественнику. Еще один серьезный косяк Intel-а, допущенный при выпуске сабжа - слепая гонка гигагерцев: невообразимые тогда 3.4 ГГц у топового Прескотта на S478 и вплоть до 3.8 ГГц - на LGA775. В настольно-бытовом сегменте Prescott пришелся не ко двору, поскольку в 2005 году многопоточных приложений практически не было, а эта ваша любимая Windows XP сама распределять задачи между потоками практически не умела (фигли, выпущена в 2001 году, когда о пользовательских многоядерных системах и думать не могли), поэтому они либо тупо выполнялись на одном потоке, либо постоянно прыгали с одного потока на другой, но при этом занять одновременно оба потока было архисложно. В какой-то мере ситуацию спасает кэш L2, увеличенный до целого мегабайта, а чуть позднее - и до двух;
- Pentium D - ПечкаДэ. Первый честный двухъядерник для народа, впрочем проблема двухъядерности решена крайне радикально: два кристалла Prescottины/Cedar Mill под одной крышкой с соответствующим энергопотреблением и тепловыделением - ни много, ни мало, а заявлено 130 ватт, причем чтобы влезть в рамки оговоренного TDP, у Prescott-a пришлось урезать частоту вплоть до гигагерца (для топовых камней) и отрубить многопоточность к хренам; Cedar Mill, будучи несколько более холодным, лишился только многопоточности. Продолжение фейла образующих данный проц ядер, только в квадрате. Очень веселым квестом был подбор матери, способной без вреда для себя вдуть в сокет ток под 100 ампер.
- Celeron на ядре Tualatin (P3) — Туалерон, Целерон три;
- Xeon — Ксеон, Зеон, Ксенон, Неонка;
- Intel Core — Кора, Корка, Корь;
- Intel Core 2 Duo — Кор(е) два дуо, Коре Дует, Кора дура, Два дула, Двустволка, Кора дуба, Кора ясеня (Core 2 Duo E7xxx), Дупло, Конура (по названию ядра — Conroe), Интел Горо-д-в-а-ду;
- Intel Core 2 Quad — Квад, Квадро, Квадрик, Кор(е) два квад, Квадрат, Кора кедра; логическое продолжение Core 2 Duo, Intel пошла по пути создания Pentium D - так же запихала два кристалла под одну крышку, но на сей раз уже двухъядерные Core2Duo, в плане нагрева тоже получилась печка (TDP - те же 130 ватт), но хотя бы умеющая толково задействовать все потоки и снижать частоту в простое.
- Intel Core i7 — Кор(е) аи семь, и-семь, айс, кор топор, ай сэвэн, айседьмой, йаСемерко;
- Intel Core i5 — Кор(е) ай пять, айпятый, и-пять, ай-блять;
AMD:
- AMD Duron — Дурон, Дюрон, Лохотрон, Дурень, Дурка, Дурик, Дурдом;
- AMD Sempron — Затычка, Лохотрон, Косарь (цена 1000 рублей), Тормоз;
- AMD Athlon — Атлон, Аслон, Атхлон, Афлон, Эшлон (sic!). А так же: Печь, Утюг, Утюговый Атлон, Калорифер (Анонимус не забывает, что первые атлоны сильно грелись (ага-ага, смотря что с чем сравнивать — если 32 ватта у Tualatin 1400(Coppermine 1133) с 72 ваттами у Thunderbird 1400B(C) или Palomino XP 2100+, то, конечно, утюг, но если вспомнить про 100 ватт у Willamette 2ГГц (66 ватт у народных Celeron Willamette 1,7 ГГц) …).
- Athlon Thunderbird именовались Громокряками;
- AMD Athlon XP — Атлон Экс Пи, Атлон Ха Пэ, Икс пи, Атлон хы ры. По названию ядра Palomino: Палыч, Паламин, Палпатин; Thoroughbred: Срубред, Табурет; Barton: Батон, Бартик, Бартон, Батрон, Бартер; Thorton: Торт, Тортик, Тортон, Тхортон, Тортер;
- AMD Athlon 64 - на момент своего появления лютый вин по сравнению с Intel Pentium 4. Честное 64-битное ядро, позволяющее запустить 64-разрядные версии XP, Зависты и Семерки, холодный и гораздо более быстрый. Эволюционировал в Athlon 64 X2, отрастив второе ядро. Через пару лет после Интела AMD наступила на его же грабли, начав клепать процы с тупым наращиванием тактовой частоты. Особо "отличались" экземпляры начиная где-то с 4800+ и выше, тем, что на ходу жгли питающие фазы на материнках;
- AMD Phenom — Феном же, Фенол, Фен, Финик, Фенамин, Фенька;
- AMD Phenom II — оказались довольно таки меметичными, поскольку у процессора, урезанного по количеству ядер и/или кэшу L3, с определенной долей везения можно было запустить отключенные ядра и кэш. Надо отметить, что это не был аттракцион невиданной щедрости: AMD по началу отключала только бракованные блоки, т. е. 3 и 4 ядра в Phenom II x2 или кэш третьего уровня в Athlon II x4 могли работать нестабильно или не работать вообще. Была даже ситуация, когда из двух заблокированных ядер одно работало нормально, а второе - нет. Из маркетинговых соображений, чтобы занять пустующие ценовые ниши, AMD стала отключать ядра и кэш только на 2-3 год выпуска архитектуры K10, но к этому моменту Athlon II X3 и X4 получили новое ядро, изначально лишенное кэша L3, а Athlon II X2 вдобавок к кэшу L3 потеряли еще два ядра.
- AMD Opteron — Оптер, Опертон, Оптерон. Серверная версия, малодоступная быдлу, потому сохранила оригинальное название.
- AMD Bulldozer — он же Бульдозер, Трактор, Буль, Ковшик, Кукурузник. Порадовал нас всё-таки своим приездом ближе к концу 2011 года, хотя зарождался в недрах компании весьма давно. То ли ввиду слабости архитектуры, то ли ввиду неведомой скрытой
хуйнисилы, процессоры Bulldozer на фоне Sandy Bridge от Intel'а получились говном.(спойлер: На самом же деле проблема в том, что инженеры занимались не увеличением количества инструкций, исполняемых за 1 гц, а просто в каждом модуле физически продублировали обработчик. В результате чего 4-ядерный core работает шустрее, чемпочти8-ядерный бульдозер) - AMD Piledriver — Pile переводится как «свая», вероятно, имелся в виду кол в сердце Intel. По сути еще один бульдозер: все те же хиловатые спаренные ядра à la интеловский HyperThreading, однако теперь немного более продвинутые, что заметно в многопоточных приложениях типа 3ds max. На фоне флагманских моделей конкурента все еще выглядит бледновато, но привлекателен вдвое более низкой ценой.
Цитаты
В эту статью нужно добавить как можно больше Шуток про Pentium 1.99995758493. Также сюда можно добавить интересные факты, картинки и прочие кошерные вещи. |
Каждый следующий процессор от интел все более и более алиеноподобен по своей логике. К пентиуму людей в интел уже не осталось. |
Народное |
Процессоры бывают двух типов: интел и пентиум. |
Учитель информатики ФГОУ СПО ТСТ |
Отгрохал новый русский особняк. Позвал гостей. Водит, показывает - все в шоке - всё круто. И тут доходят до ванной, и один из гостей спрашивает: |
Народное |
Если Вам приспичило иметь PC, покупайте это. Я не буду пытаться отговорить Вас. Я просто отказываюсь рекомендовать изначально ущербные концепции (как аппаратуры, так и программного обеспечения). Я отказываюсь далее способствовать обогащению фирмы Microsoft. Микросхемы Intel убоги по своей сути, и ничего тут поделать невозможно. Такими они и были задуманы. На PC Вы сталкиваетесь с заранее запланированным убожеством каждые несколько лет -то новые программы не годятся для старой аппаратуры, то новая аппаратура не годится для старых прорамм… По какому же заколдованному кругу вы путешествуете, господа пользователи PC? Продолжайте выбрасывать деньги на более быструю аппаратную часть с каждой новой версией ОС и прикладных программ, которые становятся все более медленными и раздутыми. Единственное, на что остается надеятся, так это на то, что ваша техника когда нибудь будет работать, как Амига в 1987 году, да и то вряд ли эти надежды сбудутся… |
Читатель журнала ZX-Ревю, 1996 год |
Галерея ЦП
Примечания
- ↑ Линус начал писать лялекс именно на i386, когда заебался разгребать косяки minix. Кстати, поддержка этого процессора была полностью удалена из ядра только в 2012 году [1]
- ↑ Собственно, поэтому (а также по причине адской дороговизны оперативной памяти в те времена) подавляющее большинство материнских плат для двушек больше намертво запаянного в них одного мегабайта и не содержали.
- ↑ В последних зионах этот костыль таки выпилили, см. en.w:A20 line
- ↑ Пруфлинк. TSS теперь нужен только для хранения указателей стеков и карты ввода/вывода, но не для аппаратного переключения задач.
- ↑ Надо отметить, что все выпиленное в x86-64 продолжает жить в 16- и 32-битных режимах, усложняя и удорожая процессор. Именно поэтому (тепловыделение, цена) Intel Atom проиграет ARM-у в более чем 9000 рыночных нишах для мобильных процессоров. Ни одна современная 64-битная операционная система для платформы х86 не использует ни реальный режим, ни защищенный режим, ни перечисленные выше костыли (кроме исторически сложившейся системы команд). Все эти костыли и рудименты окончательно сдохнут только вместе с совместимостью с ранними моделями х86 и DOS-ом. Однако на данный момент (2010-й год) ни один из производителей отказаться от такой совместимости наглости (или дурости?) не набрался.
- ↑ Intel на тот момент уже использовала 64-разрядную архитектуру собственной разработки в опять-же своих ЦП Itanium. Но была она несовместима с x86 чуть более чем полностью.
- ↑ Условие диверсификации поставщиков CPU для IBM PC было обязательной частью сотрудничества Intel'a с голубым гигантом.
- ↑ Известно, что HP таки имела технологию виртуализации для Скотины, которая превращает весь компьютер в виртуальную машину, обеспечивая безопасность", так что модифицированый BIOS для материнок, реально использующий виртуальный поток, имел место быть
Ссылки
[ + ] Купи X86 со скидкой и получи подарок!*
|
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
X86 | геймеры знают, какое отношение имеет X86 к играм | [ MOAR ] [ ʘ ] [ + ] | ||||
|
|||||
[ + ] X86 — часть точного мира чисел
|
|||||||||
---|---|---|---|---|---|---|---|---|---|
|