GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Beispiel für die Verwendung von getnstimeofday im Linux-Kernel

getnstimeofday ist ein Frontend für __get_realtime_clock_ts, funktioniert aber auch, wenn keine hochauflösenden Uhren im System verfügbar sind. In diesem Fall wird getnstimeofday, wie in kernel/time.c definiert (anstelle von kernel/time/timekeeping.c), verwendet, um eine Zeitangabe bereitzustellen, die nur Anforderungen mit niedriger Auflösung erfüllt.

Der Linux-Kernel bietet eine Reihe von Schnittstellen zur Zeitverwaltung. getnstimeofday ist einer davon, der die Zeit in Sekunden und Nanosekunden angibt. Die Funktion ist in „timekeeping32.h“ implementiert und liefert eine Struktur vom Typ timepec zurück, die zwei Member hat.

struct timespec64 {
 time64_t tv_sec;   /* seconds */
 long  tv_nsec;  /* nanoseconds */
};

Um die Zeit zu drucken, müssen wir nur die Werte von tv_sec und tv_nsec drucken, die durch den Aufruf der Funktion getnstimeofday gefüllt werden. Im folgenden Beispielcode haben wir einen proc-Eintrag namens gettime erstellt, der beim Lesen die Werte von Sekunden und Nanosekunden ausgibt.

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/slab.h>

int len;
char *msg;
ssize_t size;
struct timespec ts;

ssize_t read_proc(struct file *filp,char *buf,size_t count,loff_t *offp ) 
{
struct timespec ts;
char *temp;
temp=kmalloc(50*sizeof(char),GFP_KERNEL);
getnstimeofday(&ts);
sprintf(temp,"%ld seconds \n%ld nanoseconds\n",ts.tv_sec, ts.tv_nsec);
len=strlen(temp);
size=sizeof(char)*len;

return simple_read_from_buffer(buf,count,offp,temp,size);
}

struct file_operations proc_fops = {
read:   read_proc
};
void create_new_proc_entry(void) 
{
proc_create("gettime",0,NULL,&proc_fops);
}

int proc_init (void) {
    create_new_proc_entry();
    return 0;
}

void proc_cleanup(void) {
        remove_proc_entry("gettime",NULL);
}

MODULE_LICENSE("GPL");  
module_init(proc_init);
module_exit(proc_cleanup);

Speichern Sie den obigen Code als proc_read_gettimeofday.c und kompilieren Sie den Code mit dem folgenden Makefile.

ifneq ($(KERNELRELEASE),)    
   obj-m := proc_read_gettimeofday.o 
else 

KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd)

default:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
clean:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

Kompilieren und fügen Sie das Modul ein mit:

$ make
$ sudo insmod proc_read_getnstimeofday.ko

Um die Ausgabe zu sehen, lesen Sie einfach den proc-Eintrag gettime mit dem cat-Befehl.

# cat /proc/gettime 
1584690328 seconds 
290430470 nanoseconds


Linux
  1. Debuggen Sie Linux mit ProcDump

  2. Der Lebenszyklus des Linux-Kernel-Testens

  3. Linux – Kernel:Namespaces-Unterstützung?

  4. Linux – Ein verdorbener Kernel in Linux?

  5. Linux – Aufrufmethoden für Systemaufrufe im neuen Kernel?

Ist Linux ein Betriebssystem oder ein Kernel?

Linux-Kernel vs. Mac-Kernel

Linux-Kernel und seine Funktionen

Installieren Sie MongoDB mit Vagrant unter Linux

Was tun bei einer Linux-Kernel-Panik?

Verwenden des Watch-Befehls unter Linux