getnstimeofday est une interface pour __get_realtime_clock_ts mais fonctionne également si aucune horloge haute résolution n'est disponible dans le système. Dans ce cas, getnstimeofday tel que défini dans kernel/time.c (au lieu de kernel/time/timekeeping.c) est utilisé pour fournir une spécification de temps qui ne répond qu'aux exigences de basse résolution.
Le noyau Linux fournit un certain nombre d'interfaces pour gérer le temps. getnstimeofday est l'un d'entre eux, qui donne l'heure en secondes et en nanosecondes. La fonction est implémentée dans "timekeeping32.h" et retourne une structure de type timespec qui a deux membres.
struct timespec64 { time64_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
Pour imprimer l'heure, il suffit d'imprimer les valeurs de tv_sec et tv_nsec qui sont remplies par l'appel à la fonction getnstimeofday. Dans l'exemple de code suivant, nous avons créé une entrée proc appelée gettime, qui imprime les valeurs des secondes et des nanosecondes lors de la lecture.
#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);
Enregistrez le code ci-dessus sous proc_read_gettimeofday.c et compilez le code à l'aide du makefile suivant.
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
Compilez et insérez le module en utilisant :
$ make $ sudo insmod proc_read_getnstimeofday.ko
Pour voir la sortie, lisez simplement l'entrée proc gettime, en utilisant la commande cat.
# cat /proc/gettime 1584690328 seconds 290430470 nanoseconds