Trên hệ thống của tôi, nó nhận được thời gian hoạt động từ /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
Từ trang web của Proc :
/proc/uptime
This file contains two numbers: the uptime of the system
(seconds), and the amount of time spent in idle process
(seconds).
Hệ thống tập tin Proc chứa một tập hợp các tập tin giả. Đó không phải là các tệp thực, chúng trông giống như các tệp, nhưng chúng chứa các giá trị được cung cấp trực tiếp bởi kernel. Mỗi khi bạn đọc một tập tin, chẳng hạn như /proc/uptime
, nội dung của nó được tạo lại một cách nhanh chóng. Hệ thống tập tin Proc là một giao diện cho kernel.
Trong mã nguồn hạt nhân linux của tệp fs/proc/uptime.c
ở dòng 49 , bạn thấy một lệnh gọi hàm:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Điều này tạo ra một mục nhập hệ thống tập tin Proc được gọi là uptime
(Procfs thường được gắn bên dưới /proc
) và liên kết một chức năng với nó, xác định các hoạt động tệp hợp lệ trên tệp giả đó và các chức năng liên quan đến chúng. Trong trường hợp thời gian hoạt động, nó chỉ read()
và open()
hoạt động. Tuy nhiên, nếu bạn theo dõi các chức năng trở lại, bạn sẽ kết thúc tại đây , nơi tính thời gian hoạt động.
Trong nội bộ, có một bộ đếm thời gian ngắt cập nhật định kỳ thời gian hoạt động của hệ thống (bên cạnh các giá trị khác). Khoảng thời gian, trong đó các dấu ngắt xen kẽ hẹn giờ, được xác định bởi macro tiền xử lý HZ
, có giá trị chính xác được xác định trong tệp cấu hình kernel và được áp dụng tại thời điểm biên dịch.
Thời gian nhàn rỗi và số chu kỳ CPU, kết hợp với tần số HZ
(chu kỳ mỗi giây) có thể được tính bằng một số (tính bằng giây) kể từ lần khởi động cuối cùng.
Để giải quyết câu hỏi của bạn: Khi nào thì uptime thời gian bắt đầu tính từ đâu?
Vì thời gian hoạt động là một giá trị bên trong kernel, đánh dấu mỗi chu kỳ, nên nó bắt đầu đếm khi kernel đã khởi tạo. Đó là, khi chu kỳ đầu tiên đã kết thúc. Ngay cả trước khi mọi thứ được gắn kết, trực tiếp sau khi bộ nạp khởi động cung cấp quyền kiểm soát cho hình ảnh hạt nhân.