日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jiffies

發布時間:2024/4/24 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jiffies 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?全局變量jiffies用來記錄自系統啟動以來產生的節拍的總數。啟動時,內核將該變量初始化為0,此后,每次時鐘中斷處理程序都會增加該變量的值。一秒內時鐘中斷的次數等于Hz,所以jiffies一秒內增加的值也就是Hz。

?? 系統運行時間以秒為單位,等于jiffies/Hz。

?

注意,jiffies類型為無符號長整型(unsigned long),其他任何類型存放它都不正確。

將以秒為單位的時間轉化為jiffies:

??????????seconds * Hz

將jiffies轉化為以秒為單位的時間:

?????????jiffies / Hz

相比之下,內核中將秒轉換為jiffies用的多些。

  • ?jiffies的內部表示

?? jiffies定義于文件<linux/Jiffies.h>中:

?

  • /*
  • ?*?The?64-bit?value?is?not?atomic?-?you?MUST?NOT?read?it
  • ?*?without?sampling?the?sequence?number?in?xtime_lock.
  • ?*?get_jiffies_64()?will?do?this?for?you?as?appropriate.
  • ?*/
  • extern?u64?__jiffy_data?jiffies_64;
  • extern?unsigned?long?volatile?__jiffy_data?jiffies;
  • ld(1)腳本用于連接主內核映像(在x86上位于arch/i386/kernel/vmlinux.lds.S中),然后用jiffies_64變量的初值覆蓋jiffies變量。因此jiffies取整個jiffies_64變量的低32位。

    ? 訪問jiffies的代碼只會讀取jiffies_64的低32位,通過get_jiffies_64()函數就可以讀取整個64位的值。在64位體系結構上,jiffies_64和jiffies指的是同一個變量。

  • #if?(BITS_PER_LONG?<?64)
  • u64?get_jiffies_64(void);
  • #else
  • static?inline?u64?get_jiffies_64(void)
  • {
  • ????return?(u64)jiffies;
  • }
  • #endif
  • ?

  • 在<Time.c(kernel)>中
  • #if?(BITS_PER_LONG?<?64)
  • u64?get_jiffies_64(void)
  • {
  • ????unsigned?long?seq;
  • ????u64?ret;
  • ????do?{
  • ????????seq?=?read_seqbegin(&xtime_lock);
  • ????????ret?=?jiffies_64;
  • ????}?while?(read_seqretry(&xtime_lock,?seq));
  • ????return?ret;
  • }
  • ?

    • jiffies的回繞wrap around

    ? 當jiffies的值超過它的最大存放范圍后就會發生溢出。對于32位無符號長整型,最大取值為(2^32)-1,即429496795。如果節拍計數達到了最大值后還要繼續增加,它的值就會回繞到0。

    ? 內核提供了四個宏來幫助比較節拍計數,它們能正確的處理節拍計數回繞的問題:

    ?

  • /*
  • ?*??These?inlines?deal?with?timer?wrapping?correctly.?You?are?
  • ?*??strongly?encouraged?to?use?them
  • ?*??1.?Because?people?otherwise?forget
  • ?*??2.?Because?if?the?timer?wrap?changes?in?future?you?won't?have?to
  • ?*?????alter?your?driver?code.
  • ?*
  • ?*?time_after(a,b)?returns?true?if?the?time?a?is?after?time?b.
  • ?*
  • ?*?Do?this?with?"<0"?and?">=0"?to?only?test?the?sign?of?the?result.?A
  • ?*?good?compiler?would?generate?better?code?(and?a?really?good?compiler
  • ?*?wouldn't?care).?Gcc?is?currently?neither.
  • ?*/
  • #define?time_after(a,b)?????/
  • ????(typecheck(unsigned?long,?a)?&&?/
  • ?????typecheck(unsigned?long,?b)?&&?/
  • ?????((long)(b)?-?(long)(a)?<?0))
  • #define?time_before(a,b)????time_after(b,a)
  • #define?time_after_eq(a,b)??/
  • ????(typecheck(unsigned?long,?a)?&&?/
  • ?????typecheck(unsigned?long,?b)?&&?/
  • ?????((long)(a)?-?(long)(b)?>=?0))
  • #define?time_before_eq(a,b)?time_after_eq(b,a)
  • /*?Same?as?above,?but?does?so?with?platform?independent?64bit?types.
  • ?*?These?must?be?used?when?utilizing?jiffies_64?(i.e.?return?value?of
  • ?*?get_jiffies_64()?*/
  • #define?time_after64(a,b)???/
  • ????(typecheck(__u64,?a)?&&?/
  • ?????typecheck(__u64,?b)?&&?/
  • ?????((__s64)(b)?-?(__s64)(a)?<?0))
  • #define?time_before64(a,b)??time_after64(b,a)
  • #define?time_after_eq64(a,b)????/
  • ????(typecheck(__u64,?a)?&&?/
  • ?????typecheck(__u64,?b)?&&?/
  • ?????((__s64)(a)?-?(__s64)(b)?>=?0))
  • #define?time_before_eq64(a,b)???time_after_eq64(b,a)
    • 用戶空間和HZ

    ? 問題提出:

    ? 在2.6以前的內核中,如果改變內核中的HZ值會給用戶空間中某些程序造成異常結果。因為內核是以節拍數/秒的形式給用戶空間導出這個值的,應用程序便依賴這個特定的HZ值。如果在內核中改變了HZ的定義值,就打破了用戶空間的常量關系---用戶空間并不知道新的HZ值。

    ? 解決方法:

    ? 內核更改所有導出的jiffies值。內核定義了USER_HZ來代表用戶空間看到的HZ值。在x86體系結構上,由于HZ值原來一直是100,所以USER_HZ值就定義為100。內核可以使用宏jiffies_to_clock_t()將一個有HZ表示的節拍計數轉換為一個由USER_HZ表示的節拍計數。

    ?

  • 在<Time.c(kernel)>中
  • /*
  • ?*?Convert?jiffies/jiffies_64?to?clock_t?and?back.
  • ?*/
  • clock_t?jiffies_to_clock_t(long?x)
  • {
  • #if?(TICK_NSEC?%?(NSEC_PER_SEC?/?USER_HZ))?==?0
  • ????return?x?/?(HZ?/?USER_HZ);
  • #else
  • ????u64?tmp?=?(u64)x?*?TICK_NSEC;
  • ????do_div(tmp,?(NSEC_PER_SEC?/?USER_HZ));
  • ????return?(long)tmp;
  • #endif
  • }
  • unsigned?long?clock_t_to_jiffies(unsigned?long?x)
  • {
  • #if?(HZ?%?USER_HZ)==0
  • ????if?(x?>=?~0UL?/?(HZ?/?USER_HZ))
  • ????????return?~0UL;
  • ????return?x?*?(HZ?/?USER_HZ);
  • #else
  • ????u64?jif;
  • ????/*?Don't?worry?about?loss?of?precision?here?..?*/
  • ????if?(x?>=?~0UL?/?HZ?*?USER_HZ)
  • ????????return?~0UL;
  • ????/*?..?but?do?try?to?contain?it?here?*/
  • ????jif?=?x?*?(u64)?HZ;
  • ????do_div(jif,?USER_HZ);
  • ????return?jif;
  • #endif
  • }
  • u64?jiffies_64_to_clock_t(u64?x)
  • {
  • #if?(TICK_NSEC?%?(NSEC_PER_SEC?/?USER_HZ))?==?0
  • ????do_div(x,?HZ?/?USER_HZ);
  • #else
  • ????/*
  • ?????*?There?are?better?ways?that?don't?overflow?early,
  • ?????*?but?even?this?doesn't?overflow?in?hundreds?of?years
  • ?????*?in?64?bits,?so..
  • ?????*/
  • ????x?*=?TICK_NSEC;
  • ????do_div(x,?(NSEC_PER_SEC?/?USER_HZ));
  • #endif
  • ????return?x;
  • }
  • 在<Div64.h(include/asm-i385)>中
  • /*
  • ?*?do_div()?is?NOT?a?C?function.?It?wants?to?return
  • ?*?two?values?(the?quotient?and?the?remainder),?but
  • ?*?since?that?doesn't?work?very?well?in?C,?what?it
  • ?*?does?is:
  • ?*
  • ?*?-?modifies?the?64-bit?dividend?_in_place_
  • ?*?-?returns?the?32-bit?remainder
  • ?*
  • ?*?This?ends?up?being?the?most?efficient?"calling
  • ?*?convention"?on?x86.
  • ?*/
  • #define?do_div(n,base)?({?/
  • ????unsigned?long?__upper,?__low,?__high,?__mod,?__base;?/
  • ????__base?=?(base);?/
  • ????asm("":"=a"?(__low),?"=d"?(__high):"A"?(n));?/
  • ????__upper?=?__high;?/
  • ????if?(__high)?{?/
  • ????????__upper?=?__high?%?(__base);?/
  • ????????__high?=?__high?/?(__base);?/
  • ????}?/
  • ????asm("divl?%2":"=a"?(__low),?"=d"?(__mod):"rm"?(__base),?"0"?(__low),?"1"?(__upper));?/
  • ????asm("":"=A"?(n):"a"?(__low),"d"?(__high));?/
  • ????__mod;?/
  • })
  • ? 用戶空間期望HZ=USER_HZ,但是如果它們不相等,則由宏完成轉換。

    ?

    總結

    以上是生活随笔為你收集整理的jiffies的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: www夜色| 国产黑丝一区二区 | 久久伊人影院 | 日韩极品在线 | 韩日a级片 | 久久亚洲国产精品 | 欧美在线免费看 | 日韩精品三级 | 国产在成人精品线拍偷自揄拍 | 亚日韩欧美| 波多野结衣黄色网址 | 四季av一区二区凹凸精品 | 白白色2012年最新视频 | 91香草视频 | 中文字幕av不卡 | 中文字幕久久久久久久 | 日韩视频一 | av电影中文字幕 | 精品国产乱码久久久久久免费 | 一区二区三区成人 | 欧美v亚洲 | 日韩综合区 | 亚洲激情视频小说 | 久久久久亚洲av片无码v | 久久国产经典 | 日韩欧美偷拍 | 狠狠艹狠狠干 | 亚洲第一av网站 | 奇米99| 欧美激情三区 | 91视频色 | 波多野结衣网站 | 精品国产乱码久久久久久预案 | 青草视频在线免费观看 | 中文字幕一区二区三区手机版 | 人人爽人人爽人人 | 国产精品久久久久久免费免熟 | 中国女人和老外的毛片 | 久久久久久av无码免费网站下载 | 色六月婷婷 | 国产一区二区在线免费 | 成人羞羞国产免费动态 | 亚洲第一天堂av | 国产a级黄色片 | 久久艹在线观看 | 欧美日韩1区2区3区 亚洲日本精品视频 | h网站在线播放 | 在线成人国产 | 巨骚综合 | 第四色在线视频 | 国产最新视频 | 天天5g天天爽免费观看 | 不卡中文一二三区 | 91吃瓜今日吃瓜入口 | 亚洲奶水xxxx哺乳期 | 人妻熟女一区 | 91精品一区二区三区综合在线爱 | 麻豆自拍偷拍 | 亚洲在线视频免费观看 | 国产精品久久毛片av大全日韩 | 国产成人小视频在线观看 | 亚洲不卡视频 | 中文字幕1区2区 | 天天做天天爱天天爽综合网 | 少妇精品无码一区二区 | 91爱啪啪 | 永久免费在线播放 | 中文字幕亚洲欧美 | 亚洲麻豆精品 | 国语播放老妇呻吟对白 | 亚洲五码av | 四虎成人在线视频 | 最新日韩在线视频 | 激情xxxx | 欧美激情爱爱 | 欧美脚交视频 | 射死你天天日 | 伊人国产在线观看 | www.brazzers.com| 国产精品国产三级国产Av车上的 | 狠狠狠狠狠狠干 | 四虎国产成人永久精品免费 | 久久国产乱子伦免费精品 | 91cn.com| 青草视频在线免费观看 | 亚洲AV无码成人精品区东京热 | 越南a级片| 韩日在线视频 | 97自拍偷拍视频 | 91羞羞网站| 中文字幕av资源 | 欧美日韩天堂 | 久久日本视频 | 风流僵尸艳片a级 | 国产熟妇一区二区三区aⅴ网站 | 国产白浆在线观看 | 男人的天堂亚洲 | 久久精品国产亚洲av香蕉 | 尤物视频网站在线观看 |