Заседание научно-практического семинара, организованного ВМК МГУ и ИСП РАН 18 декабря 2014 года. Темой семинара стала операционная система ReactOS.
Видео этой презентации: http://www.youtube.com/watch?v=o68BZ2GT-FM
Веб-сайт ОС ReactOS: http://www.reactos.org
Группа ВК: https://vk.com/reactos_ru
2. ReactOS – это (не) Windows
22 января 1996 – первый коммит
ReactOS - это Windows
◦ Выполняет Windows-приложения
◦ Поддерживает Windows-драйвера
◦ Выглядит как Windows
ReactOS – это не Windows
◦ ReactOS – Свободное ПО
◦ ReactOS использует другие СПО проекты
◦ Можно сделать “свой собственный Windows”
3. Об авторе
Алексей Брагин – Москва, Россия
◦ Разработчик ReactOS с 2003 года
◦ Президент Фонда ReactOS и Координатор проекта
◦ Степень магистра, МГТУ им. Н.Э.Баумана
◦ Преподаватель, кафедра ИУ9, МГТУ им. Н.Э.Баумана
◦ Электронная почта: ALEKSEY@REACTOS.ORG
4. Об авторе
◦ Первый патч в ReactOS: 24 марта 2003
◦ Первый коммит: 9 апреля 2003
◦ Всего около 4803 коммитов в ReactOS
6. ReactOS это Windows
Для максимальной совместимости ReactOS реализует архитектуру,
идентичную Windows
◦ Windows-драйверам нужно ядро Windows
◦ Многие программы (firewalls, antivirus, media players, PDA sync software,
etc.) поставляются со специальными драйверами
Архитектура Windows существенно отличается от Linux и не так
хорошо известна
Начнём с основ…
7. Архитектура ОС
Абстракция ЦП - времени и контектса (processes, threads, signals,
etc.)
Абстракция памяти (virtual memory, paging, stacks, heaps, etc.)
Разделение между системой и приложениями используя
встроенные в ЦП механизмы защиты памяти (user mode vs kernel
mode)
Разделение между «железом» и приложениями используя
встроенные в ЦП механизмы привилегий ввода/вывода
Механизмы обхода защит ОС управляемым, безопасным образом
(system calls, security subsystem, etc.)
9. Архитектура Linux
Монолитное ядро. У ядра нет ABI
Модель управления процессами и модель безопасности UNIX
Встроенная поддержка сети
◦ Sockets, pipes
◦ select, poll, etc.
Абстракции файловой системы (VFS)
UNIX API (libc) поверх небольшого количества UNIX-подобных
системных вызовов и сигналов
Остальные APIs (audio, application setup, desktop environment
integration, cryptography, etc.) - de facto стандарты от сторонних
разработчиков
◦ Графическая подсистема (X server) – вещь в себе. В ядре есть специальные
“backdoors” для прямого взаимодействия X сервера с аппаратуров, чтобы
вынести сложность видео-драйверов из окружения ядра
10. Архитектура Linux
Интерфейс системных вызовов
VFS PM MM
Arch Драйвера устройств
Сетевой
стэк
ЦП MMUДиск Устройства
libc
Библиотеки приложений
Приложения X сервер
Видеокарта
Ядро
Системные вызовы Сигналы Прямой I/O
User mode
Kernel mode
Virtual
Physical
11. Архитектура Windows (NT)
Монолитное ядро (гибридное). У ядра относительно стабильный ABI
Архитектура ядра почти идентична дизайну DEC RSX-11 и VMS, с влиянием DOS, OS/2
и Windows 95
◦ RSX-11, VMS и Windows NT были спроектированы одним и тем же инженером (Dave Cutler)
◦ Первоначально Windows NT разрабатывалась как новое ядро для OS/2
В ядре нет абстракции устройств. Абстракция предоставляется стандартными
системными драйверами (class или port драйвера)
В самом ядре нет поддержки сети. select/poll – не системные вызовы, а ioctl запрос
к “файловой системе сокетов”
◦ Сокеты и пайпы предоставляются специальными файловыми системами
◦ Над этим ещё один уровень абстракции в режиме пользователя: Winsock когда-то был
сторонним компонентом (напр. Trumpet Winsock)
Графическая и оконная подсистемы в составе ОС (работающие в режиме ядра) со
стандартным API
Богатое высокоуровневое API всех сортов (криптография, desktop environment, etc.)
12. Особые черты архитектуры
Windows
Устройства чипсета (таймер, контроллер прерываний, управление
питанием, шины, firmware, и т.п.) абстрагируются с помощью
компонента ядра под названием Hardware Abstraction Layer (HAL)
◦ ACPI и не-ACPI – просто разные HAL
◦ Порт ReactOS на приставку XBox - обычный x86 ReactOS со специальным
XBox-специфичным HAL
Сигналы отсутствуют; вместо них standard exception model (“SEH”,
которая была на VMS, OS/2 и Tru64)
Обратные системные вызовы (callbacks): оконная и графическая
подсистемы могут делать обратные вызовы в режим пользователя
◦ В оригинальной реализации (Windows 95) user-mode и kernel-mode части
подсистемы работали в разделяемой памяти
◦ Это слишком небезопасно для Windows NT; безопасная но совместимая
разделяемая память эмулируется с помощью некоторых «ухищрений» (типа
callbacks)
15. ReactOS это (не) Wine
“Раз ReactOS – это только ядро для Wine…
◦ … зачем оно нужно?”
◦ … и почему до сих пор не доделано?”
Как всегда, всё немного сложнее, чем кажется на первый взгляд…
16. Wine и ReactOS
У ReactOS много общего с Wine, в том числе и исходного кода…
◦ Достаточно общих целей:
◦ Установка Windows приложений
◦ Выполнение Windows приложений
… но…
◦ Слишком много разных целей:
◦ Работа на Linux / работа на «железе»
◦ Поддержка Windows драйверов
17. Wine на Linux
Windows приложения загружаются только утилитой Wine (Wine
loader)
Windows приложения и DLL динамически линкуются с системными
Windows DLL, реализованными Wine
◦ Большинство Wine DLL – обычные Windows DLL скомпилированные под
Linux
◦ Некоторые – внутренние библиотеки Linux, зависящие от других
библиотек Linux. Библиотеки Linux прозрачны для Windows приложений
– во всех отношениях работают как системные вызовы
Служебный процесс (Wine Server) заменяет ядро Windows для
управления общими ресурсами
18. Wine на Linux
Ядро Linux
GNU libc
Библиотеки Wine
User mode
Kernel mode
Библиотеки Linux
Загрузчик Wine
X сервер
Wine сервер
Windows приложения
Wine services
19. Wine в ReactOS
Windows приложения загружаются непосредственно ядром
ReactOS
Windows приложения и DLL динамически связываются с Wine и
ReactOS реализаций системных библиотек Windows
◦ Могут быть использованы только те Wine DLL, которые не зависят от
библиотек Linux
◦ user32 & gdi32 – особый случай, в ReactOS - «native» реализация, не
использующая Wine DLL.
ReactOS реализует настоящее ядро Windows
◦ Может поддерживать приложения и драйвера
20. User mode
Kernel mode
Wine в ReactOS
Kernel
Executive
HAL
ntdll
kernel32
gdi32user32
System libraries
Службы
DirectX
Windows драйвера
win32k
Windows приложения
21. Wine на ReactOS: Arwinss
Если реализация оконной подсистемы не такая хорошая, почему бы
не использовать Wine?
Идея привела к эксперименту, результатом которого стала
альтернативная Win32 подсистема в ReactOS, которая
◦ Использует почти неизменённые исходные коды модулей USER32 и
GDI32 из Wine вместе с некоторыми компонентами Wine сервера
◦ Рабочий прототип был создан одним человеком в течение месяца
(существующая «native» реализация подсистемы в ReactOS находится в
состоянии разработки многие годы, и всё ещё полна проблем)
23. Arwinss: плюсы и минусы
Недостатки такого подхода
◦ Внутреннее устройство далеко от Windows
◦ Многие части работают в режиме пользователя (вообще-то это
преимущество!)
◦ Чуть медленнее (решаемо)
◦ Зависимость от Wine
Преимущества
◦ Простая синхронизация кода с Wine
◦ Использование кода Wine, который уже проверен в работе
◦ Более-менее определенная архитектура
◦ Fun!
24. Wine и ReactOS: итог
Wine предназначен для выполнения Windows-приложений под
Linux. Специфичные для Linux зависимости:
◦ … невидимы для приложений
◦ … являются интегральной частью реализации Wine
ReactOS предназначен для того, чтобы быть Windows:
◦ Всё, что возможно заимствуется из Wine
◦ То, что нельзя – переделывается правильным образом
◦ Реализация не может быть просто “функционально эквивалентной”:
должна быть “бинарно-совместима”, т.к. в Windows всё является API
◦ Не очень много кода других СПО проектов можно использовать
ReactOS сложен и незаменим
26. Команда ReactOS
Поистине “международный” проект
◦ Основан Jason Filby из Южной Африки
◦ Разработчики из разных стран мира – Евросоюза, России, США, и т.д.
◦ Сейчас, фонд в Российской Федерации, координатор проекта из России,
финансовый фонд в Германии, сообщество по всему миру
Нет формального обучения
◦ Почти все разработчики изучили внутреннее устройство Windows во время
работы над ReactOS
◦ К сожалению для проекта (и к счастью для них), лучших разработчиков
забирают на работу в Microsoft и другие крупные компании
Очень мало информации доступно
◦ “Inside Microsoft Windows” – справочник по внутреннему устройству
◦ … но этого недостаточно для разработки ReactOS
27. Ядро ReactOS
Многие разработчики работают над ядром ReactOS и подсистемами, с
переменным успехом
Хорошее состояние:
◦ Планировщик, HAL, менеджер процессов и потоков (спасибо Alex Ionescu!)
Удовлетворительное состояние:
◦ Подсистема ввода/вывода, менеджер конфигураций (реестр), менеджер
безопасности, менеджер памяти
Плохое состояние:
◦ Кэш-менеджер, поддержка файловых систем
Отсутствует:
◦ Управление питанием
Тем не менее, ядро ReactOS…
29. Оконная подсистема (USER)
Проблемы в этой области известны долгое время
Много разработчиков пробовали исправить ситуацию и не смогли
◦ Попытки переписать. Одна совершенно другая - Arwinss.
Оригинальная реализация в Windows - очень хороший hack…
◦ Оконная подсистема берёт свои истоки в Windows 1.0
◦ Порт на Windows NT привнёс защиту памяти, но API подразумевает общую
память
◦ Несколько ухищрений специально для безопасного симулирования общей
памяти – user32.dll не просто библиотека, а часть оконной подсистемы,
работающая в режиме пользователя
… и очень плохой дизайн
◦ Невозможно дать хорошее, высокоуровневое описание архитектуры
◦ Никто не документирует всю подсистему – официально или неофициально
30. Графическая подсистема (GDI)
Тесно связана с оконной подсистемой
Намного более простой, лучший дизайн
◦ gdi32.dll частично реализация подсистемы в режиме пользователя, для
запуска дисплей-драйверов режима пользователя (напр. драйвера
принтеров)
◦ Алгоритмы рисования хорошо изолированы, имеют простой API
◦ Весь код рисования шрифтов в ReactOS заимствован из FreeType (сторонний СПО проект)
Усилия концентрируются на более сложной (и видимой) оконной
подсистеме. Однако,
DirectX графика – это ещё одна совершенно другая область…
31. Сеть
Сетевой стэк в Windows располагается вне ядра
… но стэк разделён на независимые слои, с документированными
API между ними:
◦ Winsock
◦ TDI
◦ NDIS
Каждая часть должна быть реализована Windows-совместимым
образом
… но можно использовать сторонние СПО проекты с помощью
специальной Windows-совместимой «обёртки»
◦ Например, мы используем библиотеку lwIP для реализации стэка TCP/IP
33. Поддержка драйверов
Сторонние драйвера работают неплохо
◦ Видео драйвера, в частности
Сложные слои абстракции нуждаются в работе
◦ USB
◦ Аудио
◦ Сетевые карточки
Драйвера файловых систем (включая сетевые ФС) требуют много
работы в ядре над “большой тройкой” (кэш менеджер, менеджер
памяти, поддержка файловых систем)
34. USB
Реализованы основы USB-стэка Windows
◦ Дизайн совместим с Windows 2003 SP1
◦ USB-клавиатуры, мышки - работают
◦ Некоторые «флэшки» - работают
◦ Список поддерживаемых устройств доступен на сайте:
https://www.reactos.org/wiki/Supported_USB_Devices
35. Аудио подсистема
Она работает! И достаточно совместима
Сложно найти людей с опытом и знаниями звуковой подсистемы
Windows
36. Подсистемы ядра
Кэш менеджер – идёт работа
Порт на ARM принёс много позитивных результатов для общей
части менеджера памяти
Работа над улучшением качества в общем
37. Средства разработки
Основной компилятор - gcc
◦ Мы внесли значительный вклад в портирование gcc на Windows
(MinGW), т.к. мы самый крупный пользователь этого порта (и
находим там очень много ошибок!)
◦ Никто не предполагал, что MinGW будет компилировать ядро!
◦ MSVC поддерживается и активно развивается
◦ В перспективе – LLVM, работа уже идёт
• ReactOS использует среду CMake
– Удобнее, чем обычный make
– Лучше интеграция со средствами разработки под Windows
– Кросс-платформеннная
– Не зависит от компилятора
39. Студенты и ReactOS
ReactOS – наиболее продвинутая открытая реализация Windows-
совместимой ОС
Лучше, чем WRK для обучения основам ОС
◦ Нет доступа к исходным кодам Microsoft®
◦ Использование СПО для сборки и тестирования
◦ Большое сообщество
Студенческие проекты полезны для
◦ Поиска ошибок в коде
◦ Реализации отсутствующих или неправильно сделанных частей
40. итог
Вообще, Windows – достаточно неплохая операционная система!
ReactOS…
◦ … это (не) Windows: а 100% реализация Windows с открытым исходных
кодом
◦ … это не Linux: поддерживает Windows-драйвера
◦ … это не Wine: использует Wine, но Wine – только часть ReactOS
ReactOS сложен и уникален
ReactOS – это очень много работы