Привет, ЛОР.
В посте полугодичной
давности я рассказал о том, как я возился с монохромным монитором от
МежДелМаша, подключая его к IBM PS/2. Теперь же я хочу поделиться с вами
совсем-таки недавним моим успехом уже софтверного характера, впрочем всё так
же занимающим своё заслуженное место в одном из разделов Специальной
олимпиады, а именно, — я модифицировал древний MINIX 1.7.5 под нужды
своего компьютера, дабы использовать все основные возможности железа. Но начну
я своё изложение всё-таки с описания характеристик, ибо именно оно является основным
лимитирующим фактором.
Итак, на фото один IBM 8530 (PS/2 Model 30 286) со следующими параметрами
- Процессор от SIEMENS, клон Intel 80286, 16-bit
- Память 1 Мб (разбита на 640k+384k)
- VGA на материнке
- PS/2 клавиатура и мышь
- Три ISA слота (мне повезло не возиться с MCA)
- Compact Flash XT Lite
adapter rev 4.1
- Ethernet от SMC (WD8390 совместимая карта с RJ-45 и BMC)
- EGA видеокарта от ATI с поддержкой MDA и CGA режимов
Делловский монитор подключён к VGA из материнки, а вот с монохромным
монитором пришлось повозиться, сделав переходник с MDA DB-9 на DB-15, плюс
выцыганить питание с разъёма для флоппи, ибо IBM решили убрать молексы из
дизайна, и запитывать диски с материнки.
Ситуация с подключением двух мониторов довольна нестандартна для конца 80х,
однако именно для этой цели адресное пространство у монохромного адаптера и у
цветного графического (от которого наследуется текстовый режим VGA) разные, а
значит в теории можно использовать VGA+MDA. Однако обычно программы для MS-DOS
на это не затачивались, и профита от такой схемы для меня не должно было быть,
если бы не…
Если бы не старый MINIX. Версии вплоть до 2.0.4 позволяли в теории запустить
полноценный UNIX даже на IBM PC XT с 640k RAM. Однако же найти подходящую
именно для меня конфигурацию MINIX оказалось задачей трудной. Я перебрал
сначала версию MINIX для MS-DOS, но 1 MB памяти для неё было явно мало (что и
не удивительно, ведь MINIX для DOS создаёт виртуальный диск в RAM). В итоге я
смог установить в QEMU MINIX 1.7.5 на один из разделов Compact Flash, и потом
даже запустить уже на самом PS/2.
Правда, путь к первой введённой в терминале команде был тернист. Во-первых,
MINIX подвешивал клавиатуру при загрузке. Причину удалось установить,
загрузившись в режиме совместимости с i8086, откуда подозрения сразу пали на
злосчастную линию A20, которая управляется контроллером клавиатуры в AT-клонах
для совместимости с i8086. В исходном коде kernel/klib88.s
A20-линия
выставлялась в соответствии с мануалами, вот только оказалось, что для IBM
PS/2 появился специальный контроллер для управления A20, а посему код для ядра
пришлось сразу же патчить. По итогам доступная память с 640k в режиме
совместимости увеличилась до установленной памяти в 1 MB, плюс защищённый
режим с его плюсами (ну и минусами тоже, об этом чуть позже).
Следующим шагом было реализации возможности работать одновременно в двух
виртуальных tty, используя два монитора. В коде kernel/console.c
такой
абстракции как монитор или экран не было, поэтому пришлось долго провозиться с
возникающими гонками за внутренние переменные, однако усилия были
вознаграждены, и теперь я мог например вывести на один экран какой-нибудь man, и параллельно редактировать файл на другом, переключаять по Alt-<- Alt–>.
Ещё одна из проблем оригинального MINIX — он отказывался работать с CF-XT
адаптером. Одно время я был удовлетворён работой драйвера, который вызывает
функции BIOS int 13h через аппаратный сброс, пока я не захотел наконец-то
разобраться с сетевым драйвером (благо он как раз для WD8390 совместимых карт
уже был в исходниках). При включении Ethernet в параметрах ядра загрузка
зависала на моменте инициализации драйвера диска (забавно, не правда ли?)
Вместо того, чтобы пофиксить баг, я решили подойти к вопросу радикально и
переписать стандартный драйвер IDE контроллера, чтобы он стал поддерживать
CF-XT-lite. И это было увлекательно. Главной подсказской для меня стала
принципиальная схема адаптера, потому что сходу отображение адресов CF на шину
не гуглилось, и оказалось, что не на все вопросы необходимо искать ответ в
Интернете, тем более когда достаточно просто взглянуть глазами на схему
платы. Конечно, документация к CF и исходники XTIDE BIOS мне тоже помогли. В
процессе переписывания драйвера в момент, когда я наконец-то разобрался с
адресами, и драйвер стал идентифицировать устройство, я умудрился несколько
раз испортить корневой раздел, но спасали бэкапы и Linux, который до сих пор
поддерживает старую добрую MINIX FS.
Как итог: старый MINIX прекрасно себя чувствует на старой же машине с 16-bit
разрядностью и 1 MB памяти, при этом позволяет выходить во внешний мир с
помощью telnet и ftp и поддерживает мультизадачность. Сейчас я ковыряюсь с httpd сервером, который уже
скомпилировался и запускается, но пока возвращает только 403 и 404 (причём
делает это он секунд за пять, если не медленнее). Остались ещё мелкие недочёты
по типу не работающего SIGTERM по Ctrl-C и мигающего сразу в двух экранах
курсора (это сбивает с толку, потому что не знаешь, на какой экран сейчас
перенаправлен ввод). Из глобального хочется сделать frame buffer хотя бы для
VGA, а то и для обоих мониторов (попробовать видеокарту ATI в режиме
Hercules). Другая возможная ветка развития — создание дистрибутива для
старых компов и эмуляторов типа даже pcjs.org, чтобы у энтузиастов была
возможность попробовать настоящий UNIX на своём ретро железе.
P.S. Да, чуть не забыл. На фото на левом мониторе telnet на какую-то из BBSок,
на правом — стандартные UNIX команды и вывод кусочка ядра на экран.
>>> Просмотр
(4000x3000,
4288 Kb)