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. ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access