Мир Unix застыл на отметке System V. С тех пор ни один основной
принцип этой системы не претерпел сколь-либо существенных изменений. Однако рабочая группа
создателей Unix по-прежнему продолжала трудиться над новыми операционными системами, и
результатом их труда стали две системы нового поколения. Одна из них - Plan 9 - мощная
универсальная операционная система общего применения с встроенным оконным интерфейсом,
другая же - Inferno - является самой последней разработкой. Именно о ней сегодня пойдет
речь.
Система Inferno была создана в Bell Labs как виртуальная ОС, способная
работать как в собственном режиме, так и поверх любой из семи наиболее популярных платформ.
Типичные применения Inferno - встроенные системы, интернет-терминалы, интеллектуальные
мобильные и стационарные телефоны, системы автоматизации.
Открытый код и удивительная переносимость системы позволяют легко строить
распределенные системы - например, системы доставки мультимедиа по заказу (интерактивное
телевидение). Кроме того, система, устанавливаемая поверх любой операционной среды, может
служить основой построения сложных и динамичных сетевых топологий, в частности систем
распределенных вычислений. Встроенная оболочка, мощный язык программирования Limbo, поддержка
Tk и две оконные системы открывают для разработчиков возможности создания полноценных
приложений. Поддержка UNICODE делает эту систему еще более привлекательной для создания
деловых приложений - например, для создания торговых автоматов. Встроенные меры сильного
шифрования открывают Inferno двери в мир автоматизации банкинга и торговли. Наличие упрощенного
графического интерфейса позволяет создавать привлекательные приложения для развлечений
и образования.
И, в конце концов, изучение внутреннего строения Inferno послужит хорошим
примером системного программирования и теории операционных систем для любого учебного
заведения.
С приходом новых технологий - таких как кабельное и спутниковое телевидение,
широкополосный интернет и цифровая мобильная связь - возникла необходимость в интеграции
этих услуг, что позволило бы сделать их доступными настолько же, насколько сейчас доступна,
например, телефонная сеть. Однако в этих системах, в отличие от телефонии, задействованы
терминальные устройства различной вычислительной мощности и с различными возможностями
интерфейса. Появилась потребность в операционной системе, которая могла бы эффективно
работать на любом оборудовании в сетевом окружении - на устройствах от мобильного телефона
с 1 Мб оперативной памяти до мэйнфрейма с 1 Тб памяти и тысячами сетевых подключений.
Inferno был создана как исключительно переносимая и масштабируемая система для этого нового
рынка. Эта операционная система, в частности:
динамическая загрузка модулей позволяет, в зависимости от аппаратной части, загружать
различные интерфейсы - от текстовых для мобильных телефонов до трехмерных графических.
Эта технология позволяет также загружать драйверы и декодеры во время выполнения, что
делает ее практически идеально переносимой.
Inferno построена для работы в самых различных средах: телефонные сети
и службы сообщений, веб-серверы, кабельное интерактивное телевидение и радио, электронные
и автоматизированные торговые автоматы, информационные службы нового поколения (такие
как видеофоны). Кроме того, Inferno призвана использовать весь спектр как современных,
так и перспективных сетевых протоколов - простых модемов, ISDN, ATM, аналоговых вещательных
и кабельных сетей, кабельных модемов, цифрового видео на заказ и других потребительских
цифровых систем.
В качестве целевых устройств предполагаются персональные компьютеры,
игровые консоли, телевизионные приставки. В самих сетях система будет выполнять свои задачи
в качестве управляющего программного обеспечения для учета оплаты трафика, мониторинга
и наблюдения (sic хакерам). Особую роль Inferno должно сыграть в продвижении давно обещанного
интерактивного телевидения и действительно мобильных терминалов - оба направления развиваются
темпами, не оправдывающими надежд.
Inferno исключительно осторожно использует аппаратные ресурсы, хотя
при необходимости может задействовать любые возможности. Так, например, при воспроизведении
торгового каталога через POTS-модем на экране появится только текст, на ISDN уже смогут
воспроизводиться изображения, а по цифровому кабелю смогут быть продемонстрированы клипы
или трехмерные модели. Ясно, что не все поставщики услуг задействуют все возможности,
но, по крайней мере, на программном уровне нет никаких ограничений - они будут обусловлены
только лишь пропускной способностью сети, возможностями терминалов и серверной технологией.
Роль Inferno - создать инфраструктуру для приложений, так чтобы они
могли совместно использовать ресурсы виртуальной машины, в том числе библиотеки - от обработки
строк до сетевых протоколов и декодирования видео. Для приложений все ресурсы представляются
в виде файлов - от пульта дистанционного управления телевизором, MP3-плеера до базы данных
или сетевого протокола. Специальные протоколы созданы для взаимодействия приложений Inferno,
независимо от их физического расположения в сети.
Типичная архитектура предполагает работу Inferno на большом числе терминалов
и на нескольких мощных серверах, где Inferno будет использовать существующие системы баз
данных, транзакций и онлайновых платежей. Использование Inferno на стороне сервера значительно
упростит структуру приложений на стороне клиента, что может быть очень важно для экономии
ресурсов на "тонких" терминалах.
Задача приложения Inferno - создать двунаправленный поток данных между
сервером и пользовательским терминалом (сетевым компьютером, телевизионной приставкой,
видеофоном). Работа Inferno в значительной степени похожа на работу Plan 9, она использует
те же три основные принципа:
единый протокол Styx применяется ко всем ресурсам, локальным и удаленным.
Следуя первому принципу, все устройства представлены как файлы, в том
числе экран, кодек MP3 и сетевые протоколы. Как правило, устройство представлено
директорией с двумя файлами: data и ctl - для потока данных и команд управления соответственно.
Системные сервисы также представлены как файлы - например, сервер имен может быть присоединен
к файлу подходящим именем, например /net/dns, после чего для преобразования доменного
имени в адрес остается только записать в этот файл имя и прочитать из него адрес.
Основным связующим звеном этой архитектуры является протокол Styx,
который взаимодействует с драйверами устройств с одной стороны - и с драйвером монтирования
с другой. Драйвер монтирования реализован на уровне ядра и служит для разрешения символических
имен ресурсов в сети. Таким образом, если будет обнаружено, что имени соответствует удаленный
ресурс, то команды Styx будут переданы и выполнены на удаленной машине. Это делает возможным
присоединение (импорт) части удаленной файловой системы для использования в частном адресном
пространстве. Для демонстрации этого принципа можно представить, что телевизионная приставка
вряд ли будет реализовать функции сервера DNS. Вместо этого она импортирует /net/dns с
удаленного сервера в собственное адресное пространство, после чего любое приложение сможет
преобразовывать символические имена в сетевые адреса, не выходя за рамки частного пространства
имен.
Протокол Styx лежит над любым транспортным протоколом, одинаково хорошо работая поверх
TCP/IP, PPP, ATM или различными протоколами беспроводной связи.
Приложения Inferno написаны на новом языке Limbo, созданном специально
для программирования Inferno. Язык во многом наследует C и Pascal и поддерживает стандартные
типы данных и, кроме того, несколько типов высокого уровня: списки, строки, динамические
массивы и абстрактные типы. Дополнительно Limbo содержит несколько возможностей для прямого
доступа к возможностям виртуальной машины. В частности доступны каналы, передающие сложные
типы данных (включая сами каналы) между частями приложения на различных машинах.
Многозадачность поддерживается непосредственно на уровне языка, так
что после разделения потоков можно ожидать их завершения командой alt. Потоки и каналы
- два инструмента, обеспечивающих простое и надежное взаимодействие приложений в сети.
Программы Limbo построены в виде модулей, которые являются строительными
элементами программ и представляют собой фрагменты с хорошо определенным интерфейсом,
экспортирующим методы, абстрактные типы и константы. Модули получают управление динамически,
во время выполнения, с помощью вызова load получая указатель на модуль. Это очень похоже
на динамические вызовы Java или динамическую загрузку в Flash и служит той же цели - оптимизации
сетевого трафика. Так, если модуль запуска определит, что устройство не имеет звукового
канала, то кодек и звуковой поток никогда не будут загружены.
Язык Limbo сильно типизованный, поскольку все указатели проверяются
трижды: во время компиляции, загрузки и вызова. Программы Limbo работают безопасно на
машинах без аппаратной защиты памяти, поскольку виртуальная машина поддерживает свое адресное
пространство. Все объекты являются потенциальными клиентами сборщика мусора, который встроен
в само ядро виртуальной машины. Отслеживаются ссылки на системные объекты так же, как
и на пользовательские. Таким образом, если приложение завершается, то все системные ресурсы,
такие как окна и каналы, на которые больше нет ссылок, также освобождаются.
Текст программы Limbo компилируется в байт код виртуальной машины Dis.
В отличие от Java, где используется стековая организация команд, виртуальная машина Dis
использует трехадресные команды, дополненные несколькими высокоуровневыми командами для
строки и массивов. Сборка мусора и многопоточное выполнение реализованы под уровнем Dis,
так что программы не должны (и практически не могут) влиять на эти процессы. Поток Dis-команд
опционально может быть очень эффективно преобразован в команды процессора JIT-компилятором,
поскольку команды Dis выбраны с учетом максимального приближения к командам распространенных
моделей процессоров. Результирующий код выполняется со скоростью, сравнимой со скоростью
программ на С.
Под уровнем виртуальной машины Dis лежит ядро Inferno, в которое входят
интерпретатор и JIT-компилятор, система управления памятью (включая сборщик мусора), планировщик
потоков, драйверы устройств, стеки протоколов и тому подобное. Ядро также содержит систему
разрешения имен (драйвер монтирования), которая определяет, где находится запрашиваемый
ресурс, и передает, в случае необходимости, поток Styx команд на удаленную машину.
Наконец, виртуальная машина содержит несколько встроенных библиотек,
таких как модуль Sys, производящий системные вызовы и предоставляющий несколько дополнительных
функций (вроде установки соединения и манипуляций со строками). Модуль Draw является базовой
графической библиотекой, обрабатывающей растровую графику, шрифты и окна. Модуль Prefab,
основанный на Draw, создает интерактивные гипертекстовые элементы для отображения в окнах,
которые могут быть прокручены, выбраны или интерактивно изменены методами Prefab. Модуль
Tk представляет реализацию Tk для программирования из Limbo. Модуль Math содержит распространенные
математические функции.
При запуске приложения Inferno создает частное окружение времени выполнения,
то есть к моменту запуска программа получает определенную структуру ресурсов. При этом
программа без перекомпиляции или каких-то изменений в коде может выполняться на различных
устройствах, типично расположенных на нескольких сетевых компьютерах.
В собственном режиме система содержит драйверы физического уровня для
обработки прерываний, записи в порты и прочих операций. В режиме работы под другой операционной
системой обработка передается сервисам той системы, на которой установлена inferno. В
целях максимальной переносимости Inferno написана на стандартном C - и ее компоненты,
в основном, не зависят от платформы.
Особое внимание в Inferno уделено безопасности. Внешние каналы могут
быть снабжены подписью и/или зашифрованы. После установки соединения шифрование прозрачно
для приложения. Обмен ключами происходит по стандартному протоколу обмена открытыми ключами.
Система безопасности Inferno поощряет доверительные соединения между
клиентами и серверами. Приватные адресные пространства позволяют адресовать разделенные
ресурсы, причем дополнительно доступ к файлам может быть ограничен обычными для файловой
системы Юникс атрибутами. Это касается данных, коммуникационных ресурсов и исполнительных
модулей, составляющих приложение. Чувствительные к защите ресурсы можно получить, только
вызывая модули, их предоставляющие; добавление файлов и модулей в адресное пространство
- операция, управляемая аутентификацией. Например, если в адресном пространстве удалены
сетевые протоколы - то они недоступны и создать соединение невозможно. Объектные модули
могут быть подписаны достоверными субъектами, и потом их подпись может быть запрошена.
Хотя все эти механизмы могут быть использованы одновременно, но встроенная
подпись соединения и шифрование трафика делают работу приложения безопасной даже без применения
всех этих мер. Аутентификация и подпись производится на основании открытого криптографического
ключа. Открытые ключи сертифицируются службами сертификации Inferno или другого провайдера,
что выражается в подписи открытого ключа своим открытым ключом.
Шифрование используется для непрерывного шифрования трафика и самого
процесса аутентификации. Механизмы включают системы дайджестов SHA, MD4 и MD5, открытые
ключи Elgamal и верификацию подписей, шифрование RC4, шифрование DES и обмен открытыми
ключами по схеме Diffie-Hellman. Открытые подписи используют ключи до 4096 бит, по
умолчанию - 512 бит.
Упомянутые возможности - только часть той информации, о которых следовало
бы рассказать. В частности, ничего не сказано о командной оболочке sh, программировании
Limbo, встроенном Tk (!) и использовании mount и bind для настройки среды окружения.
Если вы интересуетесь развитием теории и практики операционных систем
и хотите исследовать новый мир пост-Юникс, то вашим следующим действием должна быть установка
Inferno на свой компьютер. Получить копию Inferno вы можете по
адресу.
Попутно посмотрите примеры простых
программ на Limbo в исполнении IE plug-in, которые демонстрируют производительность и
компактность кода.
Не буду пересказывать инструкцию по инсталляции, отмечу только, что
вам нужно получить две части. Во-первых, собственно Inferno - независимый от платформы
фрагмент кода inferno.tgz (13 Мб). Затем следует получить порт - зависимую от платформы
виртуальную машину.
Представленная в разделе Manual документация проводит начальный экскурс
в основные принципы системы, но для разработчика встроенных систем понадобится коробочная
версия с полной документацией ($100 за полную поставку), поскольку только она содержит
средства компиляции ядра. Бесплатная версия может работать только поверх другой операционной
системы, но не в собственном режиме. Компилятор встроенных систем с архивом драйверов
включен в лицензионную поставку, в том числе драйвера для любой стандартной конфигурации
PC, равно как и для карманных устройств, например iPAQ или Palm.
Единственным, на мой взгляд, препятствием на пути использования Inferno
может стать нехватка кириллических шрифтов и раскладок. Эта проблема решаема, поскольку
Inferno изначально UNICODE-enabled - то есть в самой системе нет ни одного участка кода,
который мог бы конфликтовать с интернациональными символами. Благодаря своей интернациональности,
Inferno был выбран в качестве платформы для видеотелефонной службы в Тайване и системы
торговых аппаратов в Китае - так что, как видно, проблема решаема даже для иероглифов.
Но, тем не менее, разработчику придется приложить определенные усилия для украинизации
Inferno.
Мне бы очень хотелось надеяться, что эта статья станет для вас стимулом
к действию. Если кто-то разделит мои симпатии к этой системе - прошу держать связь. Это
относится и к организациям, располагающим потенциалом и заинтересованным в создании интеллектуальных
встроенных систем, а особенно - к учебным заведениям, где исследование операционных систем
является частью учебной программы. Люди на Vita Nuova доступны по электронной почте и
открыты для решения практических вопросов, так что, при необходимости, свободно обращайтесь
к ним. Кроме того, любой желающий может внести свой вклад в перевод документации, которая
потом будет выложена в Сети (пока что она поселилась на бесплатной территории)
- переводы присылайте по почте.