PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeits seit kernel start



iluminat23
03-01-2011, 09:54
Hallo,

ich suche eine(n) Funktion/Syscall/... mit hilfe dessen ich die Zeit seit start des linux-kernels bekomme. ich brauche aber eine höhere auflösung als in /proc/uptime. ideal wäre die form wie sie im syslog von vielen distributionen steht:

[ 1.320709] TCP cubic registered

gruß iluminat23

jeebee
03-01-2011, 11:30
#include <time.h>
#include <errno.h>
#include <stdio.h>

int main() {
struct timespec t;
if (clock_gettime(CLOCK_MONOTONIC, &t) < 0) {
perror("clock_gettime");
return 1;
}
printf("%u.%lu\n", (unsigned)t.tv_sec, t.tv_nsec);
}

Kompilieren mit
gcc -lrt -o clk clk.c

iluminat23
03-01-2011, 11:44
Hallo jeebee,

danke für den tipp. leider hinkt die zeit die ich mit clock_gettime(CLOCK_MONOTONIC, ...) bekomme ungefähr 10s hinter der zeit im vergleich zum syslog her. die manpage schreibt folgendes:

CLOCK_MONOTONIC
Clock that cannot be set and represents monotonic time since some unspecified starting point.
dies ist für mich leider nicht brauchbar. ich brauche eine festen startpunkt. am besten bootzeit des kernels oder einschlatzeitpunkt der CPU.

ein wenig mehr zum hintergrund:
ich schreibe aktuell einen init-prozess für eine embedded platform. diese Zeiten sollen hinweise für die startzeit der verschiedenen services und aktionen bieten. ich weiß, dass dies keine gute profiling methode darstellt.

gruß iluminat23

jeebee
03-01-2011, 12:55
Also bei mir hat's jetzt (zufällig?) ziemlich genau die gleichen Werte wie im syslog gegeben :)


$ ./clk
26959.132885839
Segmentation fault


[26959.132975] clk[1286]: segfault at 0 ip 0000000000400645 sp 0007fff8b5f5f40 error 4 in clk[400000+1000]

iluminat23
03-01-2011, 13:02
hier:

./time
18844.81925274
Segmentation fault
und:

[18847.986850] time[7454]: segfault at fffffffd ip 0017fe91 sp bf9eddf8 error 4 in libc-2.11.1.so[110000+153000]

gruß iluminat23

jeebee
03-01-2011, 13:27
hmm, hab mal ein bisschen im Kernel rumgestöbert und folgendes gefunden:

start_kernel() -> timekeeping_init() liest die aktuelle Zeit zum Aufruf-Zeitpunkt oder Architektur-Spezifisch den Bootzeitpunkt aus.

Dieser Timestamp wird dann als 0 für CLOCK_MONOTONIC verwendet.

printk (also das syslog) verwendet cpu_clock(), die je nach Architektur auf einem HW-Timer oder sonstwas basiert.