LINUX.ORG.RU

linux-0.01 скомпилированный в minix-386 и запущенный в эмуляторе 86box

 , linux-0.01, ,


10

1

Я люблю старые программы, мне нравится их изучать и смотреть как они развивались, и во что они сейчас превратились или умерли так и не дожив до современных дней. И по той же самой причине, мне нравится смотреть различных авторов Youtube каналов посвященные ретро тематике в котором авторы рассказывают о корнях программ, игр, приставок или старых компьютерах. И на волне этого, мне захотелось попробовать собрать и запустить, что-то относительно старое, но которое живет и развивается до сих пор. Мой выбор пал на первую версию Linux, версии 0.01.

Те кто знаком с историй создания Linux и её ранних дней, знают, что она писалась Линусом Торвальдсом на 386 машине на которой работала пропатченнная версия Minix 1.5. И не смотря на, то, что есть проект (и не один) позволяющий скомпилировать linux-0.01 на современных версия компиляторов мне же хотелось побыть немного в шкуре самого Линуса и самому собрать ядро в ее родной среде, а именно в Minix и древними версиями GCC.

Те, что интересуется подобной историей (да или просто пользуются гуглом), знают, что такое уже проделывали многократно (посмотрите хотя бы сайт oldlinux.org), но я хотел сделать это всё сам. И вот вооружись энтузиазмом, эмулятором 86Box, старыми версия ПО (многие их которых взяты с вышеупомянутого сайта), а главное ядра Linux, я пошел по стопам Линуса, ну или почти по стопам… :)

Первым делом необходимо было установить классический 16-битный Minix 1.5.10 (верхний левый скрин). При наличии дистрибутива (17 дискет), а также Reference Manual делается это не сложно. Просто необходимо внимательно читать manual Танненбаумана. Единственное замечание по установке в эмуляторе 86Box, так это то, что необходимо в настройках эмулятора (и BIOS) выставить тип 360к для 5 1/4 дисковода, иначе Minix сможет грузится с загрузочной дискеты, но root’овую уже не увидет.

Далее необходимо очень внимательно следовать прекраснейшему руководству от Джона Наллома по превращению в minix-386. На этом этапе каких-либо подводных камней нет (опять же внимательно читаем), единственное необходимо установить тип 1.2M для 5 1/4 дисковода. Также необходимо будет перекомпилировать все бинарные файлы в /bin и /usr/bin. В самом руководстве Джон компилирует только часть их них (сам Брюс Эванс в README на bcc писал, что достаточно только sh :) ). Я же перекомпилировал почти всё.

Затем качаем и ставим готовый компилятор GCC 1.37.1 от Alan W Black’а. Нужно как минимум 3 архива с самим gcc, библиотеками и заголовочными файлами. Главное, ОБЯЗАТЕЛЬНО, необходимо пропатчить ядро Minix (kernel) иначе при компиляции ядра Linux, получите сообщение, что-то типа fp stack overflow.

Ну и под финал всего это необходимо скомпилировать сам Linux-0.01. Линус писал, что он использовал пропатченный им же gcc-1.40 c поддержкой -mstring-insns, но он также писал, что возможно подойдет 1.37.1 и да, им можно скомпилировать ядро Linux. Нужно только убрать вышеупомянутую опцию из нескольких Makefile (об этом писал Линус), а также отредактировать под себя boot.s (под нужный тип дискеты) и include/linux/config.h (параметры жесткого диска). Плюс в Makefile надо добавить путь до gnulib (об этом тоже писал). О чем Торвальдс не писал, так это то, необходимо в Makefile добавить команду конвертации бинарного файла в формат, который мог бы исполняется на Minix-386 (на нижнем левом скрине эти команды можно увидеть). Линус не делал подобной конвертации и могу предположить, что у него был патч который позволял запускать бинарные файлы gcc нативно (aka gnutoo).

Осталось только подготовить свободный раздел жесткого диска, создать несколько устройств в /dev и /bin скопировать bash (+ сделать ссылку на sh) и update. Запись ядро на дискету и как писал Линус «Use the three-finger-salute to reboot you machine».



Проверено: shell-script ()
Ответ на: комментарий от Dumppper001

Я тоже думаю, что может заработать, но возможно будут нюансы при установке. В вашем сообщение указали, что

А также маленький Флопик

Если это 3.5 дисковод, то, я, к сожалению, так и не смог заставить использовать родную рутовую дискету на этапе установке. Да, с 3.5 можно нормально загружается, но потом необходимо сменить дискету и вставить дискету с корнем FS. И вот на этом этапе выкидывает ошибку. Возможно надо больше уделить времени, но т.к. это был эмулятор, то я просто сменил тип дисковода.

Это можно обойти, если установить minix 1.5.10 PH в том же эмуляторе, а потом заdd’ить виртуальный образ диска на железный винт. На установленном minix 3.5 дискеты должны работать нормально и их можно использовать в дальнейшем.

Сам Linux, тоже должен нормально грузится с таких дискет, я сам не проверял, но в документации по установке Linux, Линус писал, что-то типа cp Image /dev/PS0. PS0, что в Minux, что в Linux - это 3.5 дискеты.

OlegSL
() автор топика

А можешь немного рассказать про компиляцию. Много ли уходит времени? Многое приходится делать руками или как и сейчас достаточно make && make install? А то вот я-то генту свою компиляю, но в 99% случаев всё сводится к emerge package-name где-то в фоне, на что уже и внимания не обращаешь - обычный будничный процесс. Как оно было у Линуса тогда?

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

Имеете ввиду компиляцию ядра Linux? Само ядро Linux в эмуляторе, на современном ноуте (HP ProBook 440 G6), комплируется минут 5. Сама компиляция простая: make clean; make dep; make. В результате получается файл Image, который надо записать на дискету и с неё загрузится.

Оригинальные файлы linux-0.01 надо руками редактировать, но не много.

  1. В Makefile убрать вышеупомянутый -mstring-insns. Таких мест в 3-х файлах
  2. В корневом Makefile добавить пусть до библиотеке gnulib (идет в бинарном) вместе с GCC 1.37.1 от профессора Блэка (Alan W Black) и, тоже как писал выше добавить добавить команды для конвертации бинарного файла скомпилированный gcc для возможности исполнения в Minix.

Тут, если интересно, можно чуть подробнее рассказать. В оригинальном Makefile есть такой кусок:

CC	=gcc
...
Image: boot/boot tools/system tools/build
	tools/build boot/boot tools/system > Image
	sync

tools/build: tools/build.c
	$(CC) $(CFLAGS) \
	-o tools/build tools/build.c
	chmem +65000 tools/build

В котором компилируется программа tools/build, она собственно и собрает финальный Image. Но если посмотреть она собирается gcc и хоть используется gcc 1.37.1 сделанный специально для Minix его результирующий бинарный код не совместим с minix-386. Чтобы исправить это существует 2 вида:

  1. С конвертировать с помощью утилиты gcc2minix (я так поступил)
  2. Пропатчить Minix, чтобы исполнять gcc’овый код нативно (патч известный как gnutoo).

Я выбрал 1 вариант, поэтому в Makefile появились дополнительные команды.

  1. Еще необходимо в boot.s выбрать свой тип дискеты (там по дефолту 3.5, я использовал 5.25 на 1.2М).
  2. И в include/linux/config.h записать параметры своего диска (кол-во секторов, головок и т.п.). Возможно как исправить те которые были у Линуса или добавить свои. Я добавил свои.

И на этом всё, компилируем и загружаемся.

Остальные программы под Linux я не компилировал. /bin/update я взял готовый с сайта oldlinux.org и от туда же bash. Правда с bash’ом отдельная история. Если судить по оригинальным постам в usenet os.comp.minix, то Линус портирвал bash 1.08. Такая версия, действительно существовала, но в 2022 году, мне не удалось ее найти. Есть только более ранние версии 1.05 или наоброт более поздние (1.12). Поэтому я взял готовый bash 1.05.

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

На реальном железе, ИМХО, с 3.5 дискетами всё будет ещё печальнее. Недавно проверял около 30 шт таких дискет, только пара рабочих. Дисководов гора и они исправные, а дискет нет. А всякие boot/root не любят сбойные дискеты, которые читаются через раз.

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

Спасибо. Интересно.

Не знал, что minix бинарно несовместим с linux. Я почему-то думал, что они использовали один и тот же формат бинарников, который работал и на unix. Торвальдсовского универа, и на minix, и на linux.

shell-script ★★★★★
()

Я еще сделал небольшое «исследование» из разных источниках о характеристиках PC на ранних этапах жизни ядра. Возможны неточности.

Аппаратное обеспечениеПроизводитель, модельИсточник
SVGA Монитор 14’Производитель неизвестен1)
Системный блокПроизводитель неизвестен2)
Материнская платаПроизводитель неизвестен
CPUIntel 386DX 33Mhz3)
FPUIntel 3874)
RAM4 (или 8) Mb5)
VideoПроизводитель неизвестен на базе ET4000 на 1Mb6)
FDD A3.5 1.447)
FDD B5.25 1.28)
HDD C/DConner CP3044 IDE Type 179)
ModemПроизводитель неизвестен10)
КлавиатураПроизводитель неизвестен11)
  1. Just For Fun (J4F), + пост в usenet
  2. «Неизвестный серый ящик»" (J4F)
  3. J4F
  4. Появилась в процессе разработки ядра (в анонсе 0.03)
  5. В J4F описывалось, что 4 Мб, в ядре 0.01 в нескольких местах указано, что уже 8Мб
  6. пост в usenet
  7. В руководстве указано устройство /dev/PS0 (это 3.5 1.44M)
  8. Предположительно, что был, т.к. в то время было распространенной практикой иметь и 3.5 и 5.25
  9. 2 HDD c характеристиками H5 S17 C980 (ядро 0.01) linux/kernel/hd.c
  10. Внешний модем на 2400bps (linux/kernel/serial.c)
  11. Финская раскладка
OlegSL
() автор топика
Последнее исправление: OlegSL (всего исправлений: 3)

В Base Memory те самые 640К, которых хватит всем.

PhysShell ★★
()

люблю старые программы, мне нравится их изучать и смотреть как они развивались

Доюниксовыми программами тоже интересуетесь?

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

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

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

Да, прошу прощения, криво сделал ссылку в markdown разметке. Адрес сайта, как вы наверно, уже поняли: http://oldlinux.org/

OlegSL
() автор топика

Круть! За что и люблю лор, так за такие скрины с описанием. Понимаю, что сам бы никогда не осилил. Респект и уважуха)

einhander ★★★★★
()

Занимательный факт из серии «А вы знали что…» самыми первыми версия интересовались и наши граждане, более того, из небезызвестный компании Стиплер.

Path: gmdzi!zeus.ieee.org!europa.asd.contel.com!uunet!mcsun!fuug!demos!
relcom!news-server
From: mo...@inzer.demos.su (Oleg Moroz)
Newsgroups: comp.os.minix
Subject: Re: Re: [comp.os.minix] Free minix-like kernel sources for 386-AT
Message-ID: <AA7ig3fuR5@inzer.demos.su>
Date: 30 Oct 91 12:52:23 GMT
References: <3255@cluster.cs.su.oz.au>
Sender: news-ser...@kiae.su
Reply-To: mo...@inzer.demos.su
Organization: Steepler Ltd.
Lines: 19


  chr...@extro.ucc.su.OZ.AU (C. G. Albone) writes:
>
>Hello all..
>	I missed the original posting, so could someone please tell me
>how I may obtain the sources.
>

  And me too !!!!!!!!!!!!!!
  Also, are them available via e-mail (mail server or smth), as I'm
in the former Soviet Union and can't do any FTP.

  Thanks, 
  Oleg
-- 
* Oleg Moroz               Surface address: P.O.Box 30, 103031, Moscow, USSR *
* Software Designer        Internet address:            mo...@inzer.demos.su *
* Steepler Ltd.            Phone:    +007 (092) 214-81-92, 245-21-94 (voice) *
* "I've looked over jordan and I've seen/Things are not what they seem" - PF *
OlegSL
() автор топика

Главное, ОБЯЗАТЕЛЬНО, необходимо пропатчить ядро Minix (kernel) иначе при компиляции ядра Linux, получите сообщение, что-то типа fp stack overflow.

что-то не нашёл патча.

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

Если вы качали архив GCC с сайта профессора Блэка, то вот он:

tar tvf gccbin.tar.gz | grep 'klib386.cdiff'
-rwxr-xr-x 26021/0         227 1990-10-28 14:30 gccbin/klib386.cdiff

Сам патч крохотный

*** klib386.x	Sun Sep 16 20:16:55 1990
--- klib.x	Wed Sep 19 01:53:13 1990
***************
*** 417,422 ****
--- 417,424 ----
  
  	mov	eax,cr0
  	or	eax,#CR0_PG
+ #define CR0_EM 4
+ 	or	eax,#CR0_EM
  	mov	cr0,eax
  
  	pop	edi
OlegSL
() автор топика
Ответ на: комментарий от OlegSL

SVGA Монитор 14’

Монитор четырнадцать футов?! О_О Суровые финские студенты…

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

Я думал там что-то в mm поменяли.

А меня вот другой вопрос интересует: удавалось ли кому-нибудь из формучан запустить шестой UNIX на БК-0010? Даже порт есть на гитхабе: https://github.com/sergev/bkunix Только вот у меня на андроид-эмуляторе собранный бинарь почему-то не завёлся.

luke ★★★★★
()

Мне кажется linux-0.01 проще написать и запустить самому, чем возиться со всей этой установкой.

untitl3d
()

Неслабо. А кроме bash там что-то работает? gcc тот же самый, например? Чтобы собрать следующую версию, из нее следующую и так далее (шучу).

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

По моим данным был такой набор:

linux-0.01 (17.09.1991)

Не публичная версия. Портированы bash и gcc.

linux-0.02 (5.10.1991)

Первая публичная версия. К bash и gcc, были добавлены make, sed (оба GNU версии), compress (16 битная, в minix была 13 битная), sz/rz (из комплекта zmodem)

linux-0.03 (10.10.1991)

Добавилось: bison, fileutils (ls, cp, mkdir, rmdir, tail), less, uemacs/PK (MicroEMACS)

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

Ну я скорее имел в виду «собрать ядро следующей версии, загрузиться в него, собрать утилиты, собрать еще свежее» — и так до linux 6.0 :)

Или первые версии несамодостаточны в этом плане?

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

Теоретически, такая возможность была, начиная с версии 0.10 (следующая за 0.03). Для установки Linux, Minix всё ещё был нужен (для создания файловой системы), но теперь было достаточно и демо дискеты minix 1.5. Да, интересный исторический факт, у Миникс была урезанная демонстрационная версия за 10$, а не только платная версия за 169$

P.S. До 6.0 обновиться нельзя, поддержка i386 была до версии 3.8

OlegSL
() автор топика
Последнее исправление: OlegSL (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.