ARWINSS
Содержание
Что такое ARWINSS?
ARWINSS (Another Realization of WIN32 SubSystem) представляет собой альтернативную реализацию подсистемы win32, предназначенную для упрощенного переноса WINE на платформы, отличные от unix. Ключевое изменение - переработка архитектуры в сторону модульности. В первую очередь, речь идет о "подменяемости" графического вывода.
В настоящее время в Wine использует промежуточный "слой совместимости" с графической подсистемой конкретной платформы, на которой он работает. В linux/*nix этот слой представляет собой "драйвер" winex11.drv, перенаправляющий графический вывод Wine на X Windows System. В ARWINSS, удалось сделать замену этому "драйверу", под названием winent.drv, использующую графические возможности соответствующей ему части ядра ReactOS/Windows, и получив фактически работающие в ReactOS библиотеки user32 и gdi32 из Wine.
Так как код user32/gdi32 в Wine является протестированным и относительно надёжным, предполагается, что ARWINSS обеспечит большую совместимость с приложениями, чем нынешняя реализация win32 в ReactOS, содержащая "кашу" из разных версий Wine с вкраплениями собственного кода ReactOS той или иной степени актуальности. Кроме того, ARWINSS позволит обмениваться с проектом Wine гораздо большим количеством кода, а также использовать "дешевые" (не требующие значительного времени разработчиков) синхронизации с Wine библиотек user32 и gdi32.
Таким образом, ARWINSS должна (по крайней мере, теоретически) обеспечить работоспособность в ReactOS как минимум всех тех программ, которые работают в последних версиях Wine.
Анонс ARWINSS в рассылке [ros-dev]
Обращения к разработчикам в списке рассылки reactos: |
---|
All, today I would like to officially announce the (sub)project I was working on for the last half a year, and make a call to developers to participate.
Aleksey Bragin. The presentation: (links to further information are in the presentation too) |
Перевод на русский язык, опубликованный на open-life.org: |
---|
Сегодня я хотел бы официально представить (под)проект, над которым я работал в течение последнего полугодия и пригласить поучаствовать остальных разработчиков.
Алексей Брагин. |
Подробное описание:
Критика существующей Win32-подсистемы ReactOS
Основная Win32-подсистема в ReactOS берёт своё начало в 1999 году. Была проделана большая работа по созданию различных её частей, в работе принимали участие многие разработчики Wine. Совместима по системным вызовам win32k.sys, и только местами очень отдалённо напоминает архитектуру Win32-подсистемы Windows XP. Единственная хорошая часть – это графический код в win32k.sys, всё остальное – сочетание старого Wine и собственного кода. Над этой подсистемой работали более 30 человек, большая часть работы – это синхронизация старого кода с Wine’ом. Т.е. фактически пустая работа. Ещё один минус в том, что архитектура Win32-подсистемы в Windows по «красоте» очень далека от совершенства архитектуры ядра NT, и поэтому нет смысла полностью его копировать.
Решение проблемы – Win32-подсистема, версия 2.0.
Возникло естественное желание – сделать лучше, свести затраты на обслуживание на минимум, использовать существующий код по-максимуму. Попытки сделать это предпринимались в ReactOS неоднократно, но все заканчивались полной неудачей. Кроме одной, под названием Arwinss. В её основу легло очень простое решение: Если Wine работает настолько хорошо, и если код Wine всё-равно используется сейчас (но приходится тратить кучу времени на то, чтобы найти куски этого кода, разобраться, синхронизировать этот код с новым Wine, найти то, что от него зависит и ломается, и всё это время потраченное зазря), то почему бы не сделать новую Win32-подсистему именно на основе Wine.
Описание Win32-подсистемы в Windows
Картинка и описание с сайта Microsoft:Как мы видим, подсистема Win32 включает в себя Win32 API, в виде библиотек, таких как KERNEL32.DLL, GDI32.DLL, и USER32.DLL. Интересно отметить, что начиная с Windows NT 4.0, Microsoft переместила часть подсистемы Win32 из пользовательского режима в режим ядра. В частности, драйвер устройства режима ядра Win32k.sys управляет отображением окон, выводом на экран, ввод с клавиатуры и мышки, и передачей сообщений. Он также содержит библиотеку интерфейса графического устройства (GDI.DLL), что используется для отображения графических изображений и текста.
Как все работает в Windows NT. Приведу очень упрощенную картину. Есть ядро и компания. Есть файл win32k.sys который грубо говоря находится в ядре и отвечает за обмен информацией между видеокартой(как видно из описания выше не только видеокартой, но упростим для понимания) через драйвер той же видеокарты с пользовательским режимом. Для чего это нужно? Чтоб информация полученная win32k.sys от видеокарты была через загрузчик библиотек ntdll.dll передана в режим пользователя, где она будет принята подсистемой Win32. То есть информация от видеокарты в конечном итоге надходит к библиотекам (читать файлам) GDI32.DLL, и USER32.DLL, которые отвечают за прорисовку окон и их составляющих а также вывод графических изображений и текста.
Архитектура Arwinss
Arwinss состоит из 4-х модулей: USER32.DLL, GDI32.DLL, Драйвер - WINENT.DRV или WINEX11.DRV, WIN32K.SYS:
- USER32.DLL - отрисовка окон и т.д.
- GDI32.DLL - отрисовка графики
- WINENT.DRV - gdi "драйвер" (переходник)
- WIN32K.SYS - обрабатывает информацию от видеокарты в режиме ядра
Дополнительно:
- WIN32CSR.DLL - реализует необходимые части подсистемы CSR наряду с обработкой пользовательского ввода
- FREETYPE.DLL - нужен GDI32.DLL для рендеринга текста
Модули USER32 и GDI32 представляют собой практически неизменённый код этих же модулей в Wine (изменения касаются лишь только способов вызова Wine сервера, которые в данном случае представляют собой системный вызов в Win32k.sys). WINENT.DRV – это Windows/ReactOS-специфичный user/gdi «драйвер» (драйвер в понятии Wine,
не в понятии Windows) для выполнения быстрых операций с графикой и поддержки окон. WINEX11.DRV – это опциональный модуль, в основном использовался для тестирования. Его задача точно такая же, как и в самом Wine.WIN32K.SYS – низкоуровневая поддержка графических операций (с аппаратным ускорением), реализация небольшой части Wine сервера, и минимальная реализация поддержки Win32 для ядра.
Таким образом, используя эту подсистему, мы получаем:
- Лёгкую синхронизацию с новыми версиями Wine (т.е. команда Wine фактически работает на нас, что существенно ускоряет разработку)
- Более 10 000 программ из appdb.winehq.org становятся поддерживаемыми, плюс все те программы, которые не может запускать сам Wine в силу своих ограничений
- Хороший исходный код
И оставляем всё худшее в Wine, а именно:
- Ужасную эмуляцию NT-ядра
- Неправильные цепочки вызовов в kernel32/ntdll
- ntoskrnl.exe
- Очень медленное взаимодействие с Wine-сервером
- Сам по себе Wine-сервер
- Связанные с UNIX зависимости
Текущее состояние
Подсистема работоспособна, но есть ряд ошибок, которые специфичны именно для Arwinss. Т.е. их нет в Wine, их нет в ReactOS, но есть в Arwinss. Подсистема основана на уже достаточно старом релизе Wine.
Ссылки
- Презентация "ARWINSS The new Windows subsystem for ReactOS/Windows" (en.) Медиа:Arwinss.pdf
- Установка, тестирование и отладка, а также общая информация
- Техническая информация об Arwinss
- Arwinss в JIRA-трекере
- Видеозапись семинара "ARWINSS: новая win32-подсистема ReactOS"
- Скачать сборку ReactOS-ARWINSS
- Новости:
- Письмо в рассылку ros-dev "Arwinss presentation"