Guest operating systems need to be aware of the passage of both real
(or wallclock) time and their own `virtual time' (the time for which
they have been executing). Furthermore, Xen has a notion of time which
is used for scheduling. The following notions of time are provided:
- Cycle counter time.
This provides a fine-grained time reference. The cycle counter time
is used to accurately extrapolate the other time references. On SMP
machines it is currently assumed that the cycle counter time is
synchronized between CPUs. The current x86-based implementation
achieves this within inter-CPU communication latencies.
- System time.
This is a 64-bit counter which holds the number of nanoseconds that
have elapsed since system boot.
- Wall clock time.
This is the time of day in a Unix-style struct timeval
(seconds and microseconds since 1 January 1970, adjusted by leap
seconds). An NTP client hosted by domain 0 can keep this
value accurate.
- Domain virtual time.
This progresses at the same pace as system time, but only while a
domain is executing -- it stops while a domain is de-scheduled.
Therefore the share of the CPU that a domain receives is indicated
by the rate at which its virtual time increases.
Xen exports timestamps for system time and wall-clock time to guest
operating systems through a shared page of memory. Xen also provides
the cycle counter time at the instant the timestamps were calculated,
and the CPU frequency in Hertz. This allows the guest to extrapolate
system and wall-clock times accurately based on the current cycle
counter time.
Since all time stamps need to be updated and read atomically
a version number is also stored in the shared info page, which is
incremented before and after updating the timestamps. Thus a guest can
be sure that it read a consistent state by checking the two version
numbers are equal and even.
Xen includes a periodic ticker which sends a timer event to the
currently executing domain every 10ms. The Xen scheduler also sends a
timer event whenever a domain is scheduled; this allows the guest OS
to adjust for the time that has passed while it has been inactive. In
addition, Xen allows each domain to request that they receive a timer
event sent at a specified system time by using the set_timer_op() hypercall. Guest OSes may use this timer to
implement timeout values when they block.