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
Antwort
Die Funktion ktime_get()
gibt ktime_t
zurück, die eine Auflösung im Nanosekundenbereich hat.
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? –
@JohnRoberts: Sie müssen '% lld' verwenden, um ein' long long int 'auszudrucken. – caf
@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); –
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.
Ist TSC nicht zu unzuverlässig, wenn es um Multicore-Maschinen geht? –
Sie haben Recht. Achten Sie bei Multicore-Rechnern darauf, das TSC-Register von einer bestimmten CPU zu verwenden. – Wonil
- 1. Linux-Timing über Kernel & User Space
- 2. Shutdown (embedded) Linux vom Kernel-Space
- 3. Netlink User-Space und Kernel-Space-Kommunikation
- 4. Zeitmessung im Linux Kernel 2.6
- 5. Wie schlafen im Linux-Kernel?
- 6. Ist es möglich, mit gdb und qemu Linux-Space-Programme und Kernel-Space gleichzeitig zu debuggen?
- 7. Aktiviere DRM_KMS_CMA_HELPER im Linux Kernel
- 8. stdlib.h Alternative im Linux-Kernel?
- 9. Wo wird der Gerätetreibercode ausgeführt? Kernel-Space oder User-Space?
- 10. Linux Kernel: copy_from_user - Struktur mit Zeigern
- 11. Wie kann ich eine bestimmte Funktion im Linux-Kernel messen oder verfolgen?
- 12. Userspace vs Kernel-Space-Treiber
- 13. RDMA-API für Linux-Kernel
- 14. Bildschirmwechsel-Antwort/Zeit messen?
- 15. Wie bekomme ich eine hohe Präzision Nano Sekundenverzögerung in Linux
- 16. Verwenden von User-Space-Prozessen zur Unterstützung von Kernel-Modulen
- 17. String-Manipulation im Linux-Kernel-Modul
- 18. hrtimer Wiederholung Aufgabe im Linux-Kernel
- 19. Nicht im Kernel-Speicher schreiben über Linux Kernel-Modul (Ubuntu)
- 20. Wie bekomme ich Sockfd aus Kernel-Space?
- 21. Debugging Windows Kernel von Linux
- 22. Messen der Ausführungszeit einer Funktion innerhalb des Linux-Kernels
- 23. mprotect() wie Funktionalität im Linux-Kernel
- 24. Aktuelle Zeit in Sekunden im Kernel-Modul
- 25. Warum kein Nullkopie-Netzwerk im Linux-Kernel?
- 26. Inter-Modul-Kommunikation im Linux-Kernel
- 27. nr_cpus Boot-Parameter im Linux-Kernel
- 28. Variable in Assembly im Linux-Kernel deklarieren?
- 29. Verständnis container_of Makro im Linux-Kernel
- 30. Welche Datenstrukturen sind im Linux-Kernel verfügbar?
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) –
Ich möchte die Zeit messen, die eine bestimmte Hardware benötigt, um eine bestimmte Operation durchzuführen. Ich messe das in seinem Treiber. –