- Еще раз о Windows и реальном времени
- Введение
- Аппаратная поддержка
- Исправление ядра
- Тестирование исправления
- Заключение
- Технический справочник по службе времени Windows Windows Time Service Technical Reference
- Важность протоколов времени Importance of Time Protocols
- Поиск сведений, связанных с настройкой службы времени Windows Where to find Windows Time service configuration-related information
Еще раз о Windows и реальном времени
Автор: Караваев Дмитрий Юрьевич
Опубликовано: 17.03.2014
Исправлено: 10.12.2016
Версия текста: 1.0
Введение
Одна из типичных ситуаций: ноутбук с 64-разрядной Windows 7, на котором работает прикладная программа, обрабатывающая данные, регулярно приходящие из сети или от некоторой аппаратуры. Все функционирует, как задумано, кроме того, что иногда возникают непредсказуемые задержки, связанные с работой самой Windows, т.е. планировщика. Это ожидаемо, так как и Windows не система реального времени (больше подходит название «система мягкого реального времени»), да и ноутбук вовсе не специальный сервер, предназначенный для транзакций в реальном времени.
Обидно, что для преодоления этого последнего и, казалось бы, несущественного препятствия приходится прикладывать значительные усилия. Предлагается и переход на другие операционные системы и надстройки над Windows (по существу ее подмена) вроде среды RTX, и написание драйверов режима ядра, что выглядит иногда как стрельба из пушек по воробьям. Однако иначе невозможно преодолеть принципиальное ограничение Windows, запрещающее прикладным программам монопольно владеть ресурсами в обход использования механизма драйверов, написание которых становится все сложнее и сложнее и уже требует цифровой подписи и других особенностей, никак не связанных с решаемыми задачами.
На мой взгляд, данное несоответствие обусловлено противоречием между общим назначением Windows и конкретностью частных задач. В общем случае разработчики ОС справедливо не допускают прикладные задачи до полного контроля над компьютером (помимо использования аппарата драйверов), иначе устойчивая работа системы станет невозможной. Но в данном конкретном случае компьютер и предустановленная на нем Windows куплены только ради одной прикладной программы и как раз в этом случае данная программа вполне могла бы монопольно владеть ресурсами, причем других прикладных задач при ее работе нет.
Аппаратная поддержка
Разработчики архитектуры х86 предусмотрели некоторую поддержку подобных ситуаций [1]. Речь идет об уровне привилегий ввода-вывода IOPL (биты 12 и 13) регистра флагов EFLAGS. Если установить оба этих бита в единицу (т.е. сделать IOPL=3), то обычная прикладная программа сможет напрямую обращаться к портам ввода-вывода и, главное, сможет прямо задавать команды CLI/STI , закрывающие и открывающие прерывания.
Имея нужный уровень IOPL, прикладная программа могла бы выполнить очередную транзакцию гарантированно без переключений в это время на другие задачи. В предельном случае прикладная программа вообще могла бы провести целый сеанс, выключив, точнее «заморозив» Windows, а затем включив ее снова. Это вполне возможно, хотя и потребует после такой «разморозки» ОС некоторых дополнительных действий, вроде коррекции программных часов Windows по аппаратным часам компьютера. В любом случае приостанавливается работа планировщика, и влияние Windows в этот момент полностью исключается.
Таким образом, не используя надстройки или другие ОС, и не разрабатывая драйверы, можно было бы вернуться в некотором роде к временам Windows-98 или даже MS-DOS, когда прикладная программа могла в принципе делать что угодно (и поэтому зависание и крах системы были обычным делом), однако сложностей с реальным временем, по сути, не было.
Исправление ядра
Документированного, а возможно и недокументированного способа установить IOPL=3 в Windows 7, скорее всего, нет и не предвидится, несмотря на глухие упоминания о функции с многообещающим названием ke386SetIopl. Как же быть? А можно ли тогда «исправить» саму Windows 7? Ну, хотя бы всего один конкретный экземпляр на одном конкретном компьютере? Попробуем.
Прежде всего, исправлять придется ядро Windows 7 в его 64-разрядном варианте, т.е. файл ntoskrnl.exe из папки Windows\system32 , причем после загрузки под этим именем там находится совсем другой файл – 32-х разрядная версия ядра, которая вообще не используется на 64-х разрядных процессорах. Можете сами в этом убедиться, сделав себя владельцем этого файла и переименовав или даже стерев его. 64-разрядная Windows 7 после перезагрузки будет работать, как ни в чем не бывало и 32-х разрядные приложения нормально выполняются. То же справедливо и для файла ntkrnlpa.exe (32-х разрядной версии ядра для памяти более 3 Гбайт): т.е. и он присутствует, но никак не используется.
Для доступа к файлу настоящего ядра нужно, например, загрузить другую ОС с компакт-диска, используя удобные специальные сборки типа «Реаниматор», обеспечивающие доступ к исходным дискам C:, D: и т.д.
Кроме этого, в Windows 7 имеется документированный способ подключить другое ядро, например, файл с именем nt1skrnl.exe с помощью директивы:
Откуда возьмется другое ядро? Для начала можно просто скопировать в системной папке под таким именем исходное. Теперь все опыты можно вести с копией в nt1skrnl.exe , не трогая исходного ядра. И всегда можно вернуться к исходному ядру, опять скопировав его под этим именем или выполнив директиву подключения стандартного ядра:
Файл ntoskrnl.exe представляет собой несколько мегабайт команд в 64-разрядном режиме. Куда же в нем вставлять команды установки IOPL?
Подсказку дает необходимость в Windows следить за содержимым регистра флагов у прикладных задач. Ядро постоянно «приводит в порядок» флаги задачи пользовательского уровня, гася запрещенные по маске-константе. Младшая часть этой константы 0DD5 и «выдает» работу с флагами пользовательской программы, например:
Здесь ядро погасило запрещенные биты, в том числе и IOPL, а затем принудительно разрешило флаг прерываний. Достаточно заменить одну команду на другую:
и при выходе из ядра в пользовательский уровень IOPL станет равным 3.
Таких мест в ядре оказалось несколько и, методом проб и ошибок, был найден соседний фрагмент, который в данном случае и используется:
Правда, здесь флаг разрешения прерывания устанавливается почему-то экзотическим способом с помощью команды BTS, очевидно как более короткой. Однако прямая установка командой:
ничуть не длиннее. Используя эту команду, устанавливаем заодно и максимальный уровень IOPL:
Поскольку изменились байты, контрольная сумма по адресу 00000140 (которую можно рассчитать с помощью CheckSumMappedFile) также должна поменяться, в данном случае с 5553E5 на 55С260
Таким образом, после всех исправлений, список отличий от исходного ядра, выведенный с помощью стандартной утилиты fc, следующий:
Тестирование исправления
Теперь можно производить перезагрузку Windows 7 с входом в расширенное меню по нажатию F8 и выбора режима «отключение обязательной проверки подписи драйверов», поскольку цифровая подпись уже не совпадает. В результате исправленное ядро из файла nt1skrnl.exe будет загружено и запущено.
Проверим работу исправления ядра на примере простейшей 32-разрядной тестовой программы на языке PL/1 [2]:
При запуске выдается сообщение «start» затем на десяток секунд вся система «замирает» (например, мышь не перемещается), затем выдается «finish» и нормальная работа Windows 7 возобновляется.
Заключение
Итак, на том же самом компьютере, на той же самой ОС, и почти не меняя прикладной программы (были только добавлены команды CLI/STI ), удалось решить поставленную задачу за счет нетривиальной, но примитивной «доработки» самой ОС. При этом был получен режим «реального времени» в том смысле, что исключено вмешательство планировщика и служебных процессов во время работы прикладной программы. Конечно, подобного же эффекта можно достичь и через аппарат драйверов, но это требует значительно больших изменений в построении ПО, а кроме этого, не используется аппаратная поддержка, предусмотренная разработчиками архитектуры х86 для прикладных программ в подобных случаях. Причем такая поддержка позволяет не переходить с пользовательского режима на уровень ядра.
Простым исправлением удалось преодолеть противоречие между общим назначением Windows и требованием конкретной задачи. В результате исправления частично произошел возврат к идеологии ОС эпохи Windows 98, когда прикладная задача могла захватить компьютер в монопольное использование и максимально быстро реагировать на происходящие события. Хотя такой режим в общем случае недопустим, для частных задач его вполне можно использовать, и было бы целесообразно иметь подобный режим как документированное средство Windows. Это позволило бы проще применять данную ОС для более широкого класса задач.
Технический справочник по службе времени Windows Windows Time Service Technical Reference
Применяется к: Windows Server 2016, Windows Server 2012 R2, Windows Server 2012, Windows 10 или более поздних версий Applies to: Windows Server 2016, Windows Server 2012 R2, Windows Server 2012, Windows 10 or later
Служба времени W32Time обеспечивает синхронизацию сетевых часов для компьютеров без необходимости в расширенной конфигурации. The W32Time service provides network clock synchronization for computers without the need for extensive configuration. Служба W32Time необходима для успешной работы проверки подлинности Kerberos версии 5 и, следовательно, для проверки подлинности на основе AD DS. The W32Time service is essential to the successful operation of Kerberos V5 authentication and, therefore, to AD DS-based authentication. Любое приложение, поддерживающее Kerberos, включая большинство служб безопасности, зависит от синхронизации времени между компьютерами, участвующими в запросе проверки подлинности. Any Kerberos-aware application, including most security services, relies on time synchronization between the computers that are participating in the authentication request. Контроллеры доменов AD DS также должны иметь синхронизированные часы, чтобы обеспечивать точную репликацию данных. AD DS domain controllers must also have synchronized clocks to help to ensure accurate data replication.
В Windows Server 2003 и Microsoft Windows 2000 Server служба каталогов называется «служба каталогов Active Directory» In Windows Server 2003 and Microsoft Windows 2000 Server, the directory service is named Active Directory directory service. В Windows Server 2008 и Windows Server 2008 R2 служба каталогов называется «доменные службы Active Directory» (AD DS). In Windows Server 2008 R2 and Windows Server 2008 , the directory service is named Active Directory Domain Services (AD DS). Остальная часть этой статьи относится к AD DS, но эти сведения применимы также и к доменным службам Active Directory в Windows Server 2016. The rest of this topic refers to AD DS, but the information is also applicable to Active Directory Domain Services in Windows Server 2016.
Служба W32Time реализована в библиотеке динамической компоновки с именем W32Time.dll, которая по умолчанию устанавливается в папку %Systemroot%\System32. The W32Time service is implemented in a dynamic link library called W32Time.dll, which is installed by default in %Systemroot%\System32. Служба W32Time.dll изначально разрабатывалась для Windows 2000 Server и поддержки спецификации протоколом проверки подлинности Kerberos версии 5, требующей синхронизации в сети. W32Time.dll was originally developed for Windows 2000 Server to support a specification by the Kerberos V5 authentication protocol that required clocks on a network to be synchronized. Начиная с Windows Server 2003, Служба W32Time.dll обеспечивает более высокую точность синхронизации часов в сети по сравнению с операционной системой Windows Server 2000. Starting with Windows Server 2003, W32Time.dll provided increased accuracy in network clock synchronization over the Windows Server 2000 operating system. Кроме того, в Windows Server 2003 служба W32Time.dll поддерживала широкий набор аппаратных устройств и протоколов сетевого времени через поставщики времени. Additionally, in Windows Server 2003, W32Time.dll supported a variety of hardware devices and network time protocols using time providers.
Несмотря на то, что изначально планировалось предоставлять синхронизацию часов только для проверки подлинности Kerberos, многие текущие приложения используют метки времени для обеспечения согласованности транзакций, записи времени важных событий и другой критически важной для бизнеса информации, которая зависит от времени. Although originally designed to provide clock synchronization for Kerberos authentication, many current applications use timestamps to ensure transactional consistency, record the time of important events, and other business-critical, time-sensitive information. Эти приложения получают преимущества от синхронизации времени между компьютерами, предоставляемыми службой времени Windows. These applications benefit from time synchronization between computers that are provided by the Windows Time service.
Важность протоколов времени Importance of Time Protocols
Протоколы времени взаимодействуют между двумя компьютерами для обмена сведениями о времени, а затем используют эти сведения для синхронизации часов. Time protocols communicate between two computers to exchange time information and then use that information to synchronize their clocks. При использовании протокола времени службы времени Windows клиент запрашивает сведения о времени с сервера и синхронизирует свои часы на основе полученных данных. With the Windows Time service time protocol, a client requests time information from a server and synchronizes its clock based on the information that is received.
Служба времени Windows использует протокол NTP для синхронизации времени по сети. The Windows Time service uses NTP to help synchronize time across a network. NTP — это протокол времени в Интернете, включающий алгоритмы правил работы, необходимые для синхронизации часов. NTP is an Internet time protocol that includes the discipline algorithms necessary for synchronizing clocks. NTP является более точным протоколом времени, чем Simple Network Time Protocol (SNTP), который используется в некоторых версиях Windows; однако W32Time продолжает поддерживать SNTP для обратной совместимости с компьютерами, на которых работают службы времени на основе SNTP, такие как Windows 2000. NTP is a more accurate time protocol than the Simple Network Time Protocol (SNTP) that is used in some versions of Windows; however, W32Time continues to support SNTP to enable backward compatibility with computers running SNTP-based time services such as Windows 2000.
Поиск сведений, связанных с настройкой службы времени Windows Where to find Windows Time service configuration-related information
В этом руководстве не затрагивается настройка службы времени Windows. This guide does not discuss configuring the Windows Time service. В Microsoft TechNet и в базе знаний Майкрософт есть несколько разделов, которые описывают процедуры настройки службы времени Windows. There are several different topics on Microsoft TechNet and in the Microsoft Knowledge Base that do explain procedures for configuring the Windows Time service. Если вам требуется информация о конфигурации, вы сможете найти ее в следующих статьях. If you require configuration information, the following topics should help you locate the appropriate information.
Сведения о том, как настроить службу времени Windows для эмулятора основного контроллера домена в корне леса, см. в этих статьях: To configure the Windows Time service for the forest root primary domain controller (PDC) emulator, see:
Статья 816042 базы знаний Майкрософт Как настроить полномочный сервер времени в операционной системе Windows Server, в которой описаны параметры конфигурации для компьютеров под управлением Windows Server 2008 R2, Windows Server 2008, Windows Server 2003 и Windows Server 2003 R2. Microsoft Knowledge Base article 816042, How to configure an authoritative time server in Windows Server, which describes configuration settings for computers running Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, and Windows Server 2003 R2.
Сведения о настройке службы времени Windows на любом клиенте- или сервере-члене домена или даже на контроллерах домена, которые не настроены в качестве эмулятора основного контроллера в корне леса, см. в этой статье. To configure the Windows Time service on any domain member client or server, or even domain controllers that are not configured as the forest root PDC emulator, see Configure a client computer for automatic domain time synchronization.
Некоторые приложения могут требовать наличия высокоточных служб времени на компьютерах, где они работают. Some applications may require their computers to have high-accuracy time services. В этом случае вы можете настроить источник времени, задаваемый вручную, но имейте в виду, что служба времени Windows не предназначена для работы в качестве источника с высокой точностью времени. If that is the case, you may choose to configure a manual time source, but be aware that the Windows Time service was not designed to function as a highly accurate time source. Убедитесь, что вы знаете об ограничениях поддержки для сред высокой точности, описанных в статье 939322 базы знаний Майкрософт: Support boundary for high-accuracy time (Граница области поддержки для высокоточного времени). Ensure that you are aware of the support limitations for high-accuracy time environments as described in Microsoft Knowledge Base article 939322, Support boundary to configure the Windows Time service for high-accuracy environments.
Чтобы настроить службу времени Windows на всех клиентских и серверных компьютерах под управлением Windows, которые настроены как члены рабочей группы, а не члены домена, см. статью Configure a Manual Time Source for a Selected Client Computer (Настройка источника времени вручную для выбранного клиентского компьютера). To configure the Windows Time service on any Windows-based client or server computers that are configured as workgroup members instead of domain members see Configure a manual time source for a selected client computer.
Сведения о настройке службы времени Windows на главном компьютере, на котором выполняется виртуальная среда, см. в статье 816042 базы знаний Майкрософт Как настроить полномочный сервер времени в операционной системе Windows Server. To configure the Windows Time service on a host computer that runs a virtual environment, see Microsoft Knowledge Base article 816042, How to configure an authoritative time server in Windows Server. Если вы работаете с продуктом виртуализации не от Майкрософт, обязательно ознакомьтесь с документацией поставщика для этого продукта. If you are working with a non-Microsoft virtualization product, be sure to consult the documentation of the vendor for that product.
Чтобы настроить службу времени Windows на контроллере домена, работающем в виртуальной машине, мы рекомендуем частично отключить синхронизацию времени между хост-системой и гостевой операционной системой, выполняющей роль контроллера домена. To configure the Windows Time service on a domain controller that is running in a virtual machine, it is recommended that you partially disable time synchronization between the host system and guest operating system acting as a domain controller. Это позволяет гостевому контроллеру домена синхронизировать время для иерархии домена, но предохраняет его от отклонения во времени при восстановлении из сохраненного состояния. This enables your guest domain controller to synchronize time for the domain hierarchy, but protects it from having a time skew if it is restored from a Saved state. Дополнительные сведения см. в статье 976924 базы знаний Майкрософт You receive Windows Time Service event IDs 24, 29, and 38 on a virtualized domain controller that is running on a Windows Server 2008-based host server with Hyper-V (Вы получаете события с кодами 24, 29 или 38 от службы времени Windows на виртуализированном контроллере домена, который выполняется на сервере узла под управлением Windows Server 2008 с Hyper-V) и статье Deployment Considerations for Virtualized Domain Controllers (Рекомендации по развертыванию виртуализованных контроллеров домена). For more information, see Microsoft Knowledge Base article 976924, You receive Windows Time Service event IDs 24, 29, and 38 on a virtualized domain controller that is running on a Windows Server 2008-based host server with Hyper-V and Deployment Considerations for Virtualized Domain Controllers.
Чтобы настроить службу времени Windows на контроллере домена, работающем в качестве эмулятора основного котроллера в корне леса, который также работает на виртуальном компьютере, следуйте тем же инструкциям, что и для физического компьютера, как описано в статье Configure the Windows Time service on the PDC emulator in the Forest Root Domain (Настройка службы времени Windows для эмулятора основного контроллера домена в корневом домене леса). To configure the Windows Time service on a domain controller acting as the forest root PDC emulator that is also running in a virtual computer, follow the same instructions for a physical computer as described in Configure the Windows Time service on the PDC emulator in the Forest Root Domain.
Чтобы настроить службу времени Windows на рядовом сервере, работающем как виртуальный компьютер, используйте иерархию времени домена, как описано в статье Configure a Client Computer for Automatic Domain Time Synchronization (Настройка клиентского компьютера для автоматической синхронизации времени домена). To configure the Windows Time service on a member server running as a virtual computer, use the domain time hierarchy as described in Configure a client computer for automatic domain time synchronization.
До Windows Server 2016 служба W32Time не предназначалась для поддержки зависящих от времени потребностей приложений. Prior to Windows Server 2016, the W32Time service was not designed to meet time-sensitive application needs. Не теперь обновления Windows Server 2016 позволяют реализовать в домене решение с точностью 1 мс. However, updates to Windows Server 2016 now allow you to implement a solution for 1ms accuracy in your domain. Дополнительные сведения см. в статьях Accurate Time for Windows Server 2016 (Точное время для Windows Server 2016) и Support boundary for high-accuracy time (Граница области поддержки для сверхточного времени) For more information about, see Windows 2016 Accurate Time and Support boundary to configure the Windows Time service for high-accuracy environments for more information.