1. 程式人生 > >linux核心時間操作

linux核心時間操作

linux核心是通過定時器中斷來跟蹤時間流;使用"HZ"巨集表示1秒的時鐘中斷次數,並使用"jiffies"及"jiffies_64"變數來記錄時鐘中斷次數,在系統引導時計數器初始化為 0
1 核心時間比較api, 比較jiffies計數器
#include <linux/jiffies.h>
int time_after(unsigned long a, unsigned b);
int time_before(unsigned long a, unsigned b);
int time_after_eq(unsigned long a, unsigned b);
int time_before_eq(unsigned long a, unsigned b);
2 核心表述方法(jiffies)與時間表述方法的轉換
時間表述方法可用的資料結構有"struct timeval"和"struct timespec"。其中"struct timeval"為老式的數但較為流行,它使用秒和毫秒值;而"struct timespec"為新式的,它使用的是秒與納秒值。
#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值測量時間差間隔在大部分情況下已經足夠,但如果測量更短的時間差,則可以使用處理器特定暫存器, rdtsc巨集是與體系結構相關,而get_cycles則與體系結構無關。
#include <asm/msr.h>
rdtsc(low32, high32);
rdtscl(low32);
rdtscsll(var64);
#include <linux/timex.h>
cycles_t get_cycles(void);
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);
void do_gettimeofday(struct timeval *tv);
struct timespec current_kernel_time(void)