systemadmin.es > Kernel > Obtener diferencias de tiempo desde un modulo del kernel con los jiffies

Obtener diferencias de tiempo desde un modulo del kernel con los jiffies

En los módulos del kernel una forma práctica de obtener las diferencias de tiempo entre dos eventos es usando la variable jiffies.

La variable jiffies permite obtener el tiempo desde el último arranque del kernel, y se va incrementando en función de la constante HZ. Dicha constante puede variar según la arquitectura, en el caso de x86_64 esta a 1000.

Para el caso del modulo del kernel maslarga que modifica el uptime del sistema podemos usar la variable jiffies para que una vez modificado el uptime se vaya incrementando de nuevo a un ritmo normal.

Para ello simplemente deberemos guardar el valor de jiffies y sumarlo al valor en función de la constante HZ:

(jiffies-start_jiffies)/HZ

Por lo que el módulo quedaría:

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
#include <linux/time.h>
#include <linux/kernel_stat.h>
#include <asm/cputime.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("systemadmin.es");

static unsigned long niuuptime = 666;
module_param(niuuptime, long, 0);

static unsigned long startjiff=0;

static int uptime_proc_show(struct seq_file *m, void *v)
{
        seq_printf(m, "%lu.%02lu %lu.%02lu\n",
			(unsigned long) ((jiffies-startjiff)/HZ)+(niuuptime*86400),
                        (unsigned long) 0,
                        (unsigned long) 0,
                        (unsigned long) 0);
        return 0;
}

static int uptime_proc_open(struct inode *inode, struct file *file)
{
        return single_open(file, uptime_proc_show, NULL);
}

static const struct file_operations uptime_proc_fops = {
        .open           = uptime_proc_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
        .release        = single_release,
};

static int __init proc_uptime_init(void)
{
        startjiff=jiffies;
        proc_create("uptime", 0, NULL, &uptime_proc_fops);
        return 0;
}
module_init(proc_uptime_init);

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>