Linux
hardware

時計回りの話

More than 3 years have passed since last update.


時計の違い

linuxのntp周りの資料を見ていると、漠然とハードウェアクロックとシステムクロックという単語に出くわすのだが、正直なんのことを言っているのか分からなかったので調べてみた。正直まだまだ分からないことだらけだけど、備忘録として記載します。(間違ってる可能性もあるので、自分でちゃんと調べてね)


システムクロック

まずはシステムクロックについて記載する、linuxは内部に時計のカウンタ変数を持っていて、boot時にその値を初期化した後、その値を定期的に増やす。そのOSを含むプログラムはカウンタの数字を見て、現在の時刻を判断する。まず値が増やすタイミングについて述べると、専用のチップが定期的にOSにハードウェア的な割り込みをかけていて、それトリガーで増える。割り込みをかけているチップは色々種類があるみたいで、PITやら、TSCやら、HPETと呼ばれるハードウェアがあるらしい(それぞれ精度に差がある)。次に初期化について述べる、これはboot時にハードウェアクロックの値を参照している。


ハードウェアクロック

ではハードウェアクロックとは何か、というと、マザーボードには時刻を淡々とカウントしているチップがあってその値の事をいう。名前はBIOSクロックやら、CMOSクロックやら呼ばれる事がある。linuxのboot時にはこのチップ内の値が読み込まれて、システムクロックのカウンタが初期化される。なお、設定にもよるが、shutdown時にはシステムクロックをハードウェアクロックに書き込むことがある。


linuxが見てる時計

上記をまとめると、linuxの時計というのは、マザボ上のチップ(OSに寄らず淡々とカウントしている)を読み込み、別チップ(HPETの場合は同じという話もあるが、未調査)からの周期信号を当てにしてカウントを進める仕組みなっている。また、OSを落とすときにはカウントをチップに書き込んで終わる。


おまけ

vmwareはこの周りの話について丁寧な文章を残していてとても参考になる。仮想化していないHWの様子やら、いかにして仮想化を実現しているか等の記載がある。(この記事で一番有用な情報)

http://www.vmware.com/files/pdf/Timekeeping-In-VirtualMachines.pdf