LINUX.ORG.RU

Легендарный Intel 4004 покоряет Linux спустя 50 лет

 


1

2

В 2024 году группа энтузиастов успешно запустила Linux на первом в мире микропроцессоре — Intel 4004, выпущенном в 1971 году. Этот 4-битный процессор с частотой 740 кГц и производительностью 60 тысяч операций в секунду стал основой эксперимента, демонстрирующего впечатляющий прогресс вычислительных технологий.

Процесс загрузки Linux занял более 8 дней, что вполне ожидаемо с учётом ограничений 4 кбайт оперативной памяти и минимальных возможностей чипа.

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



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)

Как они засунули эмулятор 32-бит проца и драйвер внешнего хранилища для эмуляции большой памяти в 4кбайта 4-битного кода? Ссылку ещё не читал если что.

firkax ★★★★★
()

Остаётся добавить, что некоторые дистрибутивы Линукс недалеко ушли по скорости загрузки даже на современном железе.

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

Гетзефактс со стороны Линукс: наша ОС настолько сурова, что умеет запускаться на 4004.

Что может предложить в ответ Windows 12 Embedded?

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

Сделали эмулятор архитектуры mips и на нем уже линукс запускали. в итоге это работало мегамедленно, но работало.

mikes
()
Ответ на: комментарий от DjangoPyDev

Эмодзи небинарной какашки, конечно же

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

Зачем ты кусок моего вопроса в качестве ответа на него пишешь?

firkax ★★★★★
()

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

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

Подробностей в статье маловато, написано, что внешнюю память навешали, и сд карту. Внешнюю памать, видимо, люто банкирует эмулятор, который должен, если проц правда только 4К адресовывает - сам умещаться в 2К, а остальные 2К банкировать, например. Как я понял, там эмуляция только проца, а драйвера они делали линуксовые, чтобы железо не эмулировать. Может быть эмуляцию мипса+работу с сд картой на асме и можно в пару Кб уместить, в общем, ребята явно постарались. :)

anonmyous ★★
()

Вот нормальная ссылка на первоисточник: https://dmitry.gr/?r=05.Projects&proj=35.+Linux4004

Откуда взялась «группа энтузиастов» - непонятно, в блоге повествование ведется исключительно от первого лица.

melanogaster
()

Шесть дней Бог создавал мир, на седьмой день отдыхал, а на восьмой загрузился Linux. И сказал он «о, клёво, в нетхак поиграем, чертей давить»

alt-tab-let ★★
()

Легендарный Intel 4004 покоряет Linux спустя 50 лет

50 лет - это время, сколько туда суммарно Слаку ставили? Судя по загрузке 8 дней.

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

Как я понял, не особо всё влезло в 4к, два банка ПЗУ по 4к. Эмулятор 32бит ЦП влез в 4к, но ОЗУ для содержимого регистров отдельно.

mky ★★★★★
()

640 килобайт хватит каждому датацентру.

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

Ну в описании есть такое:

Since I planned to use a paravirtualized disk driver for Linux, the only peripherals I would really need to emulate would be: the DEC bus fault reporter (reports bus fault address), DZ11 (serial port), and DS1287 (real time clock and timer).

Нет в его ядре линукса ничего, связаного с 4004. Публике представлен эмулятор эмулятора DECstation2100.

mky ★★★★★
()

Кстати, я так и не понял что там было в качестве эмуляции именно вот мегабайтов ОЗУ чтобы иметь возможность хотя бы даже распаковать ядро

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

SPI PSRAM, сначала один, потом два чипа, от 4 до 16 МБайт в сумме.

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

Как они засунули эмулятор 32-бит проца и драйвер внешнего хранилища для эмуляции большой памяти в 4кбайта 4-битного кода?

Эмулятор можно хоть в счеты засунуть. Рассчеты просто очень медленные будут. Тебя можно эмулировать китайской комнатой, ты в курсе?

slackwarrior ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

О, месье знает толк в извращениях :)

Спасибо что напомнили про Сетунь.

blex ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

В смысле «оживить»? Начать делать эмулятор, или у вас в подвале последний экземпляр Сетуни стоит?

mky ★★★★★
()

А кто запустит Линукс на Электроника МК 52?

DjangoPyDev
() автор топика
Ответ на: комментарий от mky

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

Не, у меня нету :) А вот эмулятор можно сделать. Вот бы программки найти, есть где скачать их? Хотя они наверное в виде аудио пшшш0пипи-кхххррр-пипипи-пшш-пипуп, но это не проблема. Может кто потом на транзисторах серии КТ спаяет Сетунь, а вместо барабанов, можно просто плеер использовать.

Есть целый указатель на программы

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

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Vilicus

на рабочем столе кассового аппарата

А если вдуматься в смысл... ;) :))

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

Я думал что 4кб там честные, а если надо расширять то свап на диске и соответственно надо драйвер диска. Ну если банки памяти легкопереключаемые то может быть, но это не так интересно.

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

У 4004 банки памяти шатно (просто) переключаемые у ОЗУ, до 7 банков по 320 бит, из которых 256 «нормальные». Без переключения банков ОЗУ там никуда, один банк занимается регистрами MIPS целиком.

Эмулятор процессор он уместил в 4к, а остальной код не влазил, поэтому и было переключение банков. Переключение схемотехникой, записал в регистр вывода бит и стали команды выполнятся из другого банка с этого же адреса. Всё одно, по оригиналу нужно было для 4кбайт у Интела заказывать 16 м/с 4001, которые на заводе и прошиваются. Но Интел уже не делает их :)

ИМХО, для тех времён всякие подобные схемотихнические хаки с памятью были вполне нормальны, там и ПЗУ на ОЗУ могли переключать...

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

Ну настоящий UART DZ11 (плата на шину UNIBUS) к 4004 сложно воткнуть. У 4004 просто не хватит частоты, чтобы формировать/обрабатывать сигналы шины. UART, как я понял, собран аппаратный, с FIFO, чтобы байты при вводе с клавиатуры не терялись.

А с RTC другая история, у Дмитрия в эмуляторе фейковое время, иначе у операционки может съхать крыша — между несколькими машинными инструкциями MIPS проходят минуты. В описании что-то такое написано, что ядро не в курсе, что система загружается 7 дней, ядру кажется, что быстрее :)

mky ★★★★★
()

Легендарный Intel 4004

Где почитать легенды о нём? А то я про него, кажется, даже и не слышал. Может и слышал, конечно. Даже скорее всего. Но точно не помню.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

А что по этому поводу собираются предпринять в NetBSD?

KOHb-TPOJIJIbJIEP
()

Где-нибудь есть полноценное описание, на русском, того, как на 4-х битном процессоре с адресуемой памятью 4 килобайта (команды) + 1280 байт (данные) запускают 32-х битные системы пусть и с помощью эмулятора, который работает на этом процессоре?

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

ядро не в курсе, что система загружается 7 дней, ядру кажется, что быстрее :)

Прям как тот космонавт, что летит со скоростью света и не знает, что он миллион лет уже летит. :) И кто то еще не верит, что мы в симуляции живем? Ой… не тот форум. :)

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

Я нашел что там делал автор. Он на Intel 4004 эмулировал MIPS R3000, причем подключал чипсеты работы с памятью - микросхемы 4008/4009, дальше за ними стояла память, в которой были таблицы перехода на подпрограммы, отвечающие за каждый опкод. В Intel 4004 есть 16 регистров, 8 из них использовались для хранения полной выполняемой MIPS-инструкции, а 8 оставшихся - для дел насущных. Карточка SD подключалась через SPI, на ней нет файловой системы, работа идет только с банками плюс адресуемость просто по номеру байта.

https://dmitry.gr/?r=05.Projects&proj=35. Linux4004

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

Почему MIPS

Конечно, Linux не может и не будет загружаться на 4004 напрямую. Нет компилятора C, ориентированного на 4004, и его невозможно создать из-за ограничений архитектуры. Объем адресуемого ПЗУ и оперативной памяти также просто слишком мал. Итак, как и раньше, мне пришлось бы прибегнуть к эмуляции. Моей первоначальной целью было уместить 4 КБ кода, поскольку именно с этим может справиться немодифицированный 4004 без посторонней помощи. 4 КБ кода - это совсем немного для эмуляции полной системы. После изучения вариантов стало ясно, что здесь победителем будет MIPS R3000. Любую другую архитектуру, которую я рассматривал, было бы в той или иной степени сложнее эмулировать. Некоторые архитектуры постоянно имели произвольно сдвинутые операнды (ARM), у некоторых были дерьмовые режимы адресации, требующие, чтобы они были медленными (RISCV), некоторым потребовалось бы более 4 КБ даже для декодирования инструкций (x86), а некоторые были просто слишком сложными для эмуляции в таком небольшом пространстве (PPC). ... итак ... Снова MIPS...!

Начало

Я начал с эмуляции только центрального процессора, чтобы оценить, сколько места это займет и поможет мне оценить осуществимость проекта в целом. Поскольку я впервые программировал на ассемблере 4004, я не представлял, насколько плотным будет код. Изначально я пропустил работу с оперативной памятью и просто предположил, что «текущая» инструкция MIPS будет находиться в r8: r9: r10: r11: r12: r13: r14: r15 регистрах MSB-to-LSB. Да ... половина регистров используется только для хранения инструкции. Я рассматривал возможность использования памяти для этого, но значения нужно было бы использовать разными способами во многих местах во время декодирования, так что это оказалось бы более запутанным. Кроме того, у меня все еще оставалось 8 регистров, то есть на два больше, чем когда-либо было у x86! Конечно, «предположим, что инструкция заканчивается в регистрах» не поддается тестированию, но это еще не было целью. Первоначальная отправка (на основе 6 верхних битов инструкции) в таблицу безусловных переходов из 64 элементов (128 байт) потребовала 13 инструкций, включая JIN, на которую она заканчивается. Итак, 128 + 13 байт только для этого. Это уже 3,4% всего пространства кода, которое у меня было. Не самое лучшее начало. Для декодирования кодов операций верхнего уровня 0 и 1 каждому требуется еще одна вложенная таблица. В одной таблице будет 32 записи, а в другой - 64. Им потребуется 12 и 14 инструкций соответственно для вычисления цели перехода. Таким образом, после того, как мы более или менее обработали большую часть декодирования, мы использовали 128 + 128 + 64 + 13 + 12 + 14 = 359 байты кодового пространства. Это более 1/12 всего пространства кода, и мы еще даже ничего не выполнили. Да... Конечно, примерно в этот момент я понял, что этот проект будет сложнее, чем я ожидал. Но мы не сдаемся!

MIPS имеет 32 видимых пользователем регистра, из которых первым является нулевой регистр, записи в который игнорируются. 32x 32-разрядных регистра - это 1024 бита состояния регистра. Это 256 nibbles, которые в 4004-land представляют собой один полный банк оперативной памяти. Итак, у нас есть: банк 0 будет иметь состояние регистра MIPS. В MIPS есть слот задержки, поэтому в дополнение к PC нам также необходимо сохранить NEXT_PC, чтобы мы могли правильно обрабатывать ветви и слоты задержки за ними. Поскольку ПК не является частью общего банка из 32 регистров, на эти два приходится еще 16 единиц памяти (в банке 1). Для преобразования памяти в MIPS есть TLB (подробнее об этом здесь), где каждая запись имеет длину 8 байт и всего 64 записи. Это заняло бы 4 полных банка памяти. И для доступа к SD-карте нам понадобится буфер размером как минимум с сектор (512 байт), который также представляет собой 4 банка памяти на 4004 земле. Итак, нам нужно как минимум 10 банков памяти‽‽‽ Не получится! Помимо 4 банков, 4004 нужны дополнительные чипы; кроме 8 банков, мы бы жульничали. Должен быть другой способ! Я решил обсудить эту проблему и позже.

По мере того, как я продолжал писать эмулятор, память кода быстро заполнялась. Большинство вещей требовали много операций, много циклов. Некоторые вещи были очень сложными из-за способа работы 4004 и отсутствия флагов состояния. Особенно сложно было обнаружить переполнение со знаком. И, конечно, умножение 32x32-> 64 было огромной проблемой. Подписанный вариант был еще сложнее. Я был очень рад, когда все закончилось, по крайней мере, был до тех пор, пока мне не пришлось внедрять division. В некоторых случаях 32-разрядное разделение со знаком может занимать до 80 000 циклов команд благодаря необходимости работать только с фрагментом за раз и конструкции ISA 4004. На выполнение деления в реальном времени уходит почти секунда. Осознание этого натолкнуло меня на идею отобразить PC с помощью светодиодов, к которой я вернусь позже.
Логические операции

Я никогда раньше не видел процессора, которому не хватало способности выполнять базовые логические операции, пока не увидел руководство 4004. 4004 не способен выполнять ни одну из них. Здесь нет логического AND, нет логического OR и нет XOR. Intel с готовностью предоставляет примеры кода в своем руководстве по программированию 4004 для реализации этих логических операций в nibbles, но я смог создать более компактные и быстрые процедуры. Тем не менее, для этого требуются десятки циклов ДЛЯ КАЖДОГО откуса! Как это вообще можно сделать? Обратите внимание, что если бы мы выделили бит из каждого операнда в младший бит регистра (старшие равны нулю), а затем добавили эти регистры, пока флаг переноса входных данных равен нулю, бит результата 1 был бы старшим только в том случае, если оба бита входных данных были единицами (И). Бит результата 0 был бы большим, только если бы биты входных данных отличались (XOR). Если бы мы выполнили сложение с переносом входных данных, равным единице, бит результата 1 был бы большим, если бы любой из входных данных был единицей (ИЛИ). Это базовый строительный блок для реализации логических операций в 4004. Остальное зацикливается и меняется! И потом, вы помните, что длина каждого регистра MIPS составляет 32 бита, и на выполнение всего этого за бит уйдет множество циклов!

В дополнение к обычным подозреваемым И, OR и XOR, в MIPS также есть NOR. К счастью, его легко вычислить аналогичным способом. Можно спросить, есть ли способ ускорить это, используя какую-то справочную таблицу? Да, но таблица с 256 записями составляет 1/16 доступного пространства кода. Три такие таблицы равны 3/16. Слишком много места для кода в проекте, где я не был уверен, что смогу даже вписать код как есть. Итак, эта идея была отложена.

Сдвиги

MIPS имеет обычный набор сдвигов: влево, арифметически вправо и логически вправо. Они могут быть на фиксированную величину (закодированную в инструкции) или переменную величину (берущуюся из регистра). Вторая часть этого тривиальна, мы можем найти нужный регистр и прочитать его значение. В эмуляторе все сдвиги происходят на переменную величину от 0 до 31. Опять же, 4004 делает это довольно сложным. Единственные сдвиги, которые у него есть, - это сдвиги на единицу через флаг переноса. Итак, чтобы сдвинуть 32-битное значение на один бит, нам нужен цикл с 8 итерациями. Таким образом, чтобы сдвинуться на N бит, нам нужно будет запустить этот цикл N раз. Это становится довольно медленным, не так ли? Но подождите, это еще не все. Арифметический сдвиг вправо требует, чтобы новый MSB был таким же, как предыдущий MSB. В 4004 отсутствует простой способ сделать это, поэтому для настройки этого на каждой итерации требуется несколько дополнительных инструкций. Таким образом, сдвиги происходят медленно, и они становятся медленнее по мере того, как вам нужно сдвигать больше битов. Можно было бы придумать множество умных способов оптимизировать это, но я прежде всего оптимизировал размер кода!

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

Я думал, что я знаю, что такое мазохизм... Но нет, до сих пор я не отдавал себе отчёта в масштабах этой проблемы!.. :))

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

автор(цитаты) крут!

эмуляция «форт»(точнее косвенного шитого кода) ядра а уж на нём Линуха - это задача для Беларда

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

как пруф оф концепт круто

есть куда улучшать

ззы: т.е подобно uspd-system вопросы эмуляции тогда очень прорабатывали - на тот же(али нет) Таненбаум в своем очередном кирпиче показывал цепь машин как расширение предыдущей где следующая это «эмуляция» посредством железа,микрокода,трансляции на(в) хосте предыдущей машины

зззы:

т.е задача пуска Linux данного в С-сырцах и «чутка» асма это вопрос синтеза компилятора ( например через модно-молодёжный LLVM) - который захинтен пипхолами под i4004 - имхо в 1 день загрузку уложить

qulinxao3 ★★
()
Последнее исправление: qulinxao3 (всего исправлений: 2)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.