GNU/Linux >> Tutoriales Linux >  >> Linux

Ejemplo de uso de getnstimeofday en el kernel de Linux

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


Linux
  1. Depurar Linux usando ProcDump

  2. Cómo actualizar Kernel en Linux Desktop

  3. Linux:¿un núcleo corrupto en Linux?

  4. Linux:¿los diferentes kernels de Linux/unix son intercambiables?

  5. Ejemplo de uso de canalizaciones con nombre en Linux Bash

¿Linux es un sistema operativo o un kernel?

Núcleo de Linux vs. Núcleo de Mac

Kernel de Linux y sus funciones

Instale MongoDB usando Vagrant en Linux

Qué hacer en caso de pánico en el kernel de Linux

Usando el comando Watch en Linux