Сведения о параметрах времени в системной странице
#include <sys/syspage.h>
struct qtime_entry {
uint64_t cycles_per_sec;
uint64_t volatile nsec_tod_adjust;
uint64_t volatile nsec;
unsigned long nsec_inc;
unsigned long boot_time;
struct _clockadjust adjust;
unsigned long timer_rate;
long timer_scale;
unsigned long timer_load;
long intr;
unsigned long epoch;
unsigned long flags;
unsigned int rr_interval_mul;
unsigned long spare0;
uint64_t volatile nsec_stable;
unsigned long spare[4];
};
Тип позволяет олучать из системной страницы сведения о параметрах времени. Структура включает следующие поля:
- cycles_per_sec
- Количество тактов ЦПУ в секунду для этой системы. Для получения дополнительной информации см. ClockCycles().
- nsec_tod_adjust
- Сумма этого поля и поля nsec равна количеству наносекунд с (00:00:00 UTC) 1 января 1970 года.
- nsec
- Это 64-разрядное поле содержит количество наносекунд с момента загрузки системы.
 | Поле nsec всегда монотонно увеличивается и не изменяется при задании текущего времени с помощью функции ClockTime() или ClockAdjust(). Поскольку обработчик прерываний таймера изменяет оба поля nsec и nsec_tod_adjust, но их значения слишком велики для передачи в атомарную операцию чтения, для их считывания необходимо: - отключать прерывания или
- дважды считывать значения и проверять, что они не изменились.
|
- nsec_inc
- Количество наносекунд, которые истекли на момент каждого прерывания часов.
- boot_time
- Количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года («эпохи Unix») (UTC - всемирное координированное время)) до момента загрузки системы.
Если вы вызываете ClockTime() для установки времени суток, ядро проверяет равно ли это поле нулю. Если это так, ядро устанавливает для него соответствующее значение. Для всех программ запуска существует опция -T, которая предотвращает установку этого поля, так что ядро установит его при первом вызове ClockTime() для изменения времени суток. Это полезно, если часы реального времени работают не в UTC. - adjust
- Содержит текущие параметры корректировки отсчетного времени, которые задаются функцией ClockAdjust(); равно нулю при запуске системы.
- timer_rate
- timer_scale
- Параметры timer_rate и timer_scale связаны с входной частотой микросхемы внешнего счетчика в герцах следующим образом: 1 / (timer_rate x 1 ^ timer_scale).
Это выражение подразумевает, что timer_scale имеет отрицательное значение, и используется для того, чтобы результат вычисления timer_rate содержал максимальное количество значимых цифр. Например, на платформе x86 со стандартным оборудованием значение timer_rate равно 838095345UL, а значение timer_scale = -15. Это означает, что период таймера измеряется в фемтосекундах (-15 означает 10-15); фактическое значение составляет 838 095 345 фемтосекунд (примерно 838 наносекунд). - timer_load
- Значение делителя частоты микросхемы таймера. Модуль startup-* оставляет его равным нулю, а ядро устанавливает его в зависимости от последних значений ClockPeriod() и timer_rate / timer_scale. Затем значение делителя частоты записывается микросхему таймера callout-ами ядра timer_load() / timer_reload().
- intr
- Содержит вектор прерываний, который используется микросхемой часов.
- epoch
- В настоящее время равно 1970, но не используется.
- flags
- Указывает, что аппаратный таймер обслуживается процессором с номером 0.
- rr_interval_mul
- Множитель ticksize для интервала карусельной дисциплины планирования (Round-Robin scheduling).
- nsec_stable
- Устаревшее поле.
ЗОСРВ «Нейтрино»
struct syspage_entry, ClockCycles(), ClockTime(), SYSPAGE_ENTRY()
Руководство по разработке модуля startup
Предыдущий раздел: Описание API системной библиотеки