Цель проекта. Написать многозадачную, многопользовательскую операционную систему реального времени, которую можно будет устанавливать на любой носитель (жесткий диск, дискета, CD-R, CD-RW, Flash). Система сколько угодно расширяемая, но при этом компактная. Основная часть ОС: первичный загрузчик, ядро, scheduler, базовые драйвера и приложения без проблем влезут на дискету. Поэтому основа - микроядро. Система предназначена для компьютеров на базе ПК. На данный момент основной инструмент - FASM, в будущем возможно для системы будут созданы компиляторы C/C++, Basic, Pascal.
Ядро. По производительности микроядро операционной системы Miraculix не уступает монолитным ядрам. В кольце 0 выполняется только код микроядра. Исключение составляет модуль TRAP.SYS он перехватывает все исключения, при возникновении ошибки в коде ядра, если код выполняется в кольце 0 (SYSTEM FAILURE). Базовым элементом API является обработчик прерывания 0x90. Функции ядра: управление виртуальной памятью (в системе используется страничная модель памяти), функции взаимодействия процессов, управление процессами, и функции синхронизации.
Многозадачность. В системе используется программная многозадачность. Для всех процессов и потоков выделен всего один "физический" TSS. Его значение меняется каждый раз при переключении на другую задачу. Значение карт I/O и INT (только для V86-задач) не меняется. Это позволяет держать в системе сколько угодно процессов и потоков, это было бы невозможно, если каждому процессу и потоку выделялось по TSS, т.к. количество системных дескрипторов ограничено: 8192. Функции синхронизации: усыпить_процесс (число_квантов), получить_или_продлить_выполнение (PID, число_квантов), получить_состояние (PID).
Организация памяти. Все адресное пространство можно разделить на две области: область аппликаций и системную (ядра, драйверов/модулей). При запуске 32-битного приложения все сегментные регистры (DS, ES, GS, FS, CS), описывают все 4Гб памяти. Модель памяти - страничная, у каждого процесса своя таблица страниц, её размер зависит от потребностей приложения. Память выделяется динамически (в процессе выполнения) в страницах. Поток наследует все адресное пространство процесса которым он был создан. При создании V86-задачи, в память новой задачи копируется таблица прерываний и BIOS также, в опциях можно указать присутствие/отсутствие A20. Функции менеджера памяти: выделить_память (число_страниц), освободить_память (число_страниц), отобразить_память (физический_адрес, число_страниц). в параметре физический_адрес можно указывать только адреса 0xA0000...0xFFFFF и адреса определенные с помощью PCI.
Загрузка. На данный момент реализована загрузка системы с 3.5" дискеты. Этапы загрузки:
1) Boot-сектор загружает первичный загрузчик с дискеты.
2) Первичный загрузчик (AXE.COM) проверяет наличие ядра на дискете, если он его не находит, то открывает окно-меню со всеми файлами и папками на дискете, в этом режиме можно запускать DOS-программы, 32-битные бинарники. Если файл "KERNEL.SYS" присутствует на дискете, первичный загрузчик грузит весь корневой каталог дискеты в память, создавая RAM-Disk. В ядре отсутствуют функции для работы с дисками, файловыми системами. Но, ядро должно запустить вторичный загрузчик, для этого первичный загрузчик создает RAM-Disk по адресу 0x300000. Примечание: первичный загрузчик после завершения своей работы не удаляется из памяти, он остается резидентным. И получает управление в случае возникновения фатальных ошибок.
3) Получив управление, ядро загружает вторичный загрузчик (он же первый процесс в системе, в микроядре L4 он называется sigma0), с RAM-Disk'a, и загружает регистр процессора TR.
4) Вторичный загрузчик загружает все драйвера и модули, прописаные в файле "AUTOEXEC.INI". Строгая последовательность не обязательна, загрузку драйверов и модулей можно выполнять в любом порядке (т.к. система многозадачная) но нужно, что бы драйвер FDC попал в первый мегабайт физической памяти. Потому-что при работе с дискетами в драйвере FDC используется 16-битный контроллер DMA... На втором месте по важности является модуль TRAP.SYS. (его можно поставить на последнее место, но при возникновении ошибки в каком-нибудь из модулей или драйверов загружаемых перед ним возникнет неопределенная ситуация...). Ещё можно прописать загрузку GUI, альтернативной консоли, или оболочку типа Norton Commander.
Поддержка DOS и 16-битных приложений. На данный момент реализован запуск 16-битных приложений. Но, не налажена система прерываний в V86. В нормальной ОС V86 поддержка должна быть. Хотя бы для вызова 16-битного BIOS'a. Некоторые вещи не стандартны, например: GFX, SMBus, DDC, APM.