内核中时间获取和比较 -- 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)
并使用"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)
相关文章推荐
- Linux内核和传统Unix内核的比较
- 时间加减 时间比较 获取前一天时间
- Windows上几个获取时间戳函数的效率比较
- 如何在内核态下获取时间
- 获取所有月份以及比较两个时间的大小
- Linux内核和传统Unix内核的比较
- 向linux内核添加系统调用新老内核比较
- Android内核与主线linux内核的比较(Android对Linux内核的改动你知道多少?)
- Linux内核2.6和2.4中内核堆栈的比较
- Android内核与主线linux内核的比较(Android对Linux内核的改动你知道多少?) .
- vc6.0读取系统时间并与自己通过其他方式获取的时间比较
- Linux内核中的jiffies 以及时间的获取time
- Linux内核和传统Unix内核的比较
- Android内核与主线linux内核的比较(Android对Linux内核的改动你知道多少?)
- Linux内核中获取当前时间
- linux内核不用系统调用获取时间的函数kernel_mktime
- linux内核不用系统调用获取时间的函数kernel_mktime
- Linux内核和传统Unix内核的比较
- linux 内核 时间 获取
- java系统时间的获取与比较