W moim systemie czas przestoju jest uzyskiwany z /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
Ze strony proc :
/proc/uptime
This file contains two numbers: the uptime of the system
(seconds), and the amount of time spent in idle process
(seconds).
System plików proc zawiera zestaw pseudo plików. To nie są prawdziwe pliki, po prostu wyglądają jak pliki, ale zawierają wartości dostarczane bezpośrednio przez jądro. Za każdym razem, gdy czytasz plik, na przykład /proc/uptime
jego zawartość jest regenerowana w locie. System plików proc jest interfejsem do jądra.
W kodzie źródłowym jądra linuksa pliku fs/proc/uptime.c
w wierszu 49 widać wywołanie funkcji:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Tworzy to pozycję systemu plików proc o nazwie uptime
(procfs jest zwykle montowany pod /proc
) i kojarzy z nią funkcję, która definiuje prawidłowe operacje na pliku na tym pseudo pliku i funkcje z nimi związane. W przypadku przestojów jest to po prostu read()
i open()
operacji. Jeśli jednak prześledzisz funkcje z powrotem, skończysz tutaj , gdzie obliczany jest czas sprawności.
Wewnętrznie występuje przerwa czasowa, która okresowo aktualizuje czas pracy systemu (oprócz innych wartości). Interwał, w którym tyka przerwanie timera, jest definiowany przez makro preprocesora HZ
, którego dokładna wartość jest zdefiniowana w pliku konfiguracyjnym jądra i stosowana w czasie kompilacji.
Czas bezczynności i liczbę cykli procesora w połączeniu z częstotliwością HZ
(cykli na sekundę) można obliczyć w liczbie (sekundach) od ostatniego uruchomienia.
Aby odpowiedzieć na twoje pytanie: od kiedy zaczyna się „uptime”?
Ponieważ czas działania jest wewnętrzną wartością jądra, która zaznacza się w każdym cyklu, zaczyna się odliczać po zainicjowaniu jądra. Oznacza to, że pierwszy cykl się skończył. Nawet zanim cokolwiek zostanie zamontowane, bezpośrednio po tym, jak bootloader daje kontrolę nad obrazem jądra.