您的位置:首页 > 运维架构 > Linux

内核中时间获取和比较 -- linux内核

2015-01-22 10:35 267 查看
linux内核是通过定时器中断来跟踪时间流;使用"HZ"宏表示1秒的时钟中断次数;
并使用"jiffies"及"jiffies_64"变量来记录时钟中断次数,在系统引导时计数器初始化为0。
  示例4_1

#include <linux/jiffies.h>

unsigned long stamp;

stamp = jiffies + HZ; /* 之后1秒 */

while( jiffies < stamp) /* 在这里忙等待1秒 */

{ cpu_relax();}

  1
比较jiffies计数器
   内核提供的辅助函数

#include <linux/jiffies.h>

int time_after(unsigned long a, unsigned b); 
   /* a时间比b靠后时,返回真 */

int time_before(unsigned long a, unsigned b);    /* a比b靠前时,返回真 */

int time_after_eq(unsigned long a, unsigned b);  /* a比b靠后或相等,返回真 */

int time_before_eq(unsigned long a, unsigned b); /* a比b靠前或相等,返回真 */

实际上这些函数都是宏,这里写成函数形式看起来比较直观。
 因此示例4_1的"while"语句可改成

while(time_before(jiffies, stamp))

 建议使用内核提供的函数或宏来操作jiffies,而不建议直接操作jiffies。

 2
内核表述方法(jiffies)与时间表述方法的转换
  时间表述方法可用的数据结构有"struct timeval"和"struct timespec"。其中"struct timeval"为老式的数但较为流行,它使用秒和毫秒值;而"struct timespec"为新式的,它使用的是秒与纳秒值。
 内核提供四个辅助函数用于jiffies的此类转换

#include <linux/time.h>

unsigned long timespec_to_jiffies(struct timespec *value);

void jiffies_to_timespec(unsigned jiffies, struct timespec *value);

unsigned long timeval_to_jiffies(struct timeval *val);

void jiffies_to_timeval(unsigned long jiffies, struct timeval *value);

 这些函数看起来是那么明了,以至于无需示例加以说明。

  3
获取jiffies_64值
  内核提供辅助函数

#include <linux/jiffies.h>

u64 get_jiffies_64(void);

  4
获取CPU时钟周期数值
  使用jiffies值测量时间差间隔在大部分情况下已经足够,但如果测量更短的时间差,则可以使用处理器特定寄存器。内核为访问该寄存器提供以下接口:

#include <asm/msr.h>

rdtsc(low32, high32);

rdtscl(low32);

rdtscsll(var64);

#include <linux/timex.h>

cycles_t get_cycles(void);  /* cycles_t是能装入读取值的合适的无符号类型 */

 rdtsc宏是与体系结构相关,而get_cycles则与体系结构无关。

  5
获取当前时间
   内核辅助函数

#include <linux/time.h>

unsigned long mktime(unsigned int year, unsigned int mon, 

                     unsigned int day,  unsigned int hour,

                      unsigned int min, unsigned int sec);  /* 将墙钟时间转换为jiffies值 */

void do_gettimeofday(struct timeval *tv);

struct timespec current_kernel_time(void)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: