No meu sistema, ele obtém o tempo de atividade de /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
Na página de manual do proc :
/proc/uptime
This file contains two numbers: the uptime of the system
(seconds), and the amount of time spent in idle process
(seconds).
O sistema de arquivos proc contém um conjunto de pseudo arquivos. Esses não são arquivos reais, apenas se parecem com arquivos, mas contêm valores que são fornecidos diretamente pelo kernel. Toda vez que você lê um arquivo, como /proc/uptime
, seu conteúdo é regenerado rapidamente. O sistema de arquivos proc é uma interface para o kernel.
No código-fonte do kernel linux do arquivo fs/proc/uptime.c
na linha 49 , você vê uma chamada de função:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Isso cria uma entrada do sistema de arquivos proc chamada uptime
(o procfs geralmente é montado em baixo /proc
) e associa uma função a ela, que define operações de arquivo válidas nesse pseudo arquivo e as funções associadas a eles. Em caso de uptime é apenas read()
e open()
operações. No entanto, se você rastrear as funções de volta, você terminará aqui , onde o tempo de atividade é calculado.
Internamente, há uma interrupção do timer que atualiza periodicamente o tempo de atividade do sistema (além de outros valores). O intervalo, no qual a interrupção do timer é marcada, é definido pela macro do pré-processador HZ
, cujo valor exato é definido no arquivo de configuração do kernel e aplicado no momento da compilação.
O tempo ocioso e o número de ciclos da CPU, combinados com a frequência HZ
(ciclos por segundo) podem ser calculados em um número (de segundos) desde a última inicialização.
Para responder à sua pergunta: Quando o tempo de atividade começa a contar?
Como o tempo de atividade é um valor interno do kernel, que aumenta a cada ciclo, ele começa a contar quando o kernel é inicializado. Ou seja, quando o primeiro ciclo terminar. Mesmo antes de qualquer coisa ser montada, logo após o gerenciador de inicialização controlar a imagem do kernel.