LINUX.ORG.RU

Энтузиасты дизассемблировали микрокод i386 и создали открытый CPU z386

 , , , z386,

Энтузиасты дизассемблировали микрокод i386 и создали открытый CPU z386

6

7

Энтузиасты смогли успешно извлечь и дизассемблировать микрокод процессора Intel 80386, который из-за отсутствия документации считался «чёрным ящиком». Бинарный образ микрокода был воссоздан с привлечением AI по фотографиям кристалла в высоком разрешении, а логика работы разобрана через трассировку соединений на кристалле. Постепенно были определены структура микрокоманд (μ-ops), поля, порядок исполнения и маркеры конца инструкций. Наработки проекта опубликованы на GitHub как общественное достояние.

Выявлено, что в CPU 80386 каждая инструкция полностью исполняется через микрокод, в то время как в 8086 и современных процессорах часть инструкций обрабатывается напрямую. Кроме того, в отличие от процессоров 8086, в 80386 микрокод не реализует алгоритмы напрямую, а в основном настраивает аппаратные ускорители (умножитель, делитель, быстрый сдвиг, PTU (Protection Test Unit)).

В ходе исследования также была обнаружена возможная проблема с безопасностью при обработке битовой карты прав доступа к вводу/выводу (IO permission bitmap): при 4-байтовом обращении к портам проверялись биты прав доступа только для первых 3 байтов, а доступ к 4-му байту не проверялся, что теоретически допускало обращение к аппаратным регистрам, доступ к которым должен был быть запрещён.

На основе опубликованного микрокода разработан открытый CPU z386, реализованный на языке SystemVerilog и работающий с использованием FPGA. Вместо реализации каждой инструкции в форме отдельного RTL (wikipedia.org) (Register-transfer level) в z386 реализованы аппаратные структуры, которыми управляет оригинальный микрокод. Производительность подготовленной реализации соответствует быстрому 386 ПК (~70MHz). Под управлением z386 удалось успешно запустить DOS 6/7, DOS/4GW, DOS/32A и игры, такие как Doom и Cannon Fodder.

>>> Подробности на opennet

★★

Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от monk

Не совсем, это называется code versioning, и служит оно не для смены контекста, а для выполнения нескольких версий одного контекста, так называемый speculative execution. Spectr как раз эксплуатирует это возможность, где чужой контекст может получить доступ к версии другого контекста.

Кстати то, что Интел называет legacy compiler имело возможность спекулятивного исполнения нескольких версий контекста. Ну а после переключения на LLVM, всё стало «как у всех», то есть через жо.. плохо и недоделано, вобщем.

VIT ★★
()
Последнее исправление: VIT (всего исправлений: 1)
Ответ на: комментарий от kirill_rrr

Хорошая болгарка стоит условные 5000р. Так поему же китайская болгарка за 2800р, вторая снзу по цене, такая же качественная как и за 5000 или даже 7000?

В цене очень много себестоимости, а если у тебя большой поток, то и цена будет ниже. В этом суть китая - у них на начальном этапе уже миллиард потенциальных покупателей, т.е. старт производства уже обеспечен рынком, а там уже и на международный выйти можно. Это работает с любым товаром. Если бы у Байкала был готовый рынок в миллиард потенциальных юзеров, то и компы на его основе не стоили как подержанное авто.Любое мелкосерийное производство будет сильно дороже массового. Это закон экономики.

drfaust ★★★★★
()
Ответ на: комментарий от VIT

Спекулятивное выполнение и на Эльбрусе есть. Только оно явное и его в ассемблерном коде видно. А от спектра нормально только РБВ защищает.

monk ★★★★★
()
Ответ на: комментарий от monk

Здесь то же самое. Вопрос в том, как сказать компилятору на С «вот этот блок выполни спекулятивно, если такое условие не выполнено - откати назад».

VIT ★★
()
Ответ на: комментарий от VIT

Здесь то же самое. Вопрос в том, как сказать компилятору на С «вот этот блок выполни спекулятивно, если такое условие не выполнено - откати назад».

lcc (эльбрусовский компилятор) при оптимизации делает. А «если такое условие не выполнено - откати назад» делает процессор.

int* a;
…
if (a!=NULL)
{
  *a++;
}
…

превращается в

0     ld.s            Ra,     0 => Rx       ! чтение из указателя a
0     cmpe            Ra,     0 => p0       ! сравнение на равенство
3     add.s           Rx,     1 => Ry       ! инкремент результата чтения
4     st              Ra,     0 <= Ry ? ~p0 ! запись под предикатом не-p0

Спекулятивное чтение одновременно с проверкой на NULL. Если не NULL, тогда результат запишется, если NULL, то будет выкинут (и ошибка чтения проигнорирована).

monk ★★★★★
()
Ответ на: комментарий от watchcat382

А вот если бы ты взял детальки отсюда

https://expodat.com/companies/company/3459-npo-erkon.html

https://www.erkon-nn.ru/catalog/rezistory-obshchego-primeneniya/

https://www.mcu.mikron.ru/

https://www.angstrem.ru/?ysclid=mpib7mqb8701432710

https://fzmt.ru/

https://okbexiton.ru/pr_tr.php

https://meteor.su/

https://zavod-iskra.ru/production

и правильно спаяв оные для получения изделий превосходящих по качеству китайские был бы тебе тут почет и уважение, а так.к.п..х и т.д и т.п.!

saufesma ★★
()
Ответ на: комментарий от monk

Нет, это не спекулятивное выполнение, это условное выполнение. Спекулятивное выполнение - это одновременное выполнение нескольких версий программы над одним контекстом с коммитом только одного и откатом всех остальных. Можно это выполнение сериализовать, LLVM так и делает, думаю lcc тоже, поскольку он форк от LLVM.

VIT ★★
()
Ответ на: комментарий от VIT

Спекулятивное. Вот почитай п. 6.3.4: http://elbrus.ivk.ru/pub/docs/elbrus_prog/html/chapter6.html

Все версии запихиваются в пустые места широких команд, но в спекулятивном режиме. Когда выясняется, какая именно версия нужна, её результат используется.

monk ★★★★★
()
Ответ на: комментарий от VIT

Так в VLIW одновременное выполнение каких-то штук явно в асме просто указывается, а не процом придумывается.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Да. ld и add нормальное, ld.s и add.s спекулятивное.

monk ★★★★★
()
Ответ на: комментарий от firkax

Нет. В инструкции указывается, какие опкоды можно «issue» одновременно. После этого они поступают на decode и направляются на execution pipeline, откуда они «dispatch» на один из исполнямых конвейеров. Всё намного сложнее.

VIT ★★
()
Ответ на: комментарий от VIT

Кстати, мы неявно пришли к простому определению - что такое VLIW-архитектура. VLIW-архитектура - это микропроцессорная архитектура, в которой одна команда может содержать больше одного опкода. В суперскалярной архитектуре каждая команда содержит только один опкод. При этом ассемблерная команда, опкод, и микрооперация - всё не одно и то же. Ассемблерная команда - это одна запись программы на языке ассемблера. Каждая команда компилируется ассемблером в последовательность опкодов. Одна ассемблерная команда может быть, а может и не быть одним опкодом! Дальше decoder переводит опкоды в микрооперации. В этом обсуждении мы как раз и должны этот процесс обсуждать, так как это частично делается аппаратным декодером, а частично - микрокодом, который великие хаккеры расшифровали. И только микроопрерации собираются диспетчером и направляются на правильный исполнительный конвейер. Ну как то так в теории и в тех процессорах, что я видел. Сила VLIW - увеличение ILP - instruction-level parallelism, потенциал для большего количество независимых микроопераций, а значит лучшего заполнения конвейера.

VIT ★★
()
Ответ на: комментарий от VIT

Но фактически ведь именно в асме указывается в какой такт какую команду запустить. И она в любом случае именно в этот такт запустится.

monk ★★★★★
()
Ответ на: комментарий от monk

Нет, это абсолютно неверно. Читайте мой опус прямо выше вашего сообщения, чтобы понять, почему это не так. Сделать правильный тайминг микрокода, это покруче Фауста Гёте будет.

VIT ★★
()
Ответ на: комментарий от monk

И она в любом случае именно в этот такт запустится.

А вот здесь и появляется новое понятие «out of order execution» :).

VIT ★★
()
Ответ на: комментарий от drfaust

Только комплект «обслуги» был нифига не полным. Не было котроллера floppy дисковода и жёсткого диска. Для поиск-3 (который сам по себе мифический) что-то такое сляпали, но у единственного, Н.Я.З, найденного экземпляра не было рабочего BIOS, а без него это всё в пользу бедных.

lenin386 ★★★★★
()
Ответ на: комментарий от VIT

Сила VLIW - увеличение ILP - instruction-level parallelism, потенциал для большего количество независимых микроопераций, а значит лучшего заполнения конвейера.

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

С другой стороны, у процессора есть текущие значения. Если классический Си Эльбрус оптимизирует намного лучше, чем Интел и даже аппаратная проверка границ практически не уменьшает производительность, то когда прилетает что-то вроде f()->g()->k(), то Интел после первого выполнения запоминает адреса переходов и начинает по ним читать вперёд. В Эльбрусе до вызова f() готовить переход к g рано (выполнение f затрёт все три регистра перехода), а после вызова f до вызова g ничего нет. Хорошо, если после этого крокодила есть что-то ещё. Или хотя бы функции достаточно большие, чтобы потеря десятка тактов на вызов была несущественной. Но вот виртуальную машину Java пришлось из-за этого чуть ли не с нуля переписывать, чтобы всюду, где можно, был фиксированный адрес перехода.

monk ★★★★★
()
Ответ на: комментарий от GAMer

Вообще то двухканальная, ддр5 сочетает 2 канала в одном. И эти чипы одноканальные чтобы удешеветь iod и сокет, они же гордые наследники N100. С учётом дискретной видеокарты и нпу, разумеется они упрутся в шину памяти. Даже 4 Е-ядра в N100 из за одноканальной памяти работают как 2 с копейками. А если скайрим запустить - совсем печально становится.

kirill_rrr ★★★★★
()
Ответ на: комментарий от VIT

Я про VLIW. Здесь каждая операция имеет точное время выполнения в тактах. И в ассемблере можно явно указать, на каком такте читать результат операции.

Кстати, даже промах кэша можно обрабатывать. Есть rbranch = переход, который выполняется, если ожидается чтение из памяти.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от lenin386

Был ЕС-1849 на интеграловском клоне 286го. Так же были ЕС-1863 на 386SX (эти я видел и сидел за ними вживую). Ещё был ЕС-1864 на 486DX2, но его я видел только один раз на витрине магаза, постоял, пооблизывался, глянул на ценник и грустный ушёл восвояси...

drfaust ★★★★★
()
Ответ на: комментарий от VIT

Если каждое из них используется на 70% это было бы шикарным показателем и однозначно стоило того огорода. Я не верю что производители чипов дураки и напихали ядер больше, чем это даёт заметного роста производительности. Иначе было бы проще накидывать сотни 8-ядерных плат и хостить на них не 96 а вссего 2-4 виртуалки или контейнера.

kirill_rrr ★★★★★
()
Ответ на: комментарий от monk

С одной стороны, у компилятора больше контекста … С другой стороны, у процессора есть текущие значения …

Я не сомневаюсь, что вы слышали Бабаяна, может даже лично.:) Споры о том, как надо ведутся с середины 80х. С практической точки зрения создание микроархитектуры - это борьба компрмиссов.

Интел после первого выполнения запоминает адреса переходов и начинает по ним читать вперёд.

Это называется «list prefetcher», кстати этот список можно создать заранее, не нужно «обучать» префетчер ценой первых cache misses.

выполнение f затрёт все три регистра перехода

для этого есть блок, который позволяет выполнять code versioning, фактически это реализуется совместно со speculative execution, но нельзя делать версии в спекулятивном коде (очевидно, конфликт аппаратуры).

чтобы всюду, где можно, был фиксированный адрес перехода.

Вот для этого и придуманы сегменты, и именно чтобы это было, я предпочитаю 16-битный оффсет от базового начала сегмента.

VIT ★★
()
Ответ на: комментарий от VIT

Атом - максимально порезанный проц. Они хвалились микроскопическим для того времени транзисторным бюджетом и способностью ядра уходить в сон на 98-99% потребления. Никаких других достоинств у него не было. Так что да, он не видел что бы там можно выполнить одновременно. Кстати, тогда 2 инструкции за такт уже было дном, сохраняющимся только на дешёвых армах.

kirill_rrr ★★★★★
()
Ответ на: комментарий от monk

Я про VLIW. Здесь каждая операция имеет точное время выполнения в тактах. И в ассемблере можно явно указать, на каком такте читать результат операции.

Мне кажется мы расходимся в определениях. Что такое «операция» в ваших терминах? Ассемблерная команда - это не одна операция. То какими определениями оперирую я, я описал здесь

https://www.linux.org.ru/news/hardware/18300992?cid=18302535
VIT ★★
()
Ответ на: комментарий от Somebody

Да примерно дял того же, для чего реверсить оригинальный 80386. Только проще.

Кстати, ходили слухи что на всяких нвидиях на куда-ядрах можно запускать и обычный код для цпу и за счёт 1000-10К ядер на карту суммарная производительность будет впечатлять.

А ещё есть мнение, что примитивный in-order процессор может не тратить энергии на лишние операции, а просто исполнять инструкции как они есть. Медленно, но дёшево. Возможно дешевле чем все эти хаки с огромными кешами и перекомпиляцией на лету.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от lenin386

Не было котроллера floppy дисковода и жёсткого диска.

Это уже не обслуга, а периферия.

найденного экземпляра не было рабочего BIOS,

https://red-innovations.su/index/photos_c/ec/100_4399.jpg

https://red-innovations.su/index/photos_c/ec/20150216_085356.jpg

drfaust ★★★★★
()
Ответ на: комментарий от kirill_rrr

Я не знаю, что вам на это ответить. Вы говорите терминологией ученика ПТУ, а я являюсь разработчиком микроархитектур с тремя десятками лет стажа. Нам нужно согласовать определения, исключить фразы типа «порезанный», «микроскопический», «дно», «дешёвые армы», тогда мы сможем вместе определить особенности и технические решения в основе архитектуры Atom, но самое главное - её основную цель создания и таргеты. Уверяю вас, ядро SilverMont все таргеты достигло. Верить или не верить - дело ваше.

VIT ★★
()
Ответ на: комментарий от madcore

Уже знаю. Просто были ЕСки на ентих процессорах и подумал, что тоже интеграловские. Интеграл остановился на 286м.

drfaust ★★★★★
()
Ответ на: комментарий от drfaust

КА1847ВМ286 с полным комплектом «обслуги». Только на двойке они и остановились...

А ты внимательнее посмотри на свою же ссылку. Там есть фото отдельных чипов из советского аналога 286-го комплекта, но нет фото самого КА1847ВМ286! Даже на фото процессорной платы «Процессорная плата ПК ЕС1849, чипсет КА1847 установлен для примера, компьютер с ним полностью работоспособен» приглядевшись видно, что там стоит 286-й производства Siemens. На материнской плате Искра 1040 стоит 286-й от AMD. Ниже есть фото ГДР-овского U80601, а вот фото советского 286-го нигде не видно. Он так и не пошел в серию.

praseodim ★★★★★
()
Ответ на: комментарий от VIT

И как это всё опровергает явное указание спекулятивных действий? Спекулятивные инструкции в x86 тоже декодятся итд.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от drfaust

Это уже не обслуга, а периферия.

Это не периферия. Периферия - это сам флоппи. А поддержка контроллера должна быть интегрирована в BIOS, такова концепция IBM PC. Иначе, оно и не загрузится (что и имело место быть в Поиск-3, единственной найденной). Вот этой работы сделано не было. И это нифига не простая работа.

https://red-innovations.su/index/photos_c/ec/20150216_085356.jpg

Это всё американское железо с матрёшками в виде шильдиков. Указанные тобой изделия были выполнены на зарубежных микросхемах. Например, контроллер floppy и IDE у ЕС-1849 - Intel 82077AA, просто флоппи - Intel 82072A. И Bios тaм AMI. Это всё не фигня, сложность такого контроллера - ~половина процессора того времени, если не больше. Тест памяти под хохлому - хорошо, но это всё не тот уровень.

lenin386 ★★★★★
()
Последнее исправление: lenin386 (всего исправлений: 9)
Ответ на: комментарий от drfaust

Ну, если вернуться по теме назад - именно с этого и начинали. Китай может сделать процессоры хуже США/Тайваня, но он сделает их дешевле. И перетянет одеяло на себя.

А конкретно с болгарками - я понимаю как так могло получиться. Наверняка один и тот же конвеер льёт и точит детали и для Боша, и для ноунеймов хватает. А детали в принципе одинаково качественные! Возможно вообще одни и те же.

kirill_rrr ★★★★★
()
Ответ на: комментарий от firkax

Никак. Спекулятивное выполнение к первоначальной тезе «Так в VLIW одновременное выполнение каких-то штук явно в асме просто указывается, а не процом придумывается.» не имеет никакого отношения. Первоначальная фраза просто неверна.

VIT ★★
()
Ответ на: комментарий от kirill_rrr

Уверяю вас, ядро SilverMont все таргеты достигло

Все кроме главного - получить энергоэффективный процессор.

Можно об этом поговорить, почему нет? Начнём с начала - что вы называете «энергоэффективный процессор». Чтобы сразу говорить техническими терминами, введите ваше понимание, что надо мерить, как это делать, и какой параметр должен достигать какого значения для того, чтобы процессор-under-test являлся по вашему определению «энергоэффективным».

VIT ★★
()
Ответ на: комментарий от VIT

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

Вот моё понимание и определение. Если вы с этим не согласны, введите своё.

https://www.linux.org.ru/news/hardware/18300992?cid=18302535
VIT ★★
()
Ответ на: комментарий от VIT

Там определение VLIW, а не определение спекулятивного исполнения. Насколько корректно определение VLIW я оценить не берусь, но про него спора не было.

Впрочем, вижу там некоторую разницу с тем что пишет monk. monk уточняет, что, по крайней мере в Эльбрусе, VLIW это не просто распараллеленое раскидывание задач по конвеерам, а синхронное распараллеленное раскидывание.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от praseodim

КА1847ВМ286

Там уже всё на драгмет попилили. Это раритеты. Тебе обязательно фоточки нужны? Может ещё по почте этот редкий экземпляр переслать? Тем не менее переход на 1.5 мкм был сделан в 1989 году с появлением КР1847ВМ286, копией i286, а в 1991 году перешли на 1 мкм — Л1876ВМ1 (i386). Тогда СССР уступал конкурентам по тех. процессу только в 1.3 раза. Это был лучший результат за всю историю России/СССР.

В ответ на пруфы ты не привёл ни одного антитезиса, кроме голословного «всё пропало я не верю».

И да, насчёт «тройки» https://ic-info.ru/mikroskhemy/16422/

drfaust ★★★★★
()
Последнее исправление: drfaust (всего исправлений: 1)
Ответ на: комментарий от monk

Спекулятивное. Вот почитай п. 6.3.4: http://elbrus.ivk.ru/pub/docs/elbrus_prog/html/chapter6.html

Не могу зайти. The site cannot be reached.

Сколько версий можно выполнять одновременно и разделяют ли версии код или спекулятивный код разный для каждой версии?

VIT ★★
()
Ответ на: комментарий от firkax

Если я вообще правильно его понимаю, в Эльбрус то, что в других процессорах назыавется decoder вынесено из процессора вообще. То есть декодирование выполняется на уровне ассемблера. Можно и так, так давно не делают из-за сохранения совместимости с предыдущими архитектурами, но это существенно упрощает scheduling в железе и усложняет в ассемблере. То есть ассемблер - это не просто декодирование опрератор ассемблера - опкод, а ещё и размещение опкодов в поток или потоки.

Правда здесь тоже не понятно. Он говорит, что ассемблер не занимается распределением порядка инструкций. То есть, как в ассемблере напишешь, так и будет. Это типичный in-order. Ну здорово, последний раз я такую экзотику видел в IBM Power 6 очень давно.

а не определение спекулятивного исполнения.

Тогда это

https://www.linux.org.ru/news/hardware/18300992?cid=18302496
VIT ★★
()
Последнее исправление: VIT (всего исправлений: 3)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.