Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> Linuxグローバル変数jiffiesの使用法

Linuxグローバル変数jiffiesの使用法

  

jiffiesは、時間に関連したLinuxシステム内のグローバル変数ですが、jiffies変数の具体的な役割は何ですか?次の小シリーズでは、Linuxのグローバル変数jiffiesの使い方を紹介します。興味のある友人は理解したいと思うかもしれません。
ログイン

秒でシステムの稼働時間、等しいjiffy単位/ヘルツ。

jiffies型はunsigned long型であり、他の型には正しくありません。

秒単位の時間をjiffyに変換します。

秒* Hz

jiffiesを秒単位の時間に変換します。

jiffies /Hz

対照的に、カーネルは秒をjiffyに変換します。

jiffiesの内部表現

jiffiesはファイルで定義されています。

/*

* 64ビット値はアトミックではありません - 読んではいけませんxtime_lockでシーケンス番号をサンプリングせずに

*

get_jiffies_64()を実行すると、これが適切に行われます。

* /

extern u64 __jiffy_data jiffies_64;

extern unsigned long volatile __jiffy_data jiffies;

ld(1)スクリプトは、メインカーネルイメージに接続するために使用されます(x86のarch /i386 /kernel /vmlinux.lds.S内)。次に、jiffies変数をjiffies_64変数の初期値で上書きします。そのため、jiffは、jiffies_64変数全体の下位32ビットを取ります。

jiffiesにアクセスするためのコードはjiffies_64の下位32ビットのみを読み取り、64ビット値全体はget_jiffies_64()関数を介して読み取ることができます。 64ビットアーキテクチャでは、jiffies_64とjiffiesは同じ変数を参照します。

#if(BITS_PER_LONG "64)

u64 get_jiffies_64(void);

#else

静的インラインu64 get_jiffies_64(void)

{

return(u64)jiffies;

}

#endif

in

#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; < Br>

}

jiffiesが折り返し

jiffiesの値が最大格納範囲を超えると、オーバーフローが発生します。 32ビット符号なし長整数の場合、最大値は(2 ^ 32)-1です。これは429496795です。最大値に達した後もビート数が増え続けると、その値はゼロに戻ります。

カーネルには、ビート数の比較に役立つ4つのマクロがあります。これらは、ビート数の巻き戻しの問題を正しく処理します。

/*

*これらのインラインは、タイマーラッピングを扱います。あなたは

*それらを使うことを強く推奨されています。

* 1.他の人が忘れてしまうから

* 2.将来的にタイマーラップが変わっても勝たないから

*ドライバコードを変更する必要があります。

*

* time_after(a、b)は、時間aが時間bの後であればtrueを返します。

*

*結果の符号のみをテストするには、' "0'"と' "= 0'を使用してこれを実行してください。本当に良いコンパイラです。

*気にする必要はありません。現在Gccはどちらでもありません。

* /

#define time_after(a、b)/

(typecheck(unsigned long、a)&& /

タイプチェック(符号なしlong、b)&& /

((long)(b) - (long)(a) "0")

#define time_before(a 、b)time_after(b、a)

#define time_after_eq(a、b)/

(typecheck(符号なしlong、a)&& /

typecheck (unsigned long、b)&& /

((long)(a) - (long)(b)》 = 0))

#define time_before_eq(a、b) Time_after_eq(b、a)

/*上記と同じですが、プラットフォームに依存しない64ビットタイプでも同じです。

*これらはjiffies_64を使用するときに使用する必要があります(つまり、戻り値
<)。 p> * 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)< Br>

#define time_after_eq64(a、b)/

(typecheck(__ u64、a)& /& /

typecheck(__ u64、b)&& /< Br>

((__s64)(a) - (__s64)(b)》 = 0))

#define time_before_eq64(a、b)time_after_eq64(b、a)

ユーザースペースとHZ
前のページ12次のページ合計2ページ

Copyright © Windowsの知識 All Rights Reserved