Экскурсия по исходникам MINIX 3

Что-то я не возвращался к теме запуска разных извращенных ОС на разном извращенном железе, впрочем, на то были свои причины. Если кто еще помнит, я грозился начать портировать MINIX 3 на вогоплеер. Разобрался с toolchain, собрал “железку” – и на этом надолго остановился. Сейчас появилось немного свободного времени, поэтому я и решил написать немножечко о том, что мне предстоит.

В качестве базовой версии я взял MINIX 3.1.8 r8398 – стабильную на начало марта версию. Все дальнейшие разговоры будут вестись именно о ней. Сразу предупрежу (или напомню), что пишу я “для себя”, поэтому все эти очень заумные тексты могут содержать кучу намеренных ошибок и/или искренних заблуждений :)

Итак, каждый, кто установил Minix, или хотя бы загрузился с его компакт-диска, может увидеть там директорию /usr/src, в которой и собраны все исходники ОС. Пробежимся по поддиректориям.

benchmarks – разнообразные тесты производительности. Не трогаем.
boot – начальный загрузчик ОС. Очень специфический, предназначен исключительно для IBM PC-совместимых компьютеров. Я планирую использовать вместо него U-Boot.
commands – исходники программ стандартного POSIX-окружения. Предполагаю, что вполне себе кроссплатформенные. Без наличия работающего ядра и серверов бесполезны, не трогаем.
docs – два несчастных текстовых файлика.
drivers – драйверы различной периферии. Абсолютно необходимы из них драйвер консоли (tty), RAM-диска (memory), и системного журнала (log). Остальные отвечают за всякую ерунду – аудио- и сетевые карты, разного рода дисковые интерфейсы и прочую фигню, существующую исключительно на PC.
etc – эта директория превращается в /etc “работающей” системы. В основном содержит конфигурационные файлы. Некоторые из них отражают загружаемые драйверы и сервисы – соответственно, они должны приводиться в “актуальное” состояние. В общем, исправлять по необходимости.
include – разнообразные заголовочные файлы, в основном – стандартная библиотека Си, но есть одна очень важная поддиректория minix. Как нетрудно догадаться, содержит специфичные для Minix определения. Беглый взгляд на нее показывает, что многие файлы там не менялись с 1990-х годов, и в них предусмотрено существование трех различных архитектур. В других, более новых файлах, встречаются x86-специфические вещи. За этим надо внимательно проследить. Кроме того, нельзя забывать про директорию arch, появившуюся сравнительно недавно и предназначенную для “архитектурно-зависимых” вещей.
kernel – видимо, большая часть работы будет происходить именно тут. Это и есть ядро системы, и именно его придется запускать первым. К счастью, объем его не очень велик, и немалая часть кода в нем “переносима”. Архитектурные зависимости вынесены в поддиректорию arch (возможно, лишь частично). Судя по коду, сделаны попытки “архитектурно-зависимые” части сделать условно-компилируемыми.
lib – всевозможные библиотеки – от libc до какого-нибудь libaudiodriver. Возможно, что придется довольно серьезно “ковырять” некоторые из них, в первую очередь – libc. Это не радует.
man – страницы документации. Не трогаем.
servers – серверы, они же – службы. Большинство из них необходимы для работы системы. Правда, по опыту мужичка, портировавшего MINIX 2.0.4 на самопальный процессор, они достаточно переносимы. Вторая после ядра часть системы, над которой придется работать.
share – интерес представляет поддиректория mk, в которой лежат некоторые makefile-ы, честно упертые разработчиками Minix из NetBSD. Сразу обращу внимание, что эти файлы немного подправлены, например, во многих явно указана архитектура i386 – а нам надо mipsel. Надо разобраться с их содержимым и при необходимости исправить и дополнить.
test – тесты, показывающие работоспособность POSIX-системы. Разумеется, переносимые, и трогать их не надо.
tools – разного рода вспомогательные утилиты для сборки загрузочного образа. Естественно, что предназначены только для PC.

Дополню это небольшим отступлением по поводу истории MINIX. Первая версия этой ОС была написана Энди Таненбаумом, когда фирма AT&T увидела, что разработанная ее специалистами операционная система UNIX превратилась из игрушки в “продаваемый” продукт. После этого исходники UNIX были “закрыты”, а преподавание традиционного для американских университетов курса по архитектуре ОС превратилось в “сухое плавание”. MINIX – это Mini-UNIX, то есть внешне похожая на тогдашний UNIX операционная система, но работавшая на сравнительно дешевых IBM PC. Эта версия прилагалась к первому изданию книге Таненбаума “Операционные системы: разработка и реализация”, вышедшему в 1987 году. В начале 90-х MINIX активно дорабатывали, а Таненбаум активно “отпихивал” все предлагаемые изменения, утверждая, что хочет сохранить исходный код ОС компактным и доступным для изучения. Собственно, благодаря такой позиции Таненбаума и родился Linux – там “отцы-основатели” включали в ядро все предлагаемые нововведения. В 1991 году вышла версия MINIX, позже получившая индекс 1.5 – в ней появилась поддержка других процессоров (Motorola 68000 и SPARC) и основанных на них популярных тогда “персоналок”. Второе издание учебника Таненбаума тоже включало в себя MINIX, но, разумеется, версии 2. В нем исчезла поддержка процессоров Motorola, а x86 и SPARC остались.

Современная версия MINIX, MINIX 3, была анонсирована в 2005 году. Изначально – это существенная переработка MINIX 2.0.4, выполненная студентом Таненбаума Йорритом Хердером (Jorrit Herder) в его дипломной работе. В третьей версии из пространства ядра вынесено все, кроме самых важных компонент (даже управление памятью и приоритетами процессов теперь выполняются в user-space). Тем не менее, после чтения тезисов Хердера (Towards a True Microkernel Operating System) явно прослеживается преемственность между версиями.

Эта преемственность мне явно пригодится – один из “отчетов” о портировании MINIX на новую для него архитектуру написан о версии 2.0.4. Я его уже упоминал, приведу ссылку еще раз:

http://www.homebrewcpu.com/minix_port.htm

Кроме того, нельзя не упомянуть и о том, что в 2006 году Ингмар Альтинг (Ingmar Alting) запустил Minix 3.1.1 на MacBook (с процессором PowerPC) – к сожалению, сделанные им изменения не вошли в “основную ветку” ОС (хотя некоторые “следы” остались). В общем, читаем его тезисы под названием “MinixPPC – a port of the MINIX OS to the PowerPC platform“. Собственно, они объясняют многие отличия нынешнего кода MINIX от того, который описан в книге. Кроме того, они могут послужить своего рода “руководством к действию”.

В общем, ситуция пока складывается такая: в MINIX вплоть до “книжной” версии 3.1.0 последовательно сокращали количество возможных архитектур, в конце концов дойдя до одной только x86. Мало кто занимался адаптацией MINIX под другие машины, так что намеки на SPARC и Mototrola 68000 в заголовочных файлах – это “привет из 1997 года”. Видимо, больше всего в направлении к портированию MINIX сделал И. Альтинг, выделивший в версии 3.1.1 архитектурно-зависимые части. Благодаря его работе в исходниках MINIX в некоторых местах появились директории arch. Их содержимое, разумеется – предмет для дискуссий. Возможно, что придется выносить туда что-то большее, чем “углядел” Альтинг.

Когда руки дойдут до Minix и его исходников в следующий раз – попытаюсь сделать две вещи: настроить систему компиляции (внеся некоторые изменения в Makefile-ы) и определить, какие различия между MIPS с одной стороны и PowerPC вместе с x86 придется учитывать.

3 комментария

  1. Alexander пишет:

    Очень интересно…. жду продолжений.
    Недавно клинануло приделать усбишный тв тюнер kworld 424 к приемнику – в качестве конвертера. С железом все просто – выход 38 МГц ПЧ из TDA18271. А вот с управлением полностью так и не разобрался. Взял VCL плеер и через него задаю частоту. Неудобно но работает. Хотел как нибудь использовать кодер-декодер Conexant CX2310x но мануалы не нашел. Где только линуксоиды берут доки, если производитель их не выкладывает? Так бы получился неплохой SDR за штуку рублей.

  2. pJ the Trololo пишет:

    В задницу вогоплеер и всё, что с ним связано! Этих устройст больше нет, и было мало; они не повторяемые, накой черт тратить на них своё время?!

    • Объясняю еще раз. Вогоплеер построен на процессоре JZ4725B, к нему стандартным образом подключены флешка на гигабайт и ОЗУ на 32 Мб, а также UART. Все это – общее для любого устройства на процессорах Ingenic – вплоть до китайских “ноутбуков” за сто баксов.