Введение
Операционная система реального времени
RTLinux — это микроядро операционной системы реального времени (RTOS), которое запускает всю операционную систему Linux как полностью вытесняемый процесс. Свойство жёсткого реального времени позволяет управлять роботами, системами сбора данных, производственными предприятиями и другими приборами и машинами, критичными ко времени, из приложений RTLinux. Дизайн был запатентован. Несмотря на схожее название, он не связан с проектом Real Time Linux от Linux Foundation. RTLinux был разработан Виктором Йодайкеном, Майклом Барабановым, Кортом Дуганом и другими в Институте горнодобывающей промышленности и технологий Нью-Мексико, а затем как коммерческий продукт в FSMLabs. Wind River Systems приобрела встраиваемые технологии FSMLabs в феврале 2007 года и выпустила версию под названием Wind River Real Time Core для Wind River Linux. С августа 2011 года компания Wind River прекратила поддержку линейки продуктов Wind River Real Time Core, что фактически положило конец коммерческой поддержке продукта RTLinux.
Предыстория
Основной целью разработки RTLinux было добавление возможностей жесткого реального времени в стандартную операционную систему для упрощения разработки сложных управляющих программ, обладающих обеими этими возможностями. Например, можно было разработать контроллер двигателя в реальном времени, использующий стандартную базу данных и предоставляющий веб-интерфейс оператора. Вместо попытки создать единую операционную систему, поддерживающую как возможности реального, так и нереального времени, RTLinux был разработан для совместного использования вычислительного устройства операционными системами реального и нереального времени таким образом, чтобы (1) операционная система реального времени никогда не блокировалась операционной системой нереального времени и (2) компоненты, работающие в разных средах, могли легко обмениваться данными. Как следует из названия, изначально RTLinux был разработан для использования Linux в качестве системы нереального времени, но в конечном итоге ядро RTCore реального времени стало поддерживать как Linux, так и Berkeley Software Distribution (BSD) Unix. Multi Environment Real Time (MERT) был первым примером операционной системы реального времени, сосуществующей с системой Unix. MERT использовал традиционные методы виртуализации: ядро реального времени выступало в роли операционной системы хоста (или гипервизора), а Bell Systems Unix – в роли гостевой системы. RTLinux был попыткой обновить концепцию MERT для эпохи ПК и стандартного оборудования. Это также была попытка преодолеть ограничения производительности MERT, особенно накладные расходы, связанные с виртуализацией. Вместо инкапсуляции гостевой ОС в виртуальную машину, RTLinux виртуализировал только управление прерываниями гостевой системы. Этот метод позволил ядру реального времени преобразовать гостевую операционную систему в полностью прерываемую систему, которая при этом могла напрямую управлять, например, устройствами хранения. В частности, стандартные драйверы для гостевой системы работали без изменения исходного кода, хотя их необходимо было перекомпилировать для использования виртуализационных "перехватчиков". См. также паравиртуализацию. Механизм Unix pipe был адаптирован для обеспечения связи между программами реального и нереального времени, хотя также были добавлены и другие методы, такие как общая память. С точки зрения программиста, RTLinux изначально представлял собой небольшую потоковую среду для задач реального времени и стандартную среду Linux для всего остального. Операционная система реального времени была реализована в виде загружаемого модуля ядра, который начинал с виртуализации управления прерываниями гостевой системы, а затем запускал планировщик реального времени. Задачам назначались статические приоритеты, а планирование изначально основывалось исключительно на приоритетах. Гостевая операционная система включалась как задача с наименьшим приоритетом и фактически действовала как задача простоя для системы реального времени. Задачи реального времени выполнялись в режиме ядра. В последующей разработке RTLinux был принят Portable Operating System Interface (POSIX) и API POSIX threads, а затем была разрешена возможность создания потоков в пользовательском режиме с потоками реального времени, работающими внутри гостевых процессов. В многопроцессорных средах потоки привязывались к ядрам процессора, и можно было предотвратить запуск гостевого потока на определенном ядре (фактически резервируя ядра исключительно для обработки в реальном времени).
Реализация
RTLinux предоставляет возможность запуска специальных задач реального времени и обработчиков прерываний на той же машине, что и стандартный Linux. Эти задачи и обработчики выполняются, когда это необходимо, независимо от текущей деятельности Linux. В худшем случае время между моментом обнаружения аппаратного прерывания процессором и моментом начала выполнения обработчика прерывания составляет менее 15 микросекунд на RTLinux, работающем на типовой платформе x86 (приблизительно 2000 года). Периодическая задача RTLinux выполняется в пределах 35 микросекунд от запланированного времени на том же оборудовании. Эти показатели ограничены аппаратными возможностями, и с улучшением аппаратного обеспечения RTLinux также будет совершенствоваться. Стандартный Linux обладает отличной средней производительностью и может даже обеспечивать точность планирования на уровне миллисекунд для задач, использующих возможности мягкого реального времени POSIX. Однако стандартный Linux не предназначен для обеспечения субмиллисекундной точности и надежных временных гарантий. RTLinux был построен на основе легковесной виртуальной машины, в которой "гостевой" системе Linux был предоставлен виртуализированный контроллер прерываний и таймер, а ко всему остальному оборудованию осуществлялся прямой доступ. С точки зрения "хоста" реального времени, ядро Linux является потоком. Прерывания, необходимые для детерминированной обработки, обрабатываются ядром реального времени, а остальные прерывания перенаправляются в Linux, который работает с более низким приоритетом, чем потоки реального времени. Драйверы Linux обрабатывали почти весь ввод-вывод. Для обмена данными между операционной системой и RTLinux можно использовать FIFO-каналы (First In, First Out) или общую память.
Цель
Основная цель разработки RTLinux – создание системы, которая была бы прозрачной, модульной и расширяемой. Прозрачность подразумевает отсутствие недоступных "черных ящиков" и возможность определения стоимости любой операции. Модульность означает, что можно исключить ненужную функциональность и связанные с ней затраты. А расширяемость – возможность для программистов добавлять модули и настраивать систему под свои задачи. Базовая система RTLinux обеспечивает только высокоскоростную обработку прерываний. Она включает простой планировщик приоритетов, который легко заменить на планировщики, лучше подходящие для конкретных приложений. При разработке RTLinux особое внимание уделялось максимальному использованию преимуществ Linux и его широких возможностей.
Основные компоненты
RTLinux имеет структуру, состоящую из небольшого базового компонента и набора дополнительных компонентов. Базовый компонент обеспечивает установку обработчиков прерываний с крайне низкой задержкой, которые не могут быть задержаны или прерваны самой системой Linux, а также некоторые подпрограммы синхронизации и управления прерываниями низкого уровня. Этот базовый компонент был расширен для поддержки SMP и одновременно упрощен за счет исключения части функциональности, которую можно реализовать вне ядра.
Функции
Большинство функций RTLinux реализованы в наборе загружаемых модулей ядра, предоставляющих дополнительные сервисы и уровни абстракции. Эти модули включают в себя:
rtl sched – планировщик приоритетов, поддерживающий как облегченный интерфейс POSIX, описанный ниже, так и оригинальный API RTLinux V1. rtl time – модуль, управляющий тактовыми частотами процессора и экспортирующий абстрактный интерфейс для подключения обработчиков к тактовым сигналам. rtl posixio – обеспечивает поддержку интерфейса чтения/записи/открытия в стиле POSIX для драйверов устройств. rtl fifo – соединяет задачи RT и обработчики прерываний с процессами Linux через уровень устройств, позволяя процессам Linux читать и записывать данные в компоненты RT. semaphore – пакет, разработанный Джерри Эпплином, предоставляющий задачам RT блокирующие семафоры. Поддержка POSIX mutex планируется к реализации в следующем незначительном обновлении RTLinux. mbuff – пакет, написанный Томашем Мотилевским, для организации разделяемой памяти между компонентами RT и процессами Linux.
Задачи в реальном времени
Задачи RTLinux, работающие в режиме реального времени, реализуются в виде модулей ядра, аналогичных модулям, используемым Linux для драйверов, файловых систем и так далее. Задачи реального времени имеют прямой доступ к аппаратному обеспечению и не используют виртуальную память. При инициализации задача (модуль) реального времени сообщает ядру RTLinux о своих ограничениях по срокам, периоду и времени выпуска.