Updating the Time and Date
User programs get the current
time and date from the xtime
variable of type
struct timeval
. The kernel also occasionally
refers to it, for instance, when updating inode timestamps (see
Section 1.5.4). In particular,
xtime.tv_sec
stores the number of seconds that
have elapsed since midnight of January 1, 1970 (UTC), while
xtime.tv_usec
stores the number of microseconds
that have elapsed within the last second (its value ranges between 0
and 999999).
During kernel initialization, the time_init( )
function is invoked to set up the time and date. It reads them from
the Real Time Clock by invoking the get_cmos_time( )
function, then it initializes xtime
.
Once this has been done, the kernel does not need the RTC anymore; it
relies instead on the TIMER_BH
bottom half, which
is usually activated once every tick.
The update_times( )
function is equivalent to the
following:
void update_times(void) { unsigned long ticks; write_lock_irq(&xtime_lock); ticks = jiffies - wall_jiffies; if (ticks) { wall_jiffies += ticks; update_wall_time(ticks); } write_unlock_irq(&xtime_lock); calc_load(ticks); }
On a uniprocessor system, the write_lock_irq( )
and write_unlock_irq( )
functions simply disable
and enable the interrupts on the executing CPU; on multiprocessor
systems, they also acquire and release the
xtime_lock
spin lock, which protects against
concurrent accesses to the xtime
variable.
The wall_jiffies
variable stores the time of the
last update of the xtime
variable. ...
Get Understanding the Linux Kernel, Second Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.