linuxのメモ

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

2016-03-04から1日間の記事一覧

時間管理 - 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()マクロにより取得した値を出力して、結果を…

MSR - EAX_EDX_VAL()

msr

概要 MSRの返り値を取得する 詳細 このマクロではval、low、highの3つの引数を受け取り、CONFIG_X86_64が有効な場合と無効な場合では以下のように処理が異なる 有効な場合 highを上位32bit、lowを下位32bitの値とするデータを返す 無効な場合 valの値を返す

MSR - EAX_EDX_RET()

msr

概要 MSRの返り値を定義する 詳細 このマクロではval、low、highの3つの引数を受け取り、CONFIG_X86_64が有効な場合と無効な場合では以下のように処理が異なる 有効な場合 lowをeaxに、highをedxにそれぞれ出力変数として割り当てる 無効な場合 valを出力変…

MSR - DECLARE_ARGS()

msr

概要 変数を定義する 詳細 このマクロではval、low、highの3つの引数を受け取り、CONFIG_X86_64が有効な場合と無効な場合では以下のように処理が異なる 有効な場合 unsigned long型の変数lowとhighを定義する 無効な場合 unsigned long long型の変数valを定…

vDSO - gtod

概要 vsyscall_gtod_data型のポインタを参照するためのマクロ 詳細 VVAR()にvsyscall_gtod_dataを引数として渡し、DECLARE_VVAR()で宣言されたシンボルにアクセスする

vDSO - EMIT_VVAR()

概要 vDSOで参照するメモリのシンボルを定義する 詳細 リンカスクリプト内でシンボルを定義し、指定されたサイズ分のアドレスを確保する このマクロを呼び出すvvar.hはリンカスクリプト内でincludeされるため、コンパイル可能な形で展開することができる

vDSO - DECLARE_VVAR()

概要 vDSOで参照する変数のメモリアドレスを確保する 詳細 引数として以下の値を取る 変数のoffsetを示す : offset 変数の型を示す : type 変数名を示す : name この時、offsetとnameを引数として*1EMIT_VVAR()マクロを展開する 尚、__VVAR_KERNEL_LDSが定義…

vDSO - VVAR()

概要 DECLARE_VVAR()で定義された変数を参照する 詳細 引数として与えられた文字列にvvar_のprefixを付けて展開し、DECLARE_VVAR()で定義された変数を参照する

時間管理 - gtod_read_begin()

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

メモリバリア - smp_rmb()

概要 読み込んだメモリの内容が全てのCPUで同期されることを保証する 詳細 CONFIG_SMPが有効な場合はsmp_rmb()マクロを実行するがx86では__smp_rmb()もbarrier()と定義されているため、コンフィギュレーションに関係なくbarrier()のwrapperとなっている

atomic操作 - ACCESS_ONCE()

概要 指定された値に確実にアクセスする 詳細 __ACCESS_ONCE()のwrapperマクロ

atomic操作 - __ACCESS_ONCE()

概要 指定された値に確実にアクセスする 詳細 volatile修飾子をつけることでコンパイラの最適化を抑止し、コードで指定した箇所で確実に値にアクセスすることを強制する