GNU/Linux >> Tutoriels Linux >  >> Linux

Exemple d'utilisation de getnstimeofday dans le noyau Linux

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


Linux
  1. Déboguer Linux avec ProcDump

  2. Le cycle de vie des tests du noyau Linux

  3. Comment mettre à niveau le noyau sur Linux Desktop

  4. Linux – Noyau :Prise en charge des espaces de noms ?

  5. Exemple d'utilisation de canaux nommés dans Linux Bash

Linux est-il un système d'exploitation ou un noyau ?

Le noyau Linux contre. Mac noyau

Le noyau Linux et ses fonctions

Installer MongoDB à l'aide de Vagrant sous Linux

Que faire en cas de panique du noyau Linux

Utilisation de la commande Watch sous Linux