В моей системе он получает время безотказной работы /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()
операции. Однако, если вы проследите функции обратно, вы окажетесь здесь , где рассчитывается время безотказной работы.
Внутренне, существует прерывание по таймеру, которое периодически обновляет время работы системы (помимо других значений). Интервал, в течение которого отсчитывается таймер-прерывание, определяется макросом препроцессора HZ
, точное значение которого определяется в файле конфигурации ядра и применяется во время компиляции.
Время простоя и количество циклов ЦП в сочетании с частотой HZ
(циклов в секунду) можно рассчитать в количестве (секунд) с момента последней загрузки.
Чтобы ответить на ваш вопрос: когда «uptime» начинает считать?
Поскольку uptime является внутренним значением ядра, которое увеличивается каждый цикл, он начинает считать, когда ядро инициализируется. То есть когда первый цикл закончился. Еще до того, как что-либо монтируется, непосредственно после того, как загрузчик дает контроль над образом ядра.