linux核心時間操作
阿新 • • 發佈:2019-01-06
linux核心是通過定時器中斷來跟蹤時間流;使用"HZ"巨集表示1秒的時鐘中斷次數,並使用"jiffies"及"jiffies_64"變數來記錄時鐘中斷次數,在系統引導時計數器初始化為 0
1 核心時間比較api, 比較jiffies計數器
時間表述方法可用的資料結構有"struct timeval"和"struct timespec"。其中"struct timeval"為老式的數但較為流行,它使用秒和毫秒值;而"struct timespec"為新式的,它使用的是秒與納秒值。
使用jiffies值測量時間差間隔在大部分情況下已經足夠,但如果測量更短的時間差,則可以使用處理器特定暫存器, rdtsc巨集是與體系結構相關,而get_cycles則與體系結構無關。
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"為新式的,它使用的是秒與納秒值。
3 獲取jiffies_64值#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);
#include <linux/jiffies.h>
u64 get_jiffies_64(void);
4 獲取CPU時鐘週期數值使用jiffies值測量時間差間隔在大部分情況下已經足夠,但如果測量更短的時間差,則可以使用處理器特定暫存器, rdtsc巨集是與體系結構相關,而get_cycles則與體系結構無關。
5 獲取當前時間#include <asm/msr.h> rdtsc(low32, high32); rdtscl(low32); rdtscsll(var64); #include <linux/timex.h> cycles_t get_cycles(void);
#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)