Что такое системное время на часах
Что можно узнать на нашем сайте в разделе “Время”?
Здесь вы можете проверить разницу между системным временем устройства и часовым поясом, определенным по IP.
Что такое системное время и часовой пояс (IP)?
Системное время — это дата и время, установленные на устройстве.
Часовой пояс, наоборот, определяется по IP с помощью метода IP-геолокации.
Как разница в системном времени и часовом поясе (IP) раскрывает анонимность?
Системное время на устройстве могут видеть все сайты. Но если вы используете Proxy/VPN, то по IP адресу можно определить и часовой пояс. Если системное время будет отличаться от часового пояса (IP), то это скажет о том, что вы скрываете IP, а значит ваша анонимность будет раскрыта.
Необходимо ли вручную задавать системное время?
Да. Если вы используете средства для сокрытия IP, то рекомендуется менять и системное время на устройстве.
С помощью утилиты Run as Date можно запустить любую программу с нужным системным временем (без изменения времени в системе устройства).
Можно использовать качественные программы для сокрытия IP и шифрования трафика с автоматической сменой часового пояса (например, утилиту Privatix).
Как вручную установить системное время:
Windows 10 :
Нажмите на часы в правом нижнем углу экрана и затем на “Date and time settings”.
Отключите “Set time Automatically” и “Set time zone automatically”, после чего нажмите кнопку “Change” под надписью “Change data and time”, где и можно изменить время. Ниже можно отключить “Automatically adjust clock for daylight saving changes” (автоматический переход на летнее время и обратно).
Вся правда об ОСРВ. Статья #27. Системное время
Понятие времени в контексте ОСРВ была введена в одной из предыдущих статей, вместе с идеей о связанных со временем функциях, доступных в ОСРВ.
Тик таймера
Все функции, связанные со временем, управляются аппаратными часами. Это простой осциллятор, который генерирует запросы на прерывание с постоянными интервалами. Чтобы номера тактов имели смысл для прикладных программ, частота генератора должна быть известна.
Обработки таймерных прерываний
Прерывания, генерируемые аппаратным таймером, должны обслуживаться определенным образом в обработчике прерываний (англ. Interrupt Service Routine, ISR), в котором реализованы все функции ОСРВ, связанные со временем. Детали обработчика прерываний таймера в Nucleus SE будут рассмотрены в одной из следующих статей.
Функции, связанные со временем
Nucleus RTOS и Nucleus SE содержат несколько механизмов, связанных со временем:
Точность
А сейчас стоит вкратце рассказать о точности системного таймера.
Точность временных функций напрямую зависит от частоты тактового генератора. Например, если импульсы поступают каждые 10 миллисекунд, а задаче приложения необходима задержка в 100 миллисекунд, ей очевидно нужно 10 импульсов. Однако неизвестно, когда был получен предыдущий импульс: это могло произойти только что или почти 10 миллисекунд назад. Поэтому 100-миллисекундная задержка может занять вплоть до 110 миллисекунд.
Очевидный способ решения этой проблемы — повышение частоты генератора. Если импульсы следуют с интервалами в 1 миллисекунду, 100-миллисекундная задержка никогда не займет больше ста одной миллисекунды. Недостатком такого решения будет то, что обработчика прерываний таймера заберет в 10 раз больше процессорного времени, что будет чрезмерным. Разработчик системы должен найти баланс между необходимой точностью таймера и доступными мощностями процессора.
Настройка системного времени
Как и для большинства объектов Nucleus SE, настройка системного времени по большей части управляется директивами #define в файле nuse_config.h. Основным параметром является NUSE_SYSTEM_TIME_SUPPORT, который активирует механизм поддержки системного времени. Количество объектов указывать не нужно: системное время либо активировано, либо нет.
Выбор ненулевого значения является главным активатором системного времени. Этот параметр используется при определении структур данных, о которых будет подробно рассказано далее в этой статье. Кроме того, ненулевое значение активирует настройки API.
Активация API
Каждая функция API (служебный вызов) в Nucleus SE имеет активирующую директиву #define в файле nuse_config.h. Для системного времени такими символами являются:
NUSE_CLOCK_SET
NUSE_CLOCK_RETRIEVE
По умолчанию, им присваивается значение FALSE, таким образом все служебные вызовы отключены, блокируя включение реализующего их кода. Для настройки системного времени в приложении нужно выбрать необходимые служебные вызовы API и присвоить им значение TRUE.
Ниже приведен фрагмент кода из файла nuse_config.h по умолчанию.
При попытке использования служебного вызова API системного времени при выключенном активаторе системного времени произойдет ошибка компиляции. Если ваш код использует вызов API, который не был активирован, произойдет ошибка компоновки, так как код реализации не был включен в приложение.
Служебные вызовы системного времени
Nucleus RTOS поддерживает два служебных вызова, которые относятся к системному времени и обеспечивают следующий функционал:
Служебные вызовы установки и получения системного времени
С системным временем можно выполнять только операции установки в заданное значение и получения текущего значения. Nucleus RTOS и Nucleus SE предоставляют по два базовых вызова API для реализации этих операций.
Интерпретация значения системного времени зависит от приложения, так как является по своей сути счетчиком количества «тактов» часов, которые произошли с момента последнего сброса счетчика. Для использования этой информации должна быть известна частота генератора.
Установка времени
Любая задача может установить системное время при помощи вызова этой функции API.
Вызов для установки системного времени в Nucleus RTOS
Прототип служебного вызова:
VOID NU_Set_Clock(UNSIGNED new_value);
Параметры:
new_value – значение, которое будет присвоено системному времени
Возвращаемое значение: отсутствует.
Вызов для установки системного времени в Nucleus SE
Этот вызов API поддерживает основной функционал Nucleus RTOS API.
Прототип служебного вызова:
void NUSE_Clock_Set(U32 new_value);
Параметры:
new_value – значение, которое будет присвоено системному времени
Возвращаемое значение: отсутствует
Реализация установки времени в Nucleus SE
Код очень прост. Предоставленное значение записывается в NUSE_Tick_Clock внутри критической секции.
Получение системного времени
Задача может получить значение системного времени при помощи этой функции API.
Вызов для получения системного времени в Nucleus RTOS
Прототип служебного вызова:
UNSIGNED NU_Retrieve_Clock(VOID);
Возвращаемое значение: текущее значение системного времени
Вызов для получения системного времени в Nucleus SE
Прототип служебного вызова:
U32 NUSE_Clock_Retrieve(void);
Возвращаемое значение: текущее значение системного времени
Реализация получения времени в Nucleus SE
Код очень прост. Функция возвращает значение NUSE_Tick_Clock, полученное в критической секции.
Структуры данных
Системное время использует одну структуру данных (находящуюся в ОЗУ), которая представляет из себя 32-битное слово.
Настоятельно рекомендую, чтобы код приложения не использовал прямой доступ к этой структуре данных, а обращался к ней через предоставляемые функции API. Это позволит избежать несовместимости с будущими версиями Nucleus SE и нежелательных побочных эффектов, а также упростит портирование приложений на Nucleus RTOS. Подробная информация о структурах данных приведена ниже, чтобы упростить понимание работы кода служебных вызовов и для отладки.
Данные ОЗУ
Структура данных:
NUSE_Tick_Clock – переменная типа U32, в которой хранится счетчик тактов системного времени.
Эта структура данных инициализируется нулём функцией NUSE_Init_Task() при запуске Nucleus SE. Одна из следующих статей будет содержать полное описание процедур запуска Nucleus SE.
Данные ПЗУ
В ПЗУ нет структур данных, связанных с системным временем.
Объем памяти для системного времени
Как и у всех других объектов Nucleus SE, объем памяти, необходимый для системного времени, предсказуем.
Объем памяти в ПЗУ равен 0.
Объем памяти в ОЗУ (в байтах) всегда равен 4.
Нереализованные вызовы API
Все служебные вызовы API Nucleus RTOS, относящиеся к системному времени, имеют эквивалент в Nucleus SE.
Совместимость с Nucleus PLUS
Как и в случае со всеми другими объектами Nucleus SE, моей целью было обеспечение максимально возможной совместимости кода приложений с Nucleus RTOS. Системное время не является исключением и, с точки зрения пользователя, оно реализовано во многом также, как и в Nucleus RTOS. Вызовы API Nucleus RTOS могут быть напрямую перенесены на Nucleus SE.
В следующей статье мы рассмотрим программные таймеры.
Системные часы
Современные компьютеры используют часы реального времени, доступ к которым возможен с помощью утилит, либо через экран настройки BIOS, в ходе загрузки операционной системы.
Системные часы инициализируются от аппаратных при загрузке операционной системы, и далее системное время поддерживаются с помощью регулярных прерываний от таймера. Например, в системе Linux текущее время можно узнать в командной строке с помощью команды date, а показания аппаратных часов — hwclock. Для установки времени по локальной сети или через Интернет может использоваться протокол NTP Разные операционные системы могут устанавливать системные часы в соответствии с локальным временем. В операционной системе Linux Ubuntu по умолчанию подразумевается, что часы установлены в соответствии с UTC — всемирным координированным временем — в отличие от Windows, а уже показания времени в пользовательском интерфейсе зависят от выбранной временной зоны.
Точность времени зависит от многих факторов, таких как состояние аккумулятора, типа микросхемы и т. п. В случае сбоя питания дата и время обычно устанавливаются на год выпуска версии BIOS.
Связанные понятия
Упоминания в литературе
Связанные понятия (продолжение)
Подсистема клиент/сервер времени выполнения (англ. Client/Server Runtime Subsystem, CSRSS) или csrss.exe, входит в состав операционной системы Microsoft Windows NT, и представляет собой часть пользовательского режима подсистемы Win32. Включена в состав Windows 2000, Windows XP, Windows 2003, Windows Vista, Windows Server 2008 и Windows 7. Поскольку большинство операций подсистемы Win32 были перенесены в режим ядра, а конкретнее в драйверы режима ядра, в Windows NT 4 и выше CSRSS в основном отвечает.
Многопользовательское, мультерминальное или терминальное решение позволяет организовать на базе одного компьютера несколько независимых мест — терминалов — с возможностью одновременной работы.
Системное время
Системное время использует системные часы и используется в Unix системах для слежения за временем. Его можно установить с помощью аппаратных часов или с помощью внешнего сервера времени.
Contents
Предисловие
Программные или аппаратные часы
Системные часы, предоставляемые ядром, реализуются простым подсчетом числа секунд, прошедших с 1 января 1970 года 00:00:00 UTC по настоящее время. Это число называется Unix-время.
Аппаратные часы, также известные как часы реального времени (real-time clock или RTC), обычно представляют из себя элемент материнской платы. Они работают все время, независимо от состояния операционной системы, даже когда компьютер выключен.
UTC или местное время
Настройка времени аппаратных часов может быть осуществлена исходя из двух стандартов: локальное время или время UTC. Локальное время — это реальное время часового пояса, учитывающее переход на DST. Предпочтительно использовать UTC, поскольку системное время вычисляется посредством прибавления к нему разницы времени часового пояса с учётом летнего времени. Благодаря этому перевод часов на летнее время учитывается автоматически, а изменение часового пояса возможно без изменения значения аппаратных часов. Исключение может быть сделано при использовании систем с двойной загрузкой, когда одна операционная система не поддерживает или не настроена для аппаратных часов с UTC (по умолчанию Windows настроена на использование локального времени).
Конфигурация
Часовой пояс
Для поддержания правильного исчисления времени необходимо выбрать соответствующий часовой пояс, чтобы системе было известно её текущее местоположение.
OpenRC
systemd
В systemd существует команда timedatectl для настройки часового пояса:
Проверка текущего часового пояса:
Вывод доступных часовых поясов:
Чтобы изменить часовой пояс, пример для Германии:
LC_TIME
Эта переменная окружения определяет форматирование даты и времени. Для более детальной информации смотрите The GNU C Library
Системные часы
Обычно время системных часов устанавливается аппаратными часами во время загрузки системы. Также системные часы возможно установить вручную либо с помощью сервера сетевого времени.
Для изменения системного времени можно воспользоваться командой date :
Вывод текущего времени программных часов:
Установка нового системного времени, например на 6 мая 2016 года в 12:34:
Сервер времени
Смотрите статью NTP, чтобы получить информацию по использованию сервера времени.
systemd
systemd существует команда timedatectl для управления системным временем:
Вывод текущего времени программных часов:
Установка системного времени:
Аппаратные часы
Чтобы получить доступ к аппаратным часам, нужно собрать ядро со следующими включенными параметрами:
Следующая команда выводит текущее на данный момент время аппаратных часов:
Следующая команда устанавливает время аппаратных часов в соответствии с системным временем:
Синхронизация аппаратных часов и системного времени
Обычно аппаратные часы используются при загрузке для установки системного времени. Это может быть осуществлено ядром самостоятельно, либо с помощью загрузочного сервиса init-скрипта при загрузке. Завершение работы ядра или сервиса также может вызвать сохранение времени системных часов в аппаратные часы. Благодаря этому у системы будет правильное время при следующей загрузке.
Синхронизация с помощью ядра
В свежих версиях (3.9 и выше) ядро Linux можно сконфигурировать таким образом, чтобы оно устанавливало системное время автоматически. Чтобы добиться этого, необходимо включить в ядре параметры Set system time from RTC on startup and resume ( CONFIG_RTC_HCTOSYS ) и Set the RTC time based on NTP synchronization ( CONFIG_RTC_SYSTOHC ):
Чтобы убедиться, что время аппаратных часов обновилось, установите пакет net-misc/adjtimex и запустите следующую команду:
Выведенное число 64 бит должно быть не задано (0). Более подробная информация в man-странице hwclock (ищите ’11 minute mode’).
OpenRC
Перезапустите сервис hwclock и добавьте его init-скрипт в уровень запуска boot:
systemd
Для установки системного времени во время загрузки можно использовать systemd. Для управления аппаратными часами используйте команду timedatectl :
Вывод текущего времени аппаратных часов:
Следующая команда устанавливает аппаратные часы в соответствии с системным временем (в стандарте времени UTC):
Следующая команда устанавливает аппаратные часы в соответствии с системным временем в стандарте времени localtime (местное время):
Устранение проблем
Двойная загрузка с Windows
Системы с возможностью загрузки другой операционной системы, например Windows, обычно будут испытывать проблемы с переназначением аппаратных часов. Чтобы сделать так, чтобы Windows не меняла аппаратные часы назад в локальное время, добавьте в реестр следующую запись.
Виртуальное время. Часть 1: источники времени в компьютере
Человек, имеющий одни часы, твердо знает, который час. Человек, имеющий несколько часов, ни в чём не уверен.
Закон Сегала
Требования на источники времени
Конечно же, достаточный набор свойств источника зависит от способа использования в программах. Например, одно устройство может предоставлять низкое разрешение и высокую длительность считывания, но при этом быть энергонезависимым и очень стабильным, а другое позволять измерять очень короткие промежутки времени, но при этом быстро переполняться, да ещё и не быть синхронизированным ни с чем больше.
Обзор таймеров в архитектуре PC
Источников времени в системе может быть несколько. Прикладные программы редко обращаются к каким-либо из них напрямую. Вместо этого используются всевозможные API, предлагаемые использованным языком программирования (например, C++11 < chrono >), средой исполнения (например, gettimeofday из POSIX или QueryPerformanceCounter на MS Windows), или даже системными вызовами используемой операционной системы.
Самой ОС также необходимо знать время и уметь отмерять его отрезки для планирования работы пользовательских потоков, учёта потреблённых ими ресурсов, профилировки производительности, управления энергопотреблением и т.п. При этом сама ОС работает напрямую с интерфейсами, предоставляемыми аппаратурой. Так как таймеров присутствует много, современные ОС умеют выбирать один «центрально» используемый в начале загрузки, исходя из своих представлений о «качестве» обнаруженных устройств (например, на некоторых системах часть таймеров может быть занесена в «чёрный список» из-за известных проблем в работе) или же настроек пользователя (параметр clocksource у ядра Linux и опции useplatformclock, tscsyncpolicy, disabledynamictick у BCDEDIT в Windows).
Опишу наиболее часто встречаемые устройства, являющиеся часами и таймерами в PC.
Общераспространённые
Часы реального времени (Real Time Clock, RTC) — источник текущей даты и времени для нужд ОС. Типичное разрешение этого таймера — одна секунда. Все системы, удовлетворяющие стандарту ACPI, имеют чип RTC, совместимый с Motorola MC146818, присутствовавшем в оригинальном IBM PC/AT с 1984 года. В современных системах RTC обычно интегрирован в набор системной логики южного моста на материнской плате (что означает довольно большую задержку при чтении). Энергонезависимость этого таймера обеспечивается специальной батарейкой. Принципы программирования RTC вызывают ностальгию по BCD-числам и проблеме Y2K.
Programmable Interval Timer (PIT) 8253 или 8254 от Intel — стандартный счётчик и таймер, имеющийся в PC с самого начала существования этой платформы (1981 год). Как и RTC, изначально был отдельной микросхемой, а ныне является частью системной логики. Довольно интересное устройство, содержащее три таймера (хотя последние два всегда были зарезервированы под задачи обновления ОЗУ и работу PC-спикера соответственно) и позволяющее запрограммировать их в различные режимы: периодические прерывания, однократное (one-shot) прерывание по таймауту, меандр и т.д.
Первый канал PIT до сих пор может использоваться ОС как источник прерываний для работы вытесняющего планировщика задач. Однако по современным меркам он не очень удобен в работе: низкая частота осциллятора 1193181,8 Гц (странное значение — это историческое наследие от частоты развёртки NTSC), ширина счётчика всего 16 бит (частое переполнение) при ширине регистров статуса и команд всего в восемь бит (т.е. приходится передавать или читать значение по частям), да и доступ к регистрам через медленный и негибкий механизм PIO (команды IN/OUT процессора).
Local APIC (advanced programmable interrupt controller), встроенный во все современные процессоры Intel (начиная с архитектуры P54C) и который в своём составе имеет ещё и таймер. Более того, каждый логический процессор имеет свой собственный LAPIC, что может быть удобно для выполнения работы, локальной для текущего ядра, без необходимости управления ресурсами. Однако, данное устройство не имеет фиксированной известной частоты; последняя скорее привязана к частоте ядра. Поэтому перед использованием программе необходимо её вычислить (калибровать), а для этого нужно дополнительное референсное устройство. Режимы, поддерживаемые LAPIC: однократное прерывание, периодические прерывание, и период, определяемый TSC.
Таймер в составе ACPI, почему-то называемый Performance Monitoring Timer (PMTIMER) — ещё одно устройство, которое поддерживается всеми системами, реализующими стандарт ACPI, с 1996 года. Данный таймер имеет частоту 3.579545 МГц, ширина регистра-счётчика может быть 24 или 32 бита. Сам таймер всегда активен при включенном питании системы и не зависит от режима работы центрального процессора.
High Precision Event Timer (HPET) — устройство, созданное как замена устаревшему PIT. Согласно стандарту, HPET должен содержать осциллятор, работающий с фиксированной частотой по крайней мере в 10 МГц, величину которой можно программно прочитать из его статусного регистра, и монотонно увеличивающий значение счётчик шириной в 64 бита. Также он должен содержать минимум три компаратора шириной в 32 или 64 бита, которые и используются для генерации прерываний по истечении запрограммированных периодов времени. Как и PIT, он способен работать в периодическом режиме или в режиме однократного прерывания. При этом метод его программирования (MMIO вместо PIO) удобнее и быстрее, чем у PIT, что вместе с повышенным разрешением, позволяет задавать интервалы более точно и с меньшей задержкой. Требуемая стабильность генератора равна 0,05% для интервалов длиннее 1 мс и 0,2% для промежутков короче 100 мкс; много это или мало — зависит от приложений.
Несмотря на то, что HPET уже давно присутствует в PC (с 2005 года), операционные системы не торопятся начать его использовать. Частично это вызвано не самым удобным способом задания интервалов с помощью возрастающего счётчика вместо убывающего — из-за немгновенности операций существует риск «не успеть» и задать событие в прошлом. Зачастую ОС используют таймер из APIC или PMTIMER, или же функциональность TSC, использующую такты процессора в качестве источника времени.
Трудная судьба инструкции RDTSC
История TSC достаточно интересна и поучительна, чтобы остановиться на ней подольше.
Сама идея очень прозрачная — использовать в качестве источника времени сам процессор, а точнее его тактовый генератор. Текущий номер такта сохраняется в регистре TSC (timestamp counter).
С помощью TSC можно как узнавать время от начала работы, так и замерять интервалы времени с помощью двух чтений. TSC также работает как будильник в связке с APIC в режиме TSC deadline.
Что ж, TSC — вполне естественная штука с простой логикой и простым сценарием использования, которая должна обладать многими полезными свойствами: высокое разрешение (один такт ЦПУ), низкая задержка при чтении (десятки тактов), редкие переполнения (64-битного счётчика должно хватать минимум на 10 лет), монотонность чтений (ведь счётчик всегда увеличивает своё значение), равномерность (процессор всегда работает), согласованность с другими таймерами (при старте системы можно выставить нужное значение записью в MSR).
Разве что-то могло пойти не так? На пути к успешному использованию TSC в качестве основного средства измерения времени в PC встала последующая эволюция процессоров. Новые возможности, появившиеся в процессорах после Pentium, «испортили» RDTSC и много лет мешали использовать её как основной таймер в популярных ОС. Так, в 2006 году один из Linux-разработчиков Ingo Molnar писал:
Мы наблюдали, что в течение 10 лет ни одной реализации gettimeofday, основанной на TSC и работающей в общем случае, не было написано (а я написал первую версию для Pentium, так что и я в этом повинен), и что лучше мы обойдёмся без неё.
We just observed that in the past 10 years no generally working TSC-based gettimeofday was written (and i wrote the first version of it for the Pentium, so the blame is on me too), and that we might be better off without it.
Отмечу, что со временем в архитектуру IA-32 вносились коррективы, устранявшие проявившиеся недостатки, и в настоящий момент TSC может (пока опять не сломали) быть использован в том качестве, в котором он задумывался.
Прочие устройства
Выше я описал наиболее часто распространённые и используемые устройства по определению времени. Конечно же, конкретные системы могут иметь дополнительные устройства, уникальные для процессора, интегрированной логики или даже в форме специализированных периферийных устройств (например, сверхточные атомные часы). Степень их доступности из программ зависит от того, существует ли драйвер для конкретного устройства в выбранной ОС. Так, пробежавшись по исходникам Linux, я нашёл как минимум ещё два поддерживаемых источника времени для сборок x86: устройство NatSemi SCx200 в системах AMD Geode, и Cyclone для систем IBM x440. К сожалению, в Интернете не очень много документации по ним.
Заключение
Я надеюсь, что из этой заметки стало понятно, что работа со временем внутри компьютера на системном уровне на самом деле далека от тривиальной. Требования к устройствам, поставляющим время, зависят от решаемой задачи, и не всегда легко найти полностью подходящий вариант. При этом сами устройства зачастую содержат «архитектурные особенности», способные сломать голову несчастному программисту.
Однако это всё архитектурная присказка к симуляционной сказке. На самом деле мне хотелось рассказать о том, как можно моделировать весь этот зоопарк устройств. В следующей статье я опишу, как проявляется капризная природа времени при создании виртуальных окружений — симуляторов и мониторов виртуальных машин. Спасибо за внимание!