Pull to refresh

Singularity — экспериментальная ОС от Microsoft

Reading time3 min
Views16K
Original author: ELIRAN

Что будет, если прямо сейчас написать новую ОС с нуля? Можно ли сделать её лучше других? Можно ли повысить безопасность и надежность? Можно ли предотвратить непредвиденное взаимодействие между приложениями?

«Как бы выглядела программная платформа, если бы она была построена с нуля с основной целью "обеспечение надежности"?»

Это те вопросы, на которые команда Microsoft Research пыталась ответить около 18 лет назад, именно тогда они придумали довольно крутое название для своей новой ОС - Singularity.

Цели

Singularity была направлена на устранение некоторых недостатков существующих операционных систем, таких как:

  • Общие уязвимости безопасности

  • Сбои из-за расширений, драйверов, дополнений

  • Непредвиденные взаимодействия между приложениями

  • Недостатки надежности

Стратегия

  • Использование безопасного языка программирования

  • Использование инструментов верификации

  • Улучшение системной архитектуры и дизайна

Архитектура Singularity

Обзор проекта Singularity

Singularity предоставляет 3 основных абстракции:

  • Программно-изолированные процессы (Software-isolated processes, SIP)

  • Контрактные каналы (Contract-based channels)

  • Программы на основе манифестов (Manifest-based programs, MBP)

Давайте подробнее рассмотрим каждый из них.

Программно-изолированные процессы, SIP

SIP похож на обычный процесс - он содержит ресурсы обработки, контекст и контейнер потоков. Довольно удивительно то, что все SIP-ы и ядро работают в одном адресном пространстве, что также означает, что пользовательский код работает с полными аппаратными привилегиями.

Разве это не контр-интуитивно? Ведь только что было упомянуто, что нужно улучшить безопасность, это одна из главных целей, но это изменение, похоже, только ухудшает ситуацию.

Во-первых, давайте подумаем, зачем вообще нужно это изменение, оно что-нибудь улучшает? Ответ положительный (очевидно), это улучшает производительность. Поскольку все SIP находятся в одном адресном пространстве, переключение контекста выполняется быстрее:

  • Нет необходимости переключать таблицы страниц

  • Нет необходимости аннулировать и повторно заполнять TLB-ы

Более того, системные вызовы также быстрее:

  • CPL всегда равен 0

  • Не нужно загружать стек ядра

  • Вместо отправки прерывания можно просто вызвать функцию

Убедившись, что с этим изменением производительность улучшится, давайте займемся кажущейся проблемой безопасности.

Каждый SIP на самом деле заблокирован - их нельзя изменить извне. Нет разделяемой памяти между разными SIP, нет сигналов, только явный IPC. Также нет никаких модификаций кода изнутри - нет JIT, загрузчиков классов, динамических библиотек.

Чтобы гарантировать, что SIP действительно заблокированы, используются следующие ограничения:

  • SIP указывает только на свои собственные данные - никаких указателей на другие SIP

  • Никаких указателей на ядро

  • SIP получает монопольный доступ к памяти, которую ему предоставило ядро

  • SIP не может создавать новые указатели - указатели могут быть предоставлены из надежного источника, такого как ядро.

С этими ограничениями, несмотря на наличие общего адресного пространства, совместного использования данных нет.

Контрактные каналы

Можно думать о каналах как о возможностях. Каждый SIP может иметь несколько каналов, через которые можно создавать IPC (inter-process communication, межпроцессное взаимодействие). Например, открытый файл - это канал, полученный от файлового сервера. Если SIP получает этот канал, это означает, что у него есть разрешение на доступ к нему.

Программы на основе манифестов, MBP

Манифест описывает возможности, необходимые ресурсы и зависимости SIP. SIP ничего не может сделать без манифеста и каналов. При установке манифеста проверяется, что он соответствует всем требованиям безопасности, все его зависимости соблюдены и он не создает конфликта с ранее установленным манифестом. Например, манифест драйвера предоставляет «свидетельство» того, что он не имеет доступа к оборудованию другого драйвера.

Вот еще несколько рисунков и таблиц, иллюстрирующих сравнение Singularity и других хорошо известных операционных систем.

Заключение

Singularity - лишь одна из множества экспериментальных операционных систем. Её последний релиз был в ноябре 2008 года, и с тех пор проект был остановлен.

Вот исходный код на Github.

Tags:
Hubs:
Total votes 16: ↑14 and ↓2+12
Comments16

Articles