настроить часы ядра (tune kernel clock)
Описание (Description)
Linux uses David L. Mills' clock adjustment algorithm (see
RFC 5905). The system call adjtimex
() reads and optionally sets
adjustment parameters for this algorithm. It takes a pointer to
a timex structure, updates kernel parameters from (selected)
field values, and returns the same structure updated with the
current kernel values. This structure is declared as follows:
struct timex {
int modes; /* Mode selector */
long offset; /* Time offset; nanoseconds, if STA_NANO
status flag is set, otherwise
microseconds */
long freq; /* Frequency offset; see NOTES for units */
long maxerror; /* Maximum error (microseconds) */
long esterror; /* Estimated error (microseconds) */
int status; /* Clock command/status */
long constant; /* PLL (phase-locked loop) time constant */
long precision; /* Clock precision
(microseconds, read-only) */
long tolerance; /* Clock frequency tolerance (read-only);
see NOTES for units */
struct timeval time;
/* Current time (read-only, except for
ADJ_SETOFFSET); upon return, time.tv_usec
contains nanoseconds, if STA_NANO status
flag is set, otherwise microseconds */
long tick; /* Microseconds between clock ticks */
long ppsfreq; /* PPS (pulse per second) frequency
(read-only); see NOTES for units */
long jitter; /* PPS jitter (read-only); nanoseconds, if
STA_NANO status flag is set, otherwise
microseconds */
int shift; /* PPS interval duration
(seconds, read-only) */
long stabil; /* PPS stability (read-only);
see NOTES for units */
long jitcnt; /* PPS count of jitter limit exceeded
events (read-only) */
long calcnt; /* PPS count of calibration intervals
(read-only) */
long errcnt; /* PPS count of calibration errors
(read-only) */
long stbcnt; /* PPS count of stability limit exceeded
events (read-only) */
int tai; /* TAI offset, as set by previous ADJ_TAI
operation (seconds, read-only,
since Linux 2.6.26) */
/* Further padding bytes to allow for future expansion */
};
The modes field determines which parameters, if any, to set. (As
described later in this page, the constants used for
ntp_adjtime
() are equivalent but differently named.) It is a bit
mask containing a bitwise-or combination of zero or more of the
following bits:
ADJ_OFFSET
Set time offset from buf.offset. Since Linux 2.6.26, the
supplied value is clamped to the range (-0.5s, +0.5s). In
older kernels, an EINVAL
error occurs if the supplied
value is out of range.
ADJ_FREQUENCY
Set frequency offset from buf.freq. Since Linux 2.6.26,
the supplied value is clamped to the range (-32768000,
+32768000). In older kernels, an EINVAL
error occurs if
the supplied value is out of range.
ADJ_MAXERROR
Set maximum time error from buf.maxerror.
ADJ_ESTERROR
Set estimated time error from buf.esterror.
ADJ_STATUS
Set clock status bits from buf.status. A description of
these bits is provided below.
ADJ_TIMECONST
Set PLL time constant from buf.constant. If the STA_NANO
status flag (see below) is clear, the kernel adds 4 to
this value.
ADJ_SETOFFSET
(since Linux 2.6.39)
Add buf.time to the current time. If buf.status includes
the ADJ_NANO
flag, then buf.time.tv_usec is interpreted as
a nanosecond value; otherwise it is interpreted as
microseconds.
The value of buf.time is the sum of its two fields, but
the field buf.time.tv_usec must always be nonnegative.
The following example shows how to normalize a timeval
with nanosecond resolution.
while (buf.time.tv_usec < 0) {
buf.time.tv_sec -= 1;
buf.time.tv_usec += 1000000000;
}
ADJ_MICRO
(since Linux 2.6.26)
Select microsecond resolution.
ADJ_NANO
(since Linux 2.6.26)
Select nanosecond resolution. Only one of ADJ_MICRO
and
ADJ_NANO
should be specified.
ADJ_TAI
(since Linux 2.6.26)
Set TAI (Atomic International Time) offset from
buf.constant.
ADJ_TAI
should not be used in conjunction with
ADJ_TIMECONST
, since the latter mode also employs the
buf.constant field.
For a complete explanation of TAI and the difference
between TAI and UTC, see BIPM
⟨http://www.bipm.org/en/bipm/tai/tai.html⟩
ADJ_TICK
Set tick value from buf.tick.
Alternatively, modes can be specified as either of the following
(multibit mask) values, in which case other bits should not be
specified in modes:
ADJ_OFFSET_SINGLESHOT
Old-fashioned adjtime(3): (gradually) adjust time by value
specified in buf.offset, which specifies an adjustment in
microseconds.
ADJ_OFFSET_SS_READ
(functional since Linux 2.6.28)
Return (in buf.offset) the remaining amount of time to be
adjusted after an earlier ADJ_OFFSET_SINGLESHOT
operation.
This feature was added in Linux 2.6.24, but did not work
correctly until Linux 2.6.28.
Ordinary users are restricted to a value of either 0 or
ADJ_OFFSET_SS_READ
for modes. Only the superuser may set any
parameters.
The buf.status field is a bit mask that is used to set and/or
retrieve status bits associated with the NTP implementation.
Some bits in the mask are both readable and settable, while
others are read-only.
STA_PLL
(read-write)
Enable phase-locked loop (PLL) updates via ADJ_OFFSET
.
STA_PPSFREQ
(read-write)
Enable PPS (pulse-per-second) frequency discipline.
STA_PPSTIME
(read-write)
Enable PPS time discipline.
STA_FLL
(read-write)
Select frequency-locked loop (FLL) mode.
STA_INS
(read-write)
Insert a leap second after the last second of the UTC day,
thus extending the last minute of the day by one second.
Leap-second insertion will occur each day, so long as this
flag remains set.
STA_DEL
(read-write)
Delete a leap second at the last second of the UTC day.
Leap second deletion will occur each day, so long as this
flag remains set.
STA_UNSYNC
(read-write)
Clock unsynchronized.
STA_FREQHOLD
(read-write)
Hold frequency. Normally adjustments made via ADJ_OFFSET
result in dampened frequency adjustments also being made.
So a single call corrects the current offset, but as
offsets in the same direction are made repeatedly, the
small frequency adjustments will accumulate to fix the
long-term skew.
This flag prevents the small frequency adjustment from
being made when correcting for an ADJ_OFFSET
value.
STA_PPSSIGNAL
(read-only)
A valid PPS (pulse-per-second) signal is present.
STA_PPSJITTER
(read-only)
PPS signal jitter exceeded.
STA_PPSWANDER
(read-only)
PPS signal wander exceeded.
STA_PPSERROR
(read-only)
PPS signal calibration error.
STA_CLOCKERR
(read-only)
Clock hardware fault.
STA_NANO
(read-only; since Linux 2.6.26)
Resolution (0 = microsecond, 1 = nanoseconds). Set via
ADJ_NANO
, cleared via ADJ_MICRO
.
STA_MODE
(since Linux 2.6.26)
Mode (0 = Phase Locked Loop, 1 = Frequency Locked Loop).
STA_CLK
(read-only; since Linux 2.6.26)
Clock source (0 = A, 1 = B); currently unused.
Attempts to set read-only status bits are silently ignored.
clock_adjtime ()
The clock_adjtime
() system call (added in Linux 2.6.39) behaves
like adjtimex
() but takes an additional clk_id argument to
specify the particular clock on which to act.
ntp_adjtime ()
The ntp_adjtime
() library function (described in the NTP "Kernel
Application Program API", KAPI) is a more portable interface for
performing the same task as adjtimex
(). Other than the following
points, it is identical to adjtimex
():
* The constants used in modes are prefixed with "MOD_" rather
than "ADJ_", and have the same suffixes (thus, MOD_OFFSET
,
MOD_FREQUENCY
, and so on), other than the exceptions noted in
the following points.
* MOD_CLKA
is the synonym for ADJ_OFFSET_SINGLESHOT
.
* MOD_CLKB
is the synonym for ADJ_TICK
.
* The is no synonym for ADJ_OFFSET_SS_READ
, which is not
described in the KAPI.