Sul mio sistema ottiene il tempo di attività da /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
Dalla manpage proc :
/proc/uptime
This file contains two numbers: the uptime of the system
(seconds), and the amount of time spent in idle process
(seconds).
Il filesystem proc contiene un set di pseudo file. Questi non sono file reali, sembrano solo file, ma contengono valori forniti direttamente dal kernel. Ogni volta che leggi un file, ad esempio /proc/uptime
, il suo contenuto viene rigenerato al volo. Il filesystem proc è un'interfaccia per il kernel.
Nel codice sorgente del kernel linux del file fs/proc/uptime.c
alla riga 49 , vedi una chiamata di funzione:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Questo crea una voce del filesystem proc chiamata uptime
(il procfs è normalmente montato sotto /proc
) e associa ad esso una funzione, che definisce le operazioni di file valide su quel pseudo file e le funzioni ad esse associate. In caso di uptime è solo read()
e open()
operazioni. Tuttavia, se rintracci le funzioni , finirai qui , dove viene calcolato il tempo di attività.
Internamente, c'è un timer-interrupt che aggiorna periodicamente il tempo di attività del sistema (oltre ad altri valori). L'intervallo, in cui il timer-interruzione scatta, è definito dalla macro del preprocessore HZ
, il cui valore esatto è definito nel file di configurazione del kernel e applicato al momento della compilazione.
Il tempo di inattività e il numero di cicli della CPU, combinati con la frequenza HZ
(cicli al secondo), possono essere calcolati in un numero (di secondi) dall'ultimo avvio.
Per rispondere alla tua domanda: da dove inizia il conteggio dei "tempi di attività"?
Poiché il tempo di attività è un valore interno del kernel, che aumenta ogni ciclo, inizia a contare quando il kernel è stato inizializzato. Cioè, quando il primo ciclo è terminato. Anche prima che qualsiasi cosa sia montata, subito dopo il bootloader dà il controllo all'immagine del kernel.