亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發(fā)設計 > 正文

Linux時間系統(tǒng):時鐘源clocsource

2019-11-09 18:32:19
字體:
來源:轉載
供稿:網友

時鐘源(clock source)

clock source顧名思義就是提供給系統(tǒng)提供時鐘的時鐘源。 clock source負責讀取芯片中按時間增加的值(所謂cycle),并提供給timekeeper,當然也要提供按cycle的值計算時間間隔的內容。 clocksource以及timer相關的內容都在kernel/kernel/time目錄下面。

obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.oobj-y += timeconv.o posix-clock.o alarmtimer.oobj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.oobj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.oobj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += tick-broadcast.o tick-broadcast-hrtimer.oobj-$(CONFIG_GENERIC_SCHED_CLOCK) += sched_clock.oobj-$(CONFIG_TICK_ONESHOT) += tick-oneshot.oobj-$(CONFIG_TICK_ONESHOT) += tick-sched.oobj-$(CONFIG_TIMER_STATS) += timer_stats.o

下面來看一下時鐘源是怎么注冊上去,怎么提供計算時間的內容給timekeeper。

1. 時鐘源注冊過程:

linux可以有很多時鐘源,其中一種時鐘源是jiffies。還有就是平臺相關的時鐘源,精度較高。 當然在注冊了很多種時鐘源之后,linux內核也用某種方式去選擇當前的時鐘源來保證最好的精度。 這里寫圖片描述

1)jiffies時鐘源注冊過程:

jiffies我們知道就是一秒鐘會增加相當于HZ大小的一個變量。 首先需要根據時鐘源,填充clocksource相關數據結構中的成員。

static struct clocksource clocksource_jiffies = { .name= "jiffies", .rating= 1, .read= jiffies_read, /*讀取當前jiffies*/ .mask= 0xffffffff, /*32bits*/ .mult= NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */ .shift= JIFFIES_SHIFT,};

從這個例子,可以看出來 (mult>>shift)*cloclsource->read() 這個讀的就是jiffies數。 當然如果要注冊一些更高精度的時鐘源,mult和shift要進行小心的計算,以保證其值不會溢出。這個后面再看。

2. 平臺相關的時鐘源

int clocksource_register(struct clocksource *cs){ /* calculate max adjustment for given mult/shift */ cs->maxadj = clocksource_max_adjustment(cs); /*計算相當于mult值得11%賦給maxadj*/ /* calculate max idle time permitted for this clocksource */ cs->max_idle_ns = clocksource_max_deferment(cs); /*max_idle_ns計算方法看下面*/ mutex_lock(&clocksource_mutex); clocksource_enqueue(cs); //把注冊的clock source 添加到clocksource_list鏈表中,按rate的降序排序 clocksource_enqueue_watchdog(cs); clocksource_select(); //按rate選擇最佳的clocksource,當然這里rate哪個大就選哪 個,, mutex_unlock(&clocksource_mutex); return 0;}static u64 clocksource_max_deferment(struct clocksource *cs){ u64 max_nsecs, max_cycles; max_cycles = 1ULL << (63 - (ilog2(cs->mult + cs->maxadj) + 1)); /* 上面的計算出來就是2的63次方 = max_cycles*(cs->mult + cs->maxadj) ,也就是說 這個是在計算2的63次方納秒對應的cycles,也就是計算最大的cycles,因為時間對應的納秒不能超 過2的64次方,因為會溢出 */ max_cycles = min_t(u64, max_cycles, (u64) cs->mask); /*max_cycles和cs->mask中的最小值賦值給max_cycles*/ max_nsecs = clocksource_cyc2ns(max_cycles, cs->mult - cs->maxadj, cs->shift);return max_nsecs - (max_nsecs >> 3);}static struct clocksource clocksource_counter = {.name = "arch_sys_counter",.rating = 400,.read = arch_counter_read,.mask = CLOCKSOURCE_MASK(56),.flags = CLOCK_SOURCE_IS_CONTINUOUS,};static void __init arch_timer_counter_init(void){ clocksource_register_hz(&clocksource_counter, arch_timer_rate); setup_sched_clock(arch_timer_update_sched_clock, 32, arch_timer_rate);/* Use the architected timer for the delay loop. */ arch_delay_timer.read_current_timer = &arch_timer_read_current_timer; arch_delay_timer.freq = arch_timer_rate; register_current_timer_delay(&arch_delay_timer);}static inline int clocksource_register_hz(struct clocksource *cs, u32 hz){ return __clocksource_register_scale(cs, 1, hz);}int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq){ /* Initialize mult/shift and max_idle_ns */ __clocksource_updatefreq_scale(cs, scale, freq); //根據clocksource的頻 率計算mult和shit的值 /* Add clocksource to the clcoksource list */ mutex_lock(&clocksource_mutex); clocksource_enqueue(cs); clocksource_enqueue_watchdog(cs); clocksource_select(); mutex_unlock(&clocksource_mutex); return 0;}void __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq){ u64 sec; sec = (cs->mask - (cs->mask >> 3)); do_div(sec, freq); do_div(sec, scale);if (!sec) sec = 1;else if (sec > 600 && cs->mask > UINT_MAX) sec = 600; clocks_calc_mult_shift(&cs->mult, &cs->shift, freq, NSEC_PER_SEC / scale, sec * scale); cs->maxadj = clocksource_max_adjustment(cs);while ((cs->mult + cs->maxadj < cs->mult)|| (cs->mult - cs->maxadj > cs->mult)) { cs->mult >>= 1; cs->shift--; cs->maxadj = clocksource_max_adjustment(cs);} cs->max_idle_ns = clocksource_max_deferment(cs);}voidclocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec){ u64 tmp; u32 sft, sftacc= 32; tmp = ((u64)maxsec * from) >> 32; while (tmp) { tmp >>=1; sftacc--;}for (sft = 32; sft > 0; sft--) { tmp = (u64) to << sft; tmp += from / 2; do_div(tmp, from);if ((tmp >> sftacc) == 0)break;}*mult = tmp;*shift = sft;}

kernel用乘法+移位來替換除法:根據cycles來計算過去了多少ns。 單純從精度上講,肯定是mult越大越好,但是計算過程可能溢出,所以mult也不能無限制的大,這個計算中有個magic number 600 : 這個600的意思是600秒,表示的Timer兩次計算當前計數值的差不會超過10分鐘。主要考慮的是系統(tǒng)進入IDLE狀態(tài)之后,時間信息不會被更新,10分鐘內只要退出IDLE,clocksource還是可以成功的轉換時間。當然了,最后的這個時間不一定就是10分鐘,它由clocksource_max_deferment計算并將結果存儲在max_idle_ns中 筒子比較關心的問題是如何計算 ,精度如何,其實我不太喜歡這種計算,Kernel總是因為某些原因把代碼寫的很蛋疼.反正揣摩代碼意圖要花不少時間,收益嘛其實也不太大.如何實現我也不解釋了,我以TSC為例子我評估下這種mult+shift的精度.

#include<stdio.h>#include<stdlib.h>typedef unsigned int u32;typedef unsigned long long u64;#define NSEC_PER_SEC 1000000000Lvoidclocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec){ u64 tmp; u32 sft, sftacc= 32; /* * * Calculate the shift factor which is limiting the conversion * * range: * */ tmp = ((u64)maxsec * from) >> 32; while (tmp) { tmp >>=1; sftacc--; } /* * * Find the conversion shift/mult pair which has the best * * accuracy and fits the maxsec conversion range: * */ for (sft = 32; sft > 0; sft--) { tmp = (u64) to << sft; tmp += from / 2; //do_div(tmp, from); tmp = tmp/from; if ((tmp >> sftacc) == 0) break; } *mult = tmp; *shift = sft;}int main(){ u32 tsc_mult; u32 tsc_shift ; u32 tsc_frequency = 2127727000/1000; //TSC frequency(KHz) clocks_calc_mult_shift(&tsc_mult,&tsc_shift,tsc_frequency,NSEC_PER_SEC/1000, 600*1000); //NSEC_PER_SEC/1000是因為TSC的注冊是clocksource_register_khz f600是根據TSC clocksource的MASK算出來的的入參,感興趣可以自己推算看下結果:

mult = 7885042 shift = 24root@manu:~/code/c/self/time# pythonPython 2.7.3 (default, Apr 10 2013, 05:46:21) [GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> (2127727000*7885042)>>241000000045L>>> 我們知道TSC的frequency是2127727000Hz,如果cycle走過2127727000,就意味過去了1秒,或者說10^9(us).按照我們的算法得出的時間是1000000045ns. 這個誤差是多大呢,每走10^9秒,誤差是45納秒,換句話說,運行257天,產生1秒的計算誤差.考慮到NTP的存在,這個運算精度還可以了.

3. clocksource watchdog

clocksource_enqueue_watchdog會將clocksource掛到watchdog鏈表.watchdog顧名思義,監(jiān)控所有clocksource:

#define WATCHDOG_INTERVAL (HZ >> 1)#define WATCHDOG_THRESHOLD (NSEC_PER_SEC >> 4)

如果0.5秒內,誤差大于0.0625s,表示這個clocksource精度極差,將rating設成0.

實際的應用場景

以高通msm8916為例,除了jiffies,其他clocksource是沒有直接使用kernel/kernel/time/clocksource.c文件里邊的接口的。 其他arm_arch_timer.c[/kernel/driver/clocksource/arm_arch_timer.c] 和 arch_timer.c [kernel/arch/arm/kernel/arch_timer.c] 兩個都是使用 sched_clock.c[/kernel/kernel/time/sched_clock.c]文件里邊的 sched_clock_register()來進行注冊,并使用sched_clock_32()函數讀取當前時間。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
毛片大全在线观看| 国产欧美第一页| 成人免费视频国产在线观看| 日韩不卡一二三区| 99久9在线视频| 最近2018中文字幕免费在线视频| 自拍视频一区| 久久人人97超碰精品888| 亚洲无人区码一码二码三码| 国产老肥熟xxxx在线观看| 国产激情在线视频| 在线观看中文字幕码| 免费精品视频最新在线| 国产精品狼人色视频一区| 偷拍视频一区二区三区| 日韩经典av| 国产精品xnxxcom| 日韩成人影音| 欧洲成人一区| 印度美女freesex性hd| 日日夜夜国产| 野花社区视频在线观看| 国产老女人精品毛片久久| 97超碰国产精品| 欧美激情综合色| 无码播放一区二区三区| 亚洲电影二区| 在线毛片观看| 粉嫩久久99精品久久久久久夜| 午夜婷婷在线观看| 欧美性videosxxxxx| 婷婷丁香久久五月婷婷| av资源网在线观看| 国产精品嫩草影院av蜜臀| 五月天综合在线| 国产96在线亚洲| 一区二区视频在线观看免费的| 国产精品白丝jk喷水视频一区| 久久久久久av无码免费网站下载| 精品视频在线视频| 亚洲aⅴ在线观看| 亚洲无线一线二线三线区别av| 久久视频一区二区三区| 亚洲男人资源| 国产精品午夜av在线| 无码一区二区三区视频| 亚洲欧洲美洲一区二区三区| 欧美高清xxxx性| 亚洲精品自在在线观看| 成年网站在线观看视频| 精品99久久久久久| 先锋影音av在线| 国产精品美女免费| 九九久久久久午夜精选| 欧美日韩黄网站| 日韩欧美国产成人一区二区| 国产中文字幕视频| 草莓视频18免费观看| 亚洲一区在线视频| 日韩精品欧美在线| 精品91福利视频| 一区二区三区在线观看免费| 亚洲免费婷婷| 日韩一级片免费| 久热国产精品视频| 北条麻妃一区二区三区在线观看| 久久中文字幕导航| 国产浪潮av性色av小说| 国产精品成人在线视频| 菠萝蜜视频国产在线播放| 久久69精品久久久久久久电影好| 五月天婷亚洲天综合网鲁鲁鲁| 男女猛烈激情xx00免费视频| 国产免费黄色| 亚洲性视频h| 在线观看中文字幕2021| 欧美成人激情图片网| 高清在线观看日韩| 欧美视频日韩视频| 黄色电影免费在线观看| 91精品国产调教在线观看| 国产日韩欧美a| 综合色婷婷一区二区亚洲欧美国产| 日韩a级大片| 久久99精品国产自在现线小黄鸭| 国产精品久久久久久久久免费高清| 国产午夜精品一区二区三区四区| 久久www免费人成精品| 亚洲资源视频| 欧美日韩天堂| 美国一级黄色录像| 国产欧美精品一区二区三区| 国产精品久久久久7777按摩| 国产中文字幕一区二区三区| 成年在线观看免费人视频| 91久久国产综合久久蜜月精品| 亚洲有吗中文字幕| 国产偷久久久精品专区| 国产aⅴ精品一区二区四区| 国产精品久久久久久久久久久久午夜片| 国产成人精品免费看视频| www..com.cn蕾丝视频在线观看免费版| 亚洲欧洲成人精品av97| 亚洲美腿欧美激情另类| 欧美一区二区三区四区夜夜大片| 亚洲日韩欧美一区二区在线| 欧美xxxx黑人又粗又长| 成人在线免费观看91| 久久久最新网址| 中国 免费 av| 一区二区国产欧美| av影音资源网| 成人免费看片'免费看| 久久国产精品影视| 91国拍精品国产粉嫩亚洲一区| 高清视频国产| 久久午夜精品| 国产丶欧美丶日本不卡视频| 日韩美女视频一区二区在线观看| 在线看污网站| 亚洲自拍中文字幕| 欧美1级日本1级| 国产亚洲福利社区| 精品国产欧美日韩不卡在线观看| 国产精品2区| 亚洲 国产 日韩 欧美| 欧美激情一级精品国产| 91亚洲精品久久久蜜桃借种| 亚洲综合第一| 国产乱淫av一区二区三区| 欧美性生活大片免费观看网址| 国产精品一区久久| 国产日韩欧美在线| 日本裸体美女视频| 国产综合在线观看| 国产又粗又猛大又黄又爽| 欧美日韩影视| 色综合欧美在线| 亚洲国产婷婷综合在线精品| 国产美女高潮视频| 国产aⅴ精品一区二区三区色成熟| 日韩欧美激情一区二区| 国产伦视频一区二区三区| 欧美一二三四五区| 国产精品久久久久白浆| 亚洲人精品午夜射精日韩| 神马久久影视大全| 亚洲激情在线观看视频免费| 伊人久久久久久久久久| 日韩av色在线| 成人在线免费观看网站| 国产人成高清视频观看| 性做久久久久久| 亚洲综合在线播放| 欧美精品性生活| 国内精品卡一卡二卡三| 91传媒理伦片在线观看| 欧美午夜不卡在线观看免费| 欧美激情精品久久久久久免费| 欧美日韩一区在线视频| 粉嫩91精品久久久久久久99蜜桃| 国产精品 欧美激情| 亚洲女人在线观看| 亚州一区二区| 97在线视频国产| 视色视频在线观看| 国产精品区免费视频| 在线视频中文字幕| 国产精品一区二区三区av麻| 黄色手机在线视频| 999久久久免费精品国产牛牛| 国产精品18久久久久| 成人av资源站| 你懂的在线观看网站| 久久久成人精品视频| 最新国产精品久久久| 精品亚洲欧美一区| 亚洲视频电影图片偷拍一区| 超碰精品在线观看| 亚洲欧美综合网| 欧美激情在线看| 精品免费囯产一区二区三区| 午夜影院免费视频| 国产视频911| 国产91精品免费| 国产九九在线| 欧美久久免费观看| 国语对白在线视频| 国产一区二区三区四区五区六区| 欧美啪啪小视频| 一区二区三区国产福利| 国产精品午夜视频| 成人在线观看av| av免费在线免费观看| av免费网站在线| 日韩欧美一区二区三区在线观看| h版电影在线播放视频网站| 亚洲精品成人精品456| 新版中文在线官网| 精品国产乱码久久久久久久| 日韩精品卡通动漫网站| 国产极品一区二区三区| 国内自拍中文字幕| 欧美裸体网站| 欧美成人国产va精品日本一级| 精品剧情在线观看| 中文字幕一区二区三区中文字幕| va天堂va亚洲va影视| 国产日韩一区二区三区| 一本大道av伊人久久综合| 狠狠躁狠狠躁视频专区| 高清一级毛片视频| 国产高清视频色在线www| 欧美精品第一区| 亚洲免费影视第一页| 亚洲精品电影网| 欧美精品一区二区三区国产精品| 唐朝av高清盛宴| 美女黄毛**国产精品啪啪| 图片区日韩欧美亚洲| 成人精品一区二区不卡视频| 国产美女永久免费无遮挡| 国产欧美一区二区在线| 色播亚洲视频在线观看| 无码精品人妻一区二区| 欧洲国产伦久久久久久久| 亚洲综合国产激情另类一区| 欧美日韩国产首页| 亚洲成色777777女色窝| 日本午夜精品久久久久| 99视频在线播放| 欧美四级剧情无删版影片| 亚洲第一页综合| 久久精品久久国产| 99国产精品白浆在线观看免费| 亚洲欧美在线第一页| 男女男精品视频网站| 丁香六月婷婷综合| 久久久99免费| 999在线观看免费大全电视剧| 亚洲激情网址| 日本一二三区不卡| 人人网欧美视频| 无码精品视频一区二区三区| 中文字幕 日韩有码| www.蜜桃av.com| 亚洲熟女乱综合一区二区| 日韩欧美一级大片| 久久五月天色综合| 97超碰在线公开在线看免费| 免费黄色在线播放| 成人激情视频网| 精品女厕厕露p撒尿| 极品尤物久久久av免费看| 成人久久18免费网站漫画| 激情五月婷婷综合网| 亚洲欧美日韩成人| 国产精品视频公开费视频| 91精品国产丝袜白色高跟鞋| 欧美性猛交7777777| 色戒汤唯在线观看| 男的插女的下面视频| 熟女少妇内射日韩亚洲| 97免费中文视频在线观看| 丝袜美腿玉足3d专区一区| 午夜视频在线观| 国产精品久久久久久亚洲伦| 亚洲天堂美女视频| 欧美日韩日日摸| 国产精品第72页| 日韩精品一区二区三区视频播放| 成人久久久精品乱码一区二区三区| 国产中文欧美日韩在线| 偷拍自拍亚洲色图| av黄色在线观看| 天堂在线观看视频观看www| 国产丝袜一区二区三区免费视频| 中文字幕中文字幕在线中文字幕三区| 中文字幕区一区二区三| 国产xxx精品视频大全| 比比资源先锋| 日本不卡免费新一二三区| 日本深夜福利视频| 久久久亚洲天堂| 在线能看的av网站| 99国产精品久久久久久久成人| 成人午夜精品无码区| 69精品国产久热在线观看| av网站网址在线观看| 国产卡一卡二卡三| 另类一区二区| 国产精品自拍网站| 日韩欧美一二三| 欧美电影免费观看| a级影片在线观看| 国产精品第十页| 亚洲啊啊啊啊啊| 成人动漫中文字幕| 18激情网站| 欧美私模裸体表演在线观看| 强制捆绑调教一区二区| 亚洲品质自拍| 成人精品视频99在线观看免费| 欧美大尺度做爰床戏| 九九视频免费观看视频精品| 国产毛片久久久久久国产毛片| 国产91精品久久久久久久| 丝袜av一区| jizz内谢中国亚洲jizz| 成人免费看黄网址| www.四虎网站| 日韩中文字幕免费观看| 97视频精彩视频在线观看| 91精品综合久久久久久久久久久| 污网站在线观看视频| 在线观看国产精品日韩av| 日韩国产精品一区二区| 91欧美视频在线| 国产精品久免费的黄网站| 窝窝九色成人影院| 亚洲视频在线观看一区| 成视频免费在线看| 午夜精品久久久久久久99樱桃| 黄色大片在线免费观看| 日韩欧美影院| 成人一级片网址| 美女视频黄免费的久久| 北岛玲日韩精品一区二区三区|