Table of Contents

Презентация демо osFree

(проект Open Source клона OS/2)

DATE: ??-07-2011

AUTHORS:

Доклад Oxyd-а на Chaos Constructions'2011, секция операционных систем

В данном докладе будут рассмотрены основные цели и задачи стоящие перед разработчиками операционной системы osFree, являющейся opensource версией популярной, в недалёком прошлом, системы IBM OS/2 Warp и совершён краткий экскурс в историю развития OS/2-like систем. Так-же, в общих чертах, будет показана архитектура системы, базирущейся на микроядре L4 Fiasco.

Вступление

Краткая история OS/2, альянс IBM/Microsoft

Спад интереса к OS/2 со стороны IBM, OEM-контракт с Stardock, и затем с Mensys/Serenity. Разработка eComStation.

Петиции к IBM

Почему нужен проект Open Source OS/2

Положение дел с OS/2

Что нам нравится в OS/2 и хотелось бы сохранить. Почему нужен проект Opensource OS/2.

osFree

как все начиналось

  1. FreeOS - Первая попытка.
    • Наиболее заметным и, вероятно, самым первым проектом Open Source OS/2 был проект FreeOS. Он начался в 1999-м году под эгидой Daniel Caetano (автор PM Download Center). Последней попыткой представления данного проекта в интернете был сайт www.freeos.cjb.net. (На даный момент сайт недоступен.)
    • Однако, в рамках данного проекта не было написано ни одной строчки кода и все закончилось разговорами.
    • Данный проект был обречен на провал по ряду причин.
      • Это отcутствие какой-либо четкой организации, отсутствия репозитория, где можно было бы держать результаты работы, и отсутствие какого-либо информационного ресурса в интернете, исключая некоторое появление в новостях и наличия списка рассылки.
      • Проект просто закончился, не начавшись. Как ни странно, люди зачастую предпочитают делать реальные вещи, а не заниматься проектированием и планированием, тем более, что проектировать-то на первой стадии особенно нечего, все и так уже существует.
  2. osFree TPE - Dirty license.
    • В начале 2000-х из фирмы IBM “утекли” исходные коды ядра OS/2. на основе которых в 2002-м году был выпущен дистрибутив получивший название osFree TPE - Technology Preview Edition.
      • Данный дистрибутив вызвал море обсуждений у всего OS/2 community тех лет.
      • Дистрибутив до сих пор периодически всплывает то на одном, то на другом сервере, но факт остается фактом. Дистрибутив незаконный. Те, кто подписывался на лист рассылки osFree помнят обсуждение о легальности кода и то, что единственным представителем со стороны osFree team был John Martin, наиболее часто фигурирующий как JMA. Факт тот, что он отказался от дальнейшей поддержки нелегального дистрибутива и предложил все-таки разрабатывать Open Source OS/2.
  3. Проект osFree.
    • В 2001-м году, в результате истории с osFree TPE JMA был начат проект полностью Open Source OS/2 под названием osFree. (Чет с датами нестыковка. Пунктом выше 2002-ой год)
    • перерывы в разработке
      • С тех пор группа волонтеров начала разработку osFree в открытых исходниках. Они начали с утилит командной строки, таких как format, chkdsk, label, bldlevel etc. Следует отметить среди них Cristiano Guadagnino из Италии, Bartosz Tomasik из Польши и Michal Necasek из Чехии (?).
      • В 2002 JMA отстраняется от проекта, передав дальшейшее развитие Юрию Прокушеву. Затем, в связи с небольшой поддержкой проекта среди общественности, разработка затихает. Юрий Прокушев практически в одиночку собирает исходники в единую систему сборки, что-то фиксит, поддерживает веб-сайт, публикует статьи… Но разработка ведется очень медленно и притока новых сил нет. Авторы коммандлайновых утилит потихоньку “остывают” и перестают что-либо писать. С тех пор состав проекта полностью сменяется. Люди, выпускавшие osFree TPE, перестают участвовать в разработке.
      • дискуссия о выборе ядра
        • В 2002 году Юрий Прокушев на сайте ecomstation.ru публикует две статьи на тему “Open source и OS/2”. Он предлагал тогда дистанцироваться от выбора ядра и сосредоточиться на юзерленде. В первой статье он сделал обзор опенсоурсного софта под OS/2 и попросил помощи у сообщества. Вторая статья предлагала в качестве ядра выбрать ядро NT, а точнее, его Open Source аналога – ядро ReactOS, с возможностью опционального выкидывания Win32 подсистемы и замены dominant subsystem на OS/2. Обе статьи вызвали активную дискуссию в комментариях к статье, но дело так и не сдвинулось с мертвой точки.
        • Попытка использования ядра NT вызвала неприятие общественности. В результате, на www.osfree.org был вывешен опрос, какое ядро предпочтительно для реализации Open Source OS/2? Предлагались варианты ядер L4, Linux, Mach, ReactOS, Other. Этот опрос довольно долго висел на сайте, пока к концу 2005 г на сайт не наткнулся Samuel Falvo из США, знакомый с разработкой под L4. Он нам разрекламировал преимущества этого микроядра (насколько я помню, чет было не так. Обследование различных ядер на возможность реализации OS/2 API делал Посохов, если я правильно помню.).
        • Прежде всего:
          • это его высокопроизводительность и универсальность и поддержка драйверов в userspace.
          • L4 это микроядро 2-го поколения, содержащее множество оптимизаций и архитектурно улучшенное, по сравнению с предшественниками.
            • Это включает в себя оптимизацию межнитевого обмена сообщениями и переключения контекста процессов.
            • Управление памяти было вынесено в userspace, и могло быть реализовано в произвольном виде. (для “плоской” модели памяти)
            • Операции над страницами памяти осуществлялись в реальном времени в userspace и можно было делать map/unmap страницы из обычных непривилегированных программ.
            • Это было безопасно, т.к. программы могли манипулировать только со страницами, отображенными в их собственное адресное пространство.
            • Обработка прерываний также была реализована в userspace. При возникновении прерывания, ядро направляло обработчику прерывания в userspace, сообщение от имени виртуального (несуществующего) треда. Таким образом делается виртуализация обработки прерываний. Тред получает сообщения о прерываниях, а ядро автоматически после этого делает EOI (сигнал End Of Interrupt – конца обработки прерывания). Механизм передачи сообщений микроядра достаточно высокопроизводительный для того чтобы сообщения посылались сразу по мере прихода сигнала прерывания.
        • Samuel сначала начал писать реализацию механизма загрузки микроядра, (Прокушев первоначально отрицательно относился к GNU GRUB, используемому обычно для загрузки L4 – он хотел более традиционную для OS/2 последовательность загрузки, поэтому Samuel взялся за boot sequence). В качестве первой ФС им была выбрана довольно экзотическая LEAN FS, взятая из FreeDOS-32. Затем Samuel выпускает утилиту format для LEAN FS, это было довольно трудоемко и он этим довольно долго занимался. Затем Samuel куда-то пропадает, и новостей от него не слышно. Потом приходит новость, что он получил продвижение по службе, и больше мы его не видели.

Затем до конца 2006 года следует еще один большой перерыв в разработке osFree.

  1. Начало разработки FreeLDR
    • В 2005 году после ухода Samuel Falvo к нам присоединяется Sascha Schmidt из Германии. Он написал парсер файла config.sys и вместе с Юрием Прокушевым продолжает работу над последовательностью загрузки. Они выделяют из GNU GRUB подпрограммы для чтения ФС и обработки протокола multiboot и комбинируют их с исходниками Freeldr (http://www.edm2.com/0705/freeldr/freeldr.html) – проекта Open Source замены загрузчика os2ldr, написанного Дэвидом Циммерли в 1999 году.
    • Sascha и Юрий тогда не смогли заставить работать эту комбинацию – они плохо были знакомы с ассемблером.
    • В ноябре 2006 года в проект приходит Валерий Седлецкий. Он был немного знаком с ассемблером и вскоре, наша версия freeldr, содержащая оригинальный код freeldr и подпрограммы из GRUB'а, портированные на 16-битный Си, заработала. Она успешно грузила микроядро L4Ka::Pistachio. Дальше было решено за нашей разработкой сохранить название FreeLDR, т.к. оно согласовалось с названием проекта osFree, являлось Free software и наследовало часть кода оригинального freeldr.
      • (Замечание. Это название совпадает с одноименным загрузчиком из ReactOS по чистой случайности. Просто, в OS/2 загрузчик называется os2ldr, а в NT ntldr, и вполне естественно для обеих проектов было название freeldr).
    • Вскоре было решено отказаться от 16-битных подпрограмм доступа к ФС при помощи microfsd и портировать добавочный код из GRUB'а – 32-разрядные ФС из GRUB и сделать вокруг них 16-битные обертки реального режима для совместимости с OS/2-шными microfsd. Параллельно могли использоваться и 32-битный API защищенного режима, и 16-битный реального. З2-Битные ФС были отделены от бутлоадера, и сделана возможность раздельной компиляции загрузчика и ФС. В отличие от GRUB-а, ФС просто прописывались в конфигурационном файле. Далее было решено делать свой собственный загрузчик на основе GRUB и совмещать логику загрузки по протоколу multiboot и OS/2-like boot sequence. ФС-бэкенды, взятые из GRUB, грузились специальным менеджером бэкендов, который носил название pre-loader. Pre-loader грузит ФС-бэкенд, пытается смонтировать ФС и дальше работает через него, опционально делая 16-битный враппер, служа 16-битным microfsd, совместимым с OS/2-шным. Он также должен делать прозрачную декомпрессию и парсинг исполняемых файлов на лету (но последнее пока не реализовано).
    • Кроме пре-лоадера есть также 32-битный multiboot loader, аналогичный GRUB-у. Но он абстрагирован от структуры ФС, форматов компрессии, исполняемых форматов и т.п. Кроме того, мультибут-лоадер может опционально заменяться на стандартный os2ldr, и тогда pre-loader для него служит microfsd.
    • Для FreeLDR нами был разработан ФС-бэкенд для файловой системы HPFS и спортирован бэкенд для NTFS. Загрузка ядра Linux и chainloading были отделены от multiboot-загрузчика и реализованы в виде отдельных multiboot-ядер.
    • Также, было реализовано специальное multiboot-ядро, служащее для загрузки классического ядра OS/2 и на его основе была реализована технология загрузки OS/2 с CD/флешки/HDD/флоппи/etc и технология, альтернативная memdisk и загрузочный CD с OS/2 на ее основе.
  2. Старт реализации OS/2 API
    • с конца 2006 до конца 2008 мы занимались в основном, загрузчиком и связанными технологиями, а также, новой системой сборки исходников.
    • Затем в проект приходит Sven Eric Rosen из Швеции. Он написал загрузчик для исполняемых файлов формата LX.
    • Затем Юрий Прокушев на его основе добился загрузки простейшего EXE, грузящего единственную API-функцию для вызова сообщения из msg.dll и вызывающий его. Затем он сделал OS/2 API сервер, запускавшийся под тремя системами – OS/2, Windows и Linux. Он грузил маленький EXE, который писал на экран строку “I'm really small!”.
    • Затем тестовый пример постепенно усложнялся. Прокушев портировал этот сервер под L4 и добился запуска там. При этом уже было реализовано несколько API-функций.
    • Затем он попытался сделать минимальный интерактив – сделал минишелл, который умел всего несколько команд: “cd”, “help” и старт внешней программы. На этом был небольшой затык и интерактив никак не хотел работать.
    • Затем за дело взялся Валерий Седлецкий. Он временно закомментировал в коде лишний функционал, оставив только команду help и показ приглашения командной строки.
    • После нескольких дней отладки интерактивный шелл заработал! Он использовал всего три API функции – для записи на stdout, чтения из stdin и выхода из программы. Шелл показывал командную строку, реагировал на команду help и нажатие Enter.
    • Следует заметить, что мы используем не голое микроядро L4/Fiasco, а также набор сервисов к нему под названием l4env. В отличие от другого микроядра L4Ka::Pistachio, которое мы хотели использовать вначале, здесь очень большой набор сервисов.
      1. Это и библиотека thread для управления тредами,
      2. и библиотека semaphore для создания event семафоров
      3. и библиотека lock для мьютексов,
      4. и сервер консоли l4con, предоставляющий девять графических консолей с возможностью прокрутки назад и поддерживающий как графические, так и текстовые программы.
      5. Это и менеджер физической памяти dm_phys,
      6. и сервер loader, умеющий грузить исполняемые файлы формата ELF с поддержкой разделяемых библиотек,
      7. и провайдеры файлов,
      8. а также порт библиотеки языка Си uCLibc и многое другое.
      9. Также, существует подсистема l4vfs для поддержки иерархического namespace, в том числе, файлов и других объектов, такие как пайпы, сокеты или ключи регистри. Существует центральный name_server, который поддерживает корень Namespace, в который монтируются прочие серверы, а также поддерживающий разрешение имен в пары (Server_id, Local_object_id), т.е. аналог inode для файла. После такого разрешения имен клиент обращается напрямую к файловому серверу и получает доступ к файлу. Подсистема l4vfs поддерживает как обычные файлы, так и терминалы, служащие для реализации stdin/stdout/stderr для программ. Сервер терминалов прикрепляется к виртуальной консоли l4con и запись/чтение файла терминала работает как запись stdio потоков. Также, в сервере simple_file_server реализована простейшая работа с файлами, загруженными в память GRUB-ом в виде модулей. На данный момент доступна работа только с такими файлами.

Затем в разработке OS/2 Server'а следует перерыв на полгода и работа с FreeLDR.