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