私のシステムでは、以下から稼働時間を取得します/proc/uptime
。
$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY) = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY) = 4
10:52:38 up 3 days, 23:38, 4 users, load average: 0.00, 0.02, 0.05
procマンページから:
/proc/uptime
This file contains two numbers: the uptime of the system
(seconds), and the amount of time spent in idle process
(seconds).
procファイルシステムには、疑似ファイルのセットが含まれています。これらは実際のファイルではなく、ファイルのように見えますが、カーネルによって直接提供される値が含まれています。のようなファイルを読むたびに/proc/uptime
、その内容はその場で再生成されます。procファイルシステムは、カーネルへのインターフェースです。
ファイルのLinuxカーネルのソースコードでfs/proc/uptime.c
の行49には、関数呼び出しを参照してください。
proc_create("uptime", 0, NULL, &uptime_proc_fops);
これは、作成procファイルシステムエントリと呼ばれるuptime
(procfsの通常の下に装着され/proc
)、それに機能を関連付ける、その擬似ファイルおよびそれらに関連する機能に有効なファイル操作を定義します。稼働時間の場合、それだけだread()
とopen()
操作。ただし、関数をさかのぼると、ここで終了し、稼働時間が計算されます。
内部的には、システムの稼働時間を定期的に更新するタイマー割り込みがあります(他の値に加えて)。timer-interuptが刻む間隔はpreprocessor-macroによって定義されHZ
、その正確な値はカーネル構成ファイルで定義され、コンパイル時に適用されます。
アイドル時間とCPUサイクル数は、周波数HZ
(1秒あたりのサイクル数)と組み合わせて、最後のブート以降の数(秒単位)で計算できます。
質問に答えるには:「稼働時間」はいつからカウントされますか?
稼働時間はカーネルの内部値であり、サイクルごとに刻々と変化するため、カーネルが初期化されるとカウントを開始します。つまり、最初のサイクルが終了したときです。何かがマウントされる前でも、ブートローダーがカーネルイメージを制御した直後。