У моїй системі він отримує час роботи /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/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);
Це створює запис файлової системи procuptime
( називається profs, як правило, встановлений під /proc
), і пов'язує з ним функцію, яка визначає дійсні файлові операції з цим псевдофайлом та пов'язані з ними функції. У разі безперервної роботи це просто read()
і open()
операції. Однак якщо ви відстежите функції назад, ви опинитесь тут , де обчислюється тривалість часу.
Внутрішньо існує таймер-переривник, який періодично оновлює роботу системи (крім інших значень). Інтервал, на якому тикер-інтерпульт відзначається, визначається препроцесором-макросом HZ
, точне значення якого визначено у файлі конфігурації ядра та застосовується під час компіляції.
Час очікування та кількість циклів процесора в поєднанні з частотою HZ
(цикли в секунду) можуть бути обчислені за кількість (секунд) з моменту останнього завантаження.
Щоб вирішити своє запитання: звідки починається підрахунок часу "безперервного часу"?
Оскільки час роботи - це внутрішнє значення ядра, яке позначає кожен цикл, воно починає рахувати, коли ядро ініціалізується. Тобто, коли перший цикл закінчився. Ще до того, як щось буде встановлено, безпосередньо після завантажувача надається управління зображенням ядра.