linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

time

時間管理 - vread_hpet()

概要 HPETから現在時間を取得する 詳細 hpet_page*1の先頭からHPET_COUNTER*2バイト目から32bit分のデータを取得する *1:arch/x86/entry/vdso/vdso-layout.lds.Sのリンカスクリプト内で定義され、1ページ(4KB)分の領域を持ち、hpet_enable()で初期化される *…

時間管理 - vread_tsc()

概要 タイムスタンプを返す 詳細 rdtsc_ordered()からプロセッサのタイムスタンプを取得し、取得した値をgtodのcycle_lastメンバと比較する 比較の結果大きい値を返すが、rdtsc_ordered()から取得した値のほうが小さかった場合は空文字のインラインアセンブ…

時間管理 - rdtsc_ordered()

概要 プロセッサのタイムスタンプを返す 詳細 alternative_2()でmfenceかlfenceのいずれかの命令が実行されるように初期化し、アウト・オブ・オーダー実行により、命令の実行順序が変更されないように抑止した上で、rdtsc()からプロセッサのタイムスタンプを…

時間管理 - gtod_read_retry()

概要 引数の値が、指定した値と一致するか確認する 詳細 vsyscall_gtod_data型のポインタsと、unsigned int型の値startを引数として受け取る sの内容が他のスレッドで更新されていた場合に、その内容をメモリに反映するためににsmp_rmb()を実行し、その後にs…

get_cycles()

概要 プロセッサのタイムスタンプを返す 詳細 CHIP_HAS_SPLIT_CYCLE()の値が1の場合はget_cycles_inline()を実行するが、x86ではこのマクロは定義されていないため必ずこの関数を実行することになる この関数では、CONFIG_X86_TSCが無効な場合は常に0を返し…

時間管理 - rdtsc()

概要 プロセッサのタイムスタンプを返す 詳細 DECLARE_ARGS()で変数を定義し、rdtscアセンブラ命令によりプロセッサのタイムスタンプをedx:eaxに読み込む 出力変数はEAX_EDX_RET()マクロで定義され、EAX_EDX_VAL()マクロにより取得した値を出力して、結果を…

時間管理 - gtod_read_begin()

概要 引数の値が更新可能な状態になるまで待ち、更新可能な状態になったら、現在値を返す 詳細 vsyscall_gtod_data型のポインタsを引数として受け取る ACCESS_ONCE()でs->seqを読込み、読み込んだ値が奇数値なら別なプロセスでこの値を参照しているためcpu_r…

時間管理 - time_after()

概要 2つの引数で取得した時間を比較し、第一引数の時間が大きいか確認する 詳細 typecheck()マクロにより2つの引数の型がunsigned longであり確認し 第一引数が第二引数よりも大きければ1、それ以外の場合は0を返す

時間管理 - jiffies_to_msecs()

概要 周波数の回数から時間(ミリ秒)を算出する 詳細 周波数の回数を表す符号なし整数jを引数として取得し、以下の定数からミリ秒に変換する HZ : _CONFIG_HZによって指定されるCPUの周波数を示す定数 MSEC_PER_SEC : 1秒 = 1000ミリ秒のため1000を示す定数 B…

時間管理 - _msecs_to_jiffies()

概要 指定された時間(ミリ秒)に必要な周波数を算出する 詳細 ミリ秒を表す符号なし整数mを引数として取得し、以下の定数から周波数の回数に変換する HZ : _CONFIG_HZによって指定されるCPUの周波数を示す定数 MSEC_PER_SEC : 1秒 = 1000ミリ秒のため1000を示…

時間管理 - __msecs_to_jiffies()

概要 指定された時間(ミリ秒)に必要な周波数を算出する 詳細 引数として符号なし整数値(unsigned int)を与えられるが、この値を符号付き整数値(int)にキャストした際に負数となる場合はMAX_JIFFY_OFFSET_を返す それ以外の場合は_msecs_to_jiffies()から取得…

時間管理 - msecs_to_jiffies()

概要 指定された時間(ミリ秒)に必要な周波数を算出する 詳細 引数として符号なし整数値(unsigned int)を与えられる 引数の値が定数の場合 引数の値を符号付き整数値(int)にキャストした際に負数となる場合はMAX_JIFFY_OFFSETを返す 符号付き整数にキャストし…