getnstimeofday es una interfaz para __get_realtime_clock_ts pero también funciona si no hay relojes de alta resolución disponibles en el sistema. En este caso, getnstimeofday como se define en kernel/time.c (en lugar de kernel/time/timekeeping.c) se usa para proporcionar una especificación de tiempo que cumple solo los requisitos de baja resolución.
El kernel de Linux proporciona una serie de interfaces para administrar el tiempo. getnstimeofday es uno de ellos, que da la hora en segundos y nanosegundos. La función se implementa en “timekeeping32.h” y devuelve una estructura del tipo timespec que tiene dos miembros.
struct timespec64 { time64_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
Para imprimir la hora, solo necesitamos imprimir los valores de tv_sec y tv_nsec que se completan con la llamada a la función getnstimeofday. En el siguiente código de ejemplo, hemos creado una entrada de proceso llamada gettime, que imprime los valores de segundos y nanosegundos cuando se lee.
#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);
Guarde el código anterior como proc_read_gettimeofday.c y compile el código usando el siguiente archivo MAKE.
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
Compile e inserte el módulo usando:
$ make $ sudo insmod proc_read_getnstimeofday.ko
Para ver el resultado, simplemente lea la entrada proc gettime, usando el comando cat.
# cat /proc/gettime 1584690328 seconds 290430470 nanoseconds