2016-03-30 3 views
0

Ich habe Kernel-Modul geschrieben, um die Richtigkeit der Kernel-Funktion ndelay() zu messen.Wie bekomme ich eine hohe Präzision Nano Sekundenverzögerung in Linux

#include <linux/module.h> 
#include <linux/init.h> 
#include <linux/kernel.h> 
#include <linux/time.h> 
#include <linux/delay.h> 
static int __init initialize(void) 
{ 
    ktime_t start, end; 
    s64 actual_time; 
    int i; 
    for(i=0;i<10;i++) 
    { 
     start = ktime_get(); 
      ndelay(100);    
     end = ktime_get(); 
     actual_time = ktime_to_ns(ktime_sub(end, start)); 
     printk("%lld\n",(long long)actual_time);  
    } 
    return 0; 
} 

static void __exit final(void) 
{ 
    printk(KERN_INFO "Unload module\n"); 
} 

module_init(initialize); 
module_exit(final); 

MODULE_AUTHOR("Bhaskar"); 
MODULE_DESCRIPTION("delay of 100ns"); 
MODULE_LICENSE("GPL"); 

die Ausgabe von dmesg ist wie folgt:

[16603.805783] 514 
[16603.805787] 350 
[16603.805789] 373 
[16603.805791] 323 
[16603.805793] 362 
[16603.805794] 320 
[16603.805796] 331 
[16603.805797] 312 
[16603.805799] 304 
[16603.805801] 350 

Ich habe durch einen der Pfosten in Stackoverflow gegangen: Why udelay and ndelay is not accurate in linux kernel?

Aber ich will eine feine Nanosekunde Verzögerung abgestimmt (wahrscheinlich in der Bereich von 100-250ns) im Kernelraum. Kann mir bitte jemand eine Alternative dazu vorschlagen?

+0

http://stackoverflow.com/q/7684359/995714 –

+0

Dies ist nicht im Kernel-Space arbeiten. Ich möchte eine Kernel-Space-Funktion. Danke –

+0

Diese Zahlen enthalten die Zeit, die benötigt wird, um 'ktime_get()' aufzurufen; die tatsächliche Verzögerung ist kleiner. –

Antwort

0

können Sie

High resolution timers (or hrtimers) 

    hrtimer_init 
    hrtimer_start 
    hrtimer_cancel 

Funktionen nutzen. Ein Beispiel ist verfügbar here

0

Wenn Sie nur auf x86-System abzielen, können Sie den Aufruf von rdtsc() verwenden, um die Anzahl der CPU-Taktzeiten zu ermitteln. Die rdtsc() API hat sehr wenig Overhead. Aber Sie müssen von CPU-Uhr zu ns konvertieren, es hängt davon ab, wie schnell Ihre CPU-Uhr läuft.

static unsigned long long rdtsc(void) 
{ 
    unsigned int low, high; 
    asm volatile("rdtsc" : "=a" (low), "=d" (high)); 
    return low | ((unsigned long long)high) << 32; 
} 

Andernfalls können Sie die Kernel-Hochauflösungs-Timer-API verwenden.

+0

Das obige Code-Snippet gibt die Anzahl der Zyklen oder die Zeitlücke selbst zurück? –

+0

rdtsc gibt nur Taktzyklen zurück. Es ist schnell, geringer Overhead, aber Sie müssen es basierend darauf konvertieren, wie schnell Ihre CPU ist und es ist nur x86. –

+0

Danke für Ihren Kommentar. Aber ich bin hier ziemlich verwirrt. Meine CPU hat 12 Kerne. Können Sie ein Beispiel angeben, um die Anzahl der Zyklen, die von rdtsc erhalten werden, in die tatsächliche Zeit in Nanosekunden umzurechnen? –