獲知當前時間

2021-06-22 01:41:06 字數 3358 閱讀 3792



核心**能一直獲取乙個當前時間的表示, 通過檢視 jifies 的值. 常常地, 這個值只代表從最後一次啟動以來的時間, 這個事實對驅動來說無關, 因為它的生命週期受限於系統的 uptime. 如所示, 驅動可以使用 jiffies 的當前值來計算事件之間的時間間隔(例如, 在輸入驅動中從單擊中區分雙擊或者計算超時). 簡單地講, 檢視 jiffies 幾乎一直是足夠的, 當你需要測量時間間隔. 如果你需要對短時間流失的非常精確的測量, 處理器特定的暫存器來幫忙了( 儘管它們帶來嚴重的移植性問題 ).

它是非常不可能乙個驅動會需要知道牆上時鐘時間, 以月, 天, 和小時來表達的; 這個資訊常常只對使用者程式需要, 例如 cron 和 syslogd. 處理真實世界的時間常常最好留給使用者空間, 那裡的 c 庫提供了更好的支援; 另外, 這樣的**常常太策略相關以至於不屬於核心. 有乙個核心函式轉變乙個牆上時鐘時間到乙個 jiffies 值, 但是:

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

unsigned int day, unsigned int hour,

unsigned int min, unsigned int sec);

重複:直接在驅動中處理牆上時鐘時間往往是乙個在實現策略的訊號, 並且應當因此而被置疑.

雖然你不會一定處理人可讀的時間表示, 有時你需要甚至在核心空間中處理絕對時間. 為此, 輸出了 do_gettimeofday 函式. 當被呼叫時, 它填充乙個 struct timeval 指標 -- 和在 gettimeofday 系統呼叫中使用的相同 -- 使用類似的秒和毫秒值. do_gettimeofday 的原型是:

#include void do_gettimeofday(struct timeval *tv);
這段源**宣告 do_gettimeofday 有" 接近毫秒的精度", 因為它詢問時間硬體當前 jiffy 多大比例已經流失. 這個精度每個體系都不同, 但是, 因為它依賴實際使用中的硬體機制. 例如, 一些 m68knommu 處理器, sun3 系統, 和其他 m68k 系統不能提供大於 jiffy 的精度. pentium 系統, 另一方面, 提供了非常快速和精確的小於嘀噠的測量, 通過讀取本章前面描述的時戳計數器.

當前時間也可用( 儘管使用 jiffy 的粒度 )來自 xtime 變數, 乙個 struct timespec 值. 不鼓勵這個變數的直接使用, 因為難以原子地同時訪問這 2 個字段. 因此, 核心提供了實用函式 current_kernel_time:

#include struct timespec current_kernel_time(void);
用來以各種方式獲取當前時間的**, 可以從由 o' reilly 提供的 ftp **上的原始碼檔案的 jit ("just in time") 模組獲得. jit 建立了乙個檔案稱為 /proc/currentime, 當讀取時, 它以 ascii 碼返回下列項:

我們選擇使用乙個動態的 /proc 檔案來保持樣板**為最小 -- 它不值得建立一整個裝置只是返回一點兒文字資訊.

這個檔案連續返回文字行只要這個模組載入著; 每次 read 系統呼叫收集和返回一套資料, 為更好閱讀而組織為 2 行. 無論何時你在少於乙個時鐘嘀噠內讀多個資料集, 你將看到 do_gettimeofday 之間的差別, 它詢問硬體, 並且其他值僅在時鐘嘀噠時被更新.

phon% head -8 /proc/currentime

0x00bdbc1f 0x0000000100bdbc1f 1062370899.630126

1062370899.629161488

0x00bdbc1f 0x0000000100bdbc1f 1062370899.630150

1062370899.629161488

0x00bdbc20 0x0000000100bdbc20 1062370899.630208

1062370899.630161336

0x00bdbc20 0x0000000100bdbc20 1062370899.630233

1062370899.630161336

在上面的螢幕快照中, 由 2 件有趣的事情要注意. 首先, 這個 current_kernel_time 值, 儘管以納秒來表示, 只有時鐘嘀噠的粒度; do_gettimeofday 持續報告乙個稍晚的時間但是不晚於下乙個時鐘嘀噠. 第二, 這個 64-位的 jiffies 計數器有 高 32-位字集合的最低有效位. 這是由於 initial_jiffies 的預設值, 在啟動時間用來初始化計數器, 在啟動時間後幾分鐘內強加乙個低字溢位來幫助探測與這個剛好溢位相關的問題. 這個在計數器中的初始化偏好沒有效果, 因為 jiffies 與牆上時鐘時間無關. 在 /proc/uptime 中, 這裡核心從計數器中抽取 uptime, 初始化偏好在轉換前被去除.

1、使用rtc裝置,這個時鐘可以用於各種模式

2、借鑑系統呼叫adjtimex

這裡使用第二種方式

系統呼叫adjtimex

一直跟下去,會發現最後呼叫

void do_gettimeofday(struct timeval *tv)

那麼直接使用do_gettimeofday,能夠得到struct timeval

struct timeval ;

那麼就需要將這個tv_sec,即2023年開始至今的秒數轉換為年月日時分秒

其實核心已經有這樣的函式

/** convert seconds since 01-01-1970 00:00:00 to gregorian date.

*/void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)

唯一的不足是轉換得到的是utc時間,同北京時間差8小時。要想達到使用者態localtime()的效果,必須獲得/etc/localtime 中的時區資訊。

示例**:

#include

#include

#include

/*新增到合適位置*/

struct timex  txc;

struct rtc_time tm;

do_gettimeofday(&(txc.time));

rtc_time_to_tm(txc.time.tv_sec,&tm);

printk(「utc time :%d-%d-%d %d:%d:%d /n」,tm.tm_year+1900,tm.tm_mon, tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);

如何獲知當前系統是否支援CPUID指令

rel file list href file c docume 7e1 micros 7e1 locals 7e1 temp msoclip1 03 clip filelist.xml cpuid 指令是乙個非常有用的指令,通過它能夠獲知相關 cpu的具體規格,比如是否支援 mmx sse sse...

iOS 獲取當前時間和當前時間戳

獲取當前的時間 nsstring getcurrenttimes nsdateformatter formatter nsdateformatter alloc init 設定你想要的格式,hh與hh的區別 分別表示12小時制,24小時制 formatter setdateformat yyyy m...

iOS 獲取當前時間和當前時間戳

獲取當前的時間 nsstring getcurrenttimes nsdateformatter formatter nsdateformatter alloc init 設定你想要的格式,hh與hh的區別 分別表示12小時制,24小時制 formatter setdateformat yyyy m...