ReactOS стала ближе к запуску браузеров: в ядре появились задания

2026-08-24 205 комментарии
Код объектов задания в ReactOS ориентирован на поведение Windows до восьмой версии: вложенные задания и наборы заданий пока не поддерживаются. Работа продолжает линию на совместимость с более новыми выпусками Windows – летом в проект приняли первый системный вызов NT6, а в ReactOS запустили Half-Life 2

Поддержку объектов задания (job objects) приняли в основную ветку ReactOS 2026 года. Этот механизм ядра Windows объединяет процессы в группу с общими ограничениями и общим завершением; без него не запускаются современные браузеры и часть системных служб. В ядро вошли создание, открытие, назначение и завершение заданий, а также чтение и запись базовых ограничений. Число ошибок в связанных с заданиями тестах Wine kernel32 после этих изменений снизилось с 60 до нуля. Реализация повторяет поведение заданий в версиях до Windows 8, часть возможностей отложена на будущее.

comss img 2026 08 24 092018
Драйвер для Intel Ethernet Connection I217-LM работает на ReactOS

Пулл-реквест открыли в ноябре 2024 года

Заявка с базовой поддержкой заданий в ядре ntoskrnl появилась , а в master её приняли только , после 62 коммитов и нескольких кругов правок по замечаниям рецензентов. Полный список изменений опубликован в пулл-реквесте 7500.

Новая реализация пришла на смену давней черновой заявке по той же теме и частично на ней основана – первые наработки по объектам задания появились в проекте почти десять лет назад. Реализация двух классов ограничений перенесена из отдельного патча, предложенного ранее одним из основных участников. О принятом коде в проекте сообщили в аккаунте ReactOS в X.

Объект задания – именуемый и защищаемый объект ядра Windows, который объединяет процессы в группу и позволяет управлять ими как единым целым: задавать общие ограничения, вести учёт ресурсов и завершать все входящие процессы одной операцией.

Создание, назначение и завершение заданий в ядре

В ntoskrnl появился набор системных вызовов, которых до сих пор не было:

  • создание и открытие объекта задания – NtCreateJobObject и NtOpenJobObject;
  • назначение процесса заданию, в том числе при создании процесса – NtAssignProcessToJobObject;
  • проверка принадлежности процесса заданию – NtIsProcessInJob;
  • завершение всех процессов задания – NtTerminateJobObject;
  • чтение сведений о задании – NtQueryInformationJobObject с классами JobObjectBasicAccountingInformation, JobObjectBasicAndIoAccountingInformation, JobObjectBasicLimitInformation, JobObjectExtendedLimitInformation и JobObjectBasicProcessIdList;
  • запись ограничений – NtSetInformationJobObject с классами JobObjectBasicLimitInformation, JobObjectExtendedLimitInformation и JobObjectAssociateCompletionPortInformation.

Отдельно закрыты сценарии выхода процесса из задания и обработка флага CREATE_BREAKAWAY_FROM_JOB, из-за которого дочерние процессы прежде вели себя не так, как в Windows. При установке ограничений JOB_OBJECT_LIMIT_PRIORITY_CLASS и JOB_OBJECT_LIMIT_SCHEDULING_CLASS ядро теперь проверяет привилегии вызывающего процесса, как это описано в документации Microsoft.

Порт завершения ввода-вывода – очередь ядра, в которую система складывает уведомления о завершённых асинхронных операциях. Привязка такого порта к заданию позволяет приложению получать события о процессах группы, не опрашивая их по одному.

Ноль ошибок вместо 60 в тестах Wine kernel32

До принятия изменений связанные с заданиями тесты из набора kernel32 проекта Wine давали 60 ошибок, после них не осталось ни одной. Автор заявки приложил результаты прогонов в системе тестирования ReactOS для 32- и 64-разрядных сборок под KVM, а стопроцентное прохождение этих тестов было прямо заявлено целью работы.

Набор тестов Wine – автоматические проверки поведения библиотек Windows API, написанные в проекте Wine. В ReactOS их синхронизируют и прогоняют на собственных сборках, чтобы сравнивать поведение системы с оригинальной Windows.

Код рассчитан на задания до Windows 8

Реализация повторяет поведение объектов задания в версиях Windows младше восьмой. Вложенные задания, появившиеся в Windows 8 и Windows Server 2012, в неё не входят: процесс по-прежнему может принадлежать только одному заданию.

К следующим этапам отнесли поддержку наборов заданий, дополнительные классы ограничений в NtQueryInformationJobObject и NtSetInformationJobObject, а также разбор оставшихся флагов состояния задания. В самой заявке это оговорено прямо: часть возможностей намеренно оставлена нетронутой.

Зачем объекты задания браузерам и службам

Ограничения на ресурсы, групповое завершение и ограничения безопасности – три задачи, ради которых приложения для Windows обращаются к заданиям. Браузеру задание нужно, чтобы держать процессы в песочнице: группе назначается общий предел по памяти и рабочему набору, а при закрытии всё, что в неё попало, снимается одной операцией. Тем же механизмом пользуются службы и фоновые процессы, которым важно гарантированно завершать порождённые дочерние процессы.

Песочница – изолированная среда выполнения, в которой процесс работает с урезанными правами и ограниченным доступом к файлам, реестру и другим системным ресурсам.

Half-Life 2 и первый системный вызов NT6

Предыдущие заметные шаги проекта пришлись на лето. В июле в ReactOS запустили Half-Life 2 через месяц после первой части – на реальной машине, а не в виртуальной. Тогда же в ядро приняли первый системный вызов Windows NT6, с которого начинается работа над совместимостью с приложениями для Windows Vista.

Заключение

Появление объектов задания закрывает один из заметных пробелов в ядре ReactOS: без них современные браузеры и часть системных служб не работают вовсе. Поддержка пока базовая – вложенных заданий, наборов заданий и большинства классов ограничений в ней нет, часть флагов состояния ещё предстоит разобрать. Измеримый результат уже есть: связанные с заданиями тесты Wine kernel32 проходят без ошибок, то есть этот участок Windows API в ReactOS ведёт себя так же, как в оригинальной системе.

© .
Комментарии и отзывы

Нашли ошибку?

Новое на сайте