
Что будет, если прямо сейчас написать новую ОС с нуля? Можно ли сделать её лучше других? Можно ли повысить безопасность и надежность? Можно ли предотвратить непредвиденное взаимодействие между приложениями?
«Как бы выглядела программная платформа, если бы она была построена с нуля с основной целью "обеспечение надежности"?»
Это те вопросы, на которые команда Microsoft Research пыталась ответить около 18 лет назад, именно тогда они придумали довольно крутое название для своей новой ОС - 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.