linuxのメモ

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

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

時間管理 - vread_tsc()

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

時間管理 - rdtsc_ordered()

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

自己修正コード - alternative_2()

概要 置換元の命令を任意の2つの命令のいずれかで置き換えるためにデータを初期化し、初期化完了後はいずれかの命令を実行する 詳細 alternative_2(小文字でマクロを指定した場合)はアセンブリ命令を実行するALTERNATIVE_2マクロのwrapperとなる ALTERNATIVE…

自己修正コード - __OLDINSTR()

概要 命令に必要なサイズ分のアドレスを確保する 詳細 以下の引数を受け取る 置換元となる命令を示す文字列 : oldinstr 置換する命令の番号を示す : num alt_rlen()にnumを引数として実行し、命令が配置されるアドレスのサイズ取得し、この値と置換元の命令…

自己修正コード - OLDINSTR()

概要 命令に必要なサイズ分のアドレスを確保する 詳細 __OLDINSTR()で命令に必要なサイズ分のアドレスを確保し、 alt_end_markerで命令終了のシンボルを付加する

自己修正コード - ALTINSTR_ENTRY()

概要 alt_inster構造体のデータを初期化する 詳細 alt_inster構造体では以下のメンバを持つ instr_offset : 32bit整数 repl_offset : 32bit整数 cpuid : 16bit符号無し整数 instrlen : 8bit符号無し整数 replacementlen : 8bit符号無し整数 padlen : 8bit符…

自己修正コード - OLDINSTR_2()

概要 命令に必要なサイズ分のアドレスを確保する 詳細 以下の引数を受け取る 置換元となる命令を示す文字列 : oldinstr 置換する命令1の番号を示す : num1 置換する命令2の番号を示す : num2 alt_rlen()にnum1とnum2を引数として実行し、命令1と命令2の命令…

自己修正コード - alt_slen

概要 置換元の命令に必要なアドレスのサイズを取得する 詳細 662ラベルから661ラベルのアドレスを減算することで命令に必要なアドレスのサイズを取得する このマクロでは命令の開始ラベルが661、終了ラベルが662となっている必要があり、更にラベルに"b"のsu…

自己修正コード - ALTINSTR_REPLACEMENT()

概要 任意の命令をメモリに配置する 詳細 b_replacement()で命令を配置する開始アドレスを示すラベルを取得し、定義する その後、任意の命令を挿入し命令の直後にe_replacement()で命令で終了アドレスを示すラベルを定義する

自己修正コード - alt_rlen()

概要 動的に挿入する命令に必要なアドレスのサイズを取得する 詳細 b_replacement()から挿入する命令の開始アドレスを指すラベル名を、e_replacement()から挿入する命令の終了アドレスを指すラベル名をそれぞれ取得し、終了アドレスから開始アドレスを減算す…

自己修正コード - e_replacement()

概要 動的に挿入する命令の終了アドレスを指すラベル名を生成する 詳細 命令の終了アドレスを指すラベル名を文字列"665"に引数の数値を文字列として連結して生成する 尚、開始アドレスを示すラベルを生成するためにb_replacement()を使用する

自己修正コード - b_replacement()

概要 動的に挿入する命令の開始アドレスを指すラベル名を生成する 詳細 命令の開始アドレスを指すラベル名を文字列"664"に引数の数値を文字列として連結して生成する 尚、終了アドレスを示すラベルを生成するためにe_replacement()を使用する

自己修正コード - alt_max_short()

概要 2つの値の最大値を返す 詳細 ((a) ^ (((a) ^ (b)) & -(-((a) < (b))))) 上記のコードで分岐を使わずに算術演算だけで最大値を取得できる*1 分岐はコストのかかる処理なので、分岐が無いことで高速に動作する このマクロはarch/x86/include/asm/alternat…