Linux内核计时器

  linxu内核中完成的许多功能都需要感知时间的行进,比如定期把页面缓存中的数据写入磁盘,定期进行进程调度,提供获得当前时间的系统调用,还有计划任务的实现,让系统在某段时间之后执行某个程序,或者在某个时间点执行某个程序。以上这些功能对时间的把控都是由系统计时器完成的。

  我们可以把系统计时器简单的看做一个按固定频率产生中断的硬件芯片,产生的中断就叫做定时器中断,而和时间相关的任务都在这个中断的中断处理函数中执行。我们可以通过编程来设置发生中断的频率,系统通过一个叫jiffies的变量来记录从系统开始运行到目前为止一共发生了多少次定时器中断,这样通过jiffies加上固定的中断频率,系统就可以感知到目前经过了多少时间。

  在x86上时钟中断的频率是100HZ,也就是一秒钟发生100次中断,中断的频率决定了系统对时间感知的粒度,中断越频繁,系统感知时间的精度就越高,反之就越低。不过如果频率太高的话,频繁的执行中断函数会让造成过多的负担,所以要考虑多方面因素,折中的设置时钟中断频率。

  我们可以通过编写内核代码来查看当前的jiffies

#include 
#include 
#include  //jiffies
#include  //HZ
static int __init jiffies_init(void)
{
    printk(KERN_ALERT"===%s===\n", __func__);
    printk(KERN_ALERT"Current ticks is: %lu, seconds: %lu\n", jiffies, jiffies/HZ);
    return 0;
}
static void __exit jiffies_exit(void)
{
    printk(KERN_ALERT"===%s===\n", __func__);
}
module_init(jiffies_init);
module_exit(jiffies_exit);
KERNEL_VER = $(shell uname -r)

# the file to compile
obj-m += helloworld.o

# specify flags for the module compilation
EXTRA_CFLAGS = -g -O0

build: kernel_modules

kernel_modules:
	make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) clean

通过在linux内核中注册和删除模块时执行的宏命令可以打印出内核中的变量。

你可能感兴趣的:(Linux)