Введение 4
1. Постановка задачи 6
2. Обзор существующих решений 7
2.1. Интерфейс прикладного программирования 7
2.2. Эмуляция Linux в ОС FreeBSD 8
2.3. Слой совместимости на основе виртуализации 8
2.4. Windows Subsystem for Linux 9
2.5. Windows Subsystem for Linux 2 10
2.6. Семейство микроядер L4 10
2.7. Библиотека Linux Kernel Library в ОС Embox 11
2.8. Проект SGX-LKL 11
2.9. Анализ и сравнение различных решений 12
3. Архитектура 14
3.1. Библиотека LKL как паравиртуализированное ядро 14
3.2. Обработка системных вызовов Linux 15
3.3. Соответствие потока ОС задаче Linux 16
3.4. Обзор итоговой архитектуры 17
4. Особенности реализации 19
4.1. Модуль подсистемы Linux в ОС Embox 19
4.2. Запуск сторонних исполняемых файлов 19
4.3. Вывод текста из LKL в терминал ОС Embox 20
5. Тестирование и апробация 22
Заключение 27
Список литературы 28
На сегодняшний день в мире существует большое количество операционных систем (сокр. ОС). Различные системы используются в разных областях и устанавливаются на все типы устройств: от простых маршрутизаторов до высоконагруженных вычислительных машин. Разработка и поддержка ОС — трудоёмкий процесс. Разработчики должны обеспечить систему всеми необходимыми служебными инструментами, драйверами и прикладными программами. Для этого приходится заниматься либо созданием программного обеспечения с нуля, либо адаптацией программного обеспечения из других ОС.
Среди множества ОС можно выделить широкораспространённое семейство GNU/Linux1, на сегодняшний день включающее в себя более 200 систем [5]. Проект ядра Linux, состоящий более чем из 27 миллионов строк исходного кода и насчитывающий более 20 тысяч разработчиков (данные на 2020 год) [10], является одним из крупнейших программных проектов в мире. Создаваемое для систем GNU/Linux программное обеспечение проверено временем и сообществом пользователей, поэтому некоторая его часть могла бы использоваться в других ОС, даже узкоспециализированных.
Таким образом, ускорить разработку и упростить использование разных ОС могла бы возможность запуска в их среде исполняемых файлов и библиотек, скомпилированных для систем GNU/Linux — слой двоичной совместимости. Слой двоичной совместимости с GNU/Linux в разном виде реализован в некоторых проектах, таких как система FreeBSD [17][9], семейство ОС Windows [4][2], ряд микроядер L4 [16]. Каждое решение спроектировано и реализовано для конкретной системы, поэтому их сложно или практически невозможно адаптировать для других ОС. Однако, эти решения можно проанализировать, чтобы выделить наиболее удачные технические особенности.
Свободная ОС реального времени для встроенных систем Embox [24], история разработки которой берёт начало на математико-механическом факультете Санкт-Петербургского государственного университета, является одним из тех проектов, для которых быстрое привнесение простого слоя двоичной совместимости с GNU/Linux могло бы облегчить разработку и удобство использования системы. Возникает идея реализовать слой двоичной совместимости с GNU/Linux в виде такой подсистемы для Embox, архитектура которой будет относительно простой и не будет зависеть от особенностей конкретной ОС. Такая архитектура сможет быть использована в реализациях подсистемы для разных ОС, а разработанная для ОС Embox подсистема будет служить основой для прочих реализаций.
В рамках данной работы были достигнуты следующие результаты.
• Проведён анализ существующих в разных ОС реализаций слоя двоичной совместимости с GNU/Linux. Выделены два подхода: эмуляция и паравиртуализация. Сделан выбор в пользу метода паравиртуализации ядра Linux.
• Разработана архитектура подсистемы двоичной совместимости с GNU/Linux, которая может быть реализована в ряде разных ОС. Это достигается за счёт использования библиотеки LKL в качестве паравиртуализированного ядра.
• На основе разработанной архитектуры реализована и настроена подсистема для ОС Embox.
• Проведена апробация созданной подсистемы. В Embox запущены демонстрационные приложения linux_cat и linux_ls. Продемонстрирована работа с файловой системой procfs.
Логичным продолжением данной работы будет являться исследование возможности поддержки слоем совместимости разделяемых библиотек и запуска двоичных файлов, скомпонованных динамически. В частности, поддержка библиотеки GLIBC (как разделяемой) сильно увеличит область применимости предлагаемого слоя двоичной совместимости.