RTC
RTC 是用来存放系统时间的设备。即使是系统关闭后也能通过主板上的电池进行供电。
当系统启动后,内核读取 RTC 来初始化 墙上时间 。该时间存放在 xtime 变量中。
epoch
Unix 中日期的计算基准有两个:epoch 和 Unix epoch,后者为事实上的标准。
根据 rfc1305 的定义,时间由两部分组成:
字段名 | 数据类型 | 解释 |
---|---|---|
seconds | u32 | 自 epoch 起始的秒数 |
fraction | u32 | \(2^{-32}\) 秒 |
epoch 以 1900 年为时间基准,根据定义,时间会在 2036 年发生溢出。目前只有 NTP 协议以此为时间基准。
unix epoch 以 1970 年为时间基准。目前为事实上的标准。
TIPS: unix epoch 和 epoch 相差 2_208_988_800s。
PIT
x86 体系中,主要依赖于 PIT(可编程中断时钟)实现定时器效果。内核在启动时根据 HZ 对 PIT 进行初始化,使其以指定间隔产生时钟中断。
所谓 HZ,是内核编译时定义的常量。规定了每秒中产生的时钟中断数量(通过 PIT 实现)。HZ 是内核计时的最小单位。 早期操作系统一般将 HZ 设置为 100。现代操作系统更新为 1000。更高的 HZ 代表了时钟中断产生的频繁程度。同时也能提高时间驱动事件的精度。但是也意味着耗电量的提升。 |
jiffy
jiffy 变量储存了系统启动以来产生的节拍数量。启动时被初始化为零,此后每次时钟中断都会将此值进行递增。
由于一秒钟内时钟中断的次数为 HZ,因此 jiffies 一秒内增加的值也为 HZ。系统自启动以来运行的时间为 \(\frac{jiffies}{HZ}\) 。
jiffy 变量的类型为 usize。对于 32 位系统,在 100HZ 的情况下,497 天后溢出,在 1000HZ 的情况下 49.7 天溢出。在 64 系统下不会出现溢出。