Linux utilise l'algorithme d'ajustement d'horloge de David L. Mills
(RFC 1305).
L'appel système
adjtimex()
lit, et écrit éventuellement les paramètres d'ajustement
pour cet algorithme.
Il utilise un pointeur sur une structure
timex
pour mettre à jour les paramètres du noyau avec les valeurs de ses champs,
et renvoyer la même structure avec les valeurs actuelles du noyau.
La structure est déclarée comme suit
struct timex {
int modes; /* mode selector */
long offset; /* time offset (usec) */
long freq; /* frequency offset (scaled ppm) */
long maxerror; /* maximum error (usec) */
long esterror; /* estimated error (usec) */
int status; /* clock command/status */
long constant; /* pll time constant */
long precision; /* clock precision (usec) (read only) */
long tolerance; /* clock frequency tolerance (ppm)
(read only) */
struct timeval time; /* current time (read only) */
long tick; /* usecs between clock ticks */
};
Le champ
modes
détermine les paramètres éventuels à écrire.
Il contient un
OU
binaire « | » entre les valeurs suivantes :
#define ADJ_OFFSET 0x0001 /* time offset */
#define ADJ_FREQUENCY 0x0002 /* frequency offset */
#define ADJ_MAXERROR 0x0004 /* maximum time error */
#define ADJ_ESTERROR 0x0008 /* estimated time error */
#define ADJ_STATUS 0x0010 /* clock status */
#define ADJ_TIMECONST 0x0020 /* pll time constant */
#define ADJ_TICK 0x4000 /* tick value */
#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime */
Les utilisateurs normaux sont limités à une valeur de
mode
nulle, seul le superutilisateur peut écrire les paramètres.