Исполнители модулей

Для обеспечения загрузки, запуска и исполнения модулей в «Сивелькирии» вводится концепция исполнителей. Исполнители сами являются модулями и по отношению к исполняемым ими модулям берут на себя следующие обязанности:

  1. Загрузку используемых модулей в оперативную память, инициализацию, финализацию и выгрузку;
  2. Связывание API, предоставляемого операционной системой, с исполняемым кодом модулей: обеспечение прохождения вызовов и данных из API операционной системы в код модулей и обратно;
  3. Загрузку и подготовку необходимого модулю окружения времени выполнения;
  4. Перевод кода модуля из любого промежуточного представления (исходный код на интерпретируемом языке; байт-код; промежуточный язык; сборка, предназначенная для другой платформы) в последовательность машинных команд. Конкретные действия на этом шаге (интерпретация скрипта, интерпретация байт-кода, JIT-компиляция, эмуляция и т. д.) определяются способом доставки модуля;
  5. Сокрытие способа работы модуля от операционной системы и других модулей.

Кроме того, исполнитель может брать на себя работу по изоляции данных различных модулей в случае, если сосуществование двух и более модулей в одном адресном пространстве не создаёт угроз безопасности (например, для управляемого кода), а работа самого исполнителя стабильна настолько, что ошибки в загруженном им модуле не приведут к проблемам в работе исполнителя и других обслуживаемых им модулей.

Данная концепция позволяет использовать различные способы сборки модулей в общей системе. Например, машинный код, полученный компиляцией кода на C++, будет загружаться исполнителем, поддерживающим непосредственное исполнение, в отдельное адресное пространство, и компоноваться с необходимым окружением времени выполнения. Управляемый код на IL может загружаться исполнителем, поддерживающим исполнение управляемого кода, причём изоляция может быть выполнена как на уровне операционной системы (загрузкой различных модулей в различные адресные пространства), так и на уровне исполнителя (загрузкой различных модулей в общее адресное пространство, но в разные домены окружения).

Исключением является случай запуска машинного кода под «Сивелькирией», выполняемой в рамках основной операционной системы в качестве набора библиотек и/или процессов. Прямой запуск машинного кода в этих условиях разрешён только в случае, если гарантируется отсутствие обращений из машинного кода к основной операционной системе в обход «Сивелькирии», либо если такие обращения необходимы с точки зрения системы. Например, это условие может быть выполнено в контролируемой корпоративной среде, а также для проектов с открытым исходным кодом. С другой стороны, модули, осуществляющие доступ к ресурсам основной операционной системы, по определению нуждаются в способе вызова её функций. В случае, если «чистота» машинного кода не может гарантироваться, такой код может запускаться в режиме эмуляции (как и код, собранный для иной платформы).

В случае, если «Сивелькирия» запущена как основная операционная система, разделение адресных пространств уровня ОС осуществляется её ядром. В случае, если она выполняется в качестве набора библиотек или процессов под основной операционной системой, для обеспечения изоляции разные модули могут загружаться в разные процессы основной ОС. Системные модули, отвечающие за непосредственную работу с оборудованием (например, драйверы файловой системы), в случае запуска под основной операционной системой будут заменены на модули, эмулирующие данное поведение, таким образом, скрывая различия от прикладных модулей.

Упомянутое выше окружение времени выполнения, специфичное для конкретного языка и компилятора, является первым из двух исключений из правила, предписывающего вести обмен данными между всеми модулями только через объектные интерфейсы системы, поскольку загрузка его в адресное пространство модуля необходима для его работы. Концепция динамически связываемых библиотек, используемых несколькими модулями, в «Сивелькирии» в общем случае не поддерживается, поскольку она направлена на реализацию совместного использования кода, что и так уже реализуется через интерфейсы модулей.

Второе исключение — это разрешение использовать динамически связываемые библиотеки нескольким модулям, поставляемым совместно в рамках одного пакета. При этом возможности подключить ту же библиотеку к другим модулям, как и подсистемы поиска динамических библиотек, «Сивелькирия» не предоставляет.

При загрузке системы часть исполнителей загружается в память одновременно с ядром, чтобы избежать ситуации, когда для загрузки исполнителя требуется другой исполнитель, который также ещё не загружен. Это относится, прежде всего, к исполнителям, обеспечивающим запуск машинного кода на данной платформе. Остальные исполнители загружаются в память по общим правилам.