2013-04-14 5 views
10

Ich verwende derzeit die do_gettimeofday() Funktion, um Zeit im Kernel zu messen, die mir Mikrosekunden Genauigkeit gibt. Gibt es etwas, das genauer ist (vielleicht in der Größenordnung von Nanosekunden)?Messen von Zeit im Linux Kernel Space mit Sub-Mikrosekunden Präzision

+1

Was genau wollen Sie so "genau" messen ...? Und Ihre Hardware ist nicht so deterministisch wie Sie denken (Cache-Misses können das Timing stark verändern) –

+0

Ich möchte die Zeit messen, die eine bestimmte Hardware benötigt, um eine bestimmte Operation durchzuführen. Ich messe das in seinem Treiber. –

Antwort

14

Die Funktion ktime_get() gibt ktime_t zurück, die eine Auflösung im Nanosekundenbereich hat.

+1

Der folgende Code, der diese Funktionen verwendet, scheint 0 zu produzieren: long long int nsTime = ktime_to_ns (ktime_get()); \t printk ("Startzeit in ns ist% d", nsTime); Irgendeine Idee warum? –

+3

@JohnRoberts: Sie müssen '% lld' verwenden, um ein' long long int 'auszudrucken. – caf

+1

@caf: Ich habe ein ähnliches Problem, d. H. Ich bekomme 0 ns. Code sieht in etwa so aus ... start = ktime_get(); ... Funktion(); ... Ende = ktime_get(); actual_time = ktime_to_ns (ktime_sub (Ende, Start)); printk (KERN_INFO "Zeit genommen =% lld \ n", (lang lang) actual_time); –

4

Wie ich weiß, sollte der genaueste Timer das prozessorspezifische Zählerregister sein (z. B. TSC in x86). Der Linux-Kernel stellt die Makros rdtsc, rdtscl und rdtscll aus der Datei "./arch/x86/include/asm/msr.h" bereit, um diesen Registerwert zu lesen. Für ARM, cycle counter register.

Diese Register unterscheiden sich alle von CPU zu CPU. Eine gemeinsame Schnittstelle für den Zugriff ist die Funktion "get_cycles", die in der Datei deklariert ist.

Vielleicht kann this document hilfreich sein.

+1

Ist TSC nicht zu unzuverlässig, wenn es um Multicore-Maschinen geht? –

+0

Sie haben Recht. Achten Sie bei Multicore-Rechnern darauf, das TSC-Register von einer bestimmten CPU zu verwenden. – Wonil

Verwandte Themen