04.12.2022

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

Я люблю старые программы, мне нравится их изучать и смотреть как они развивались, и во что они сейчас превратились или умерли так и не дожив до современных дней. И по той же самой причине, мне нравится смотреть различных авторов 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».

>>> Просмотр (1440×800, 58 Kb)

Источник.