linuxのメモ

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

自己修正コード - arch_static_branch()

概要

分岐可能なコードを生成し、条件を判断するコードをNOP命令で初期化する

詳細

asm_volatile_goto()で分岐可能なアセンブラ命令を生成する

__stringify()STATIC_KEY_INIT_NOPを渡すことで5byteのNOP命令の文字列を生成するため、初期状態では常に0を返すことになる

その後pushsectionにより、__jump_tableセクションに書き込み可能なデータとして_ASM_ALIGNでアライメントされ、_ASM_PTRの大きさのデータを保存する

保存したデータはstruct jump_entry型のデータとなり以下の値で初期化される

  • code : NOP命令で初期化されたメモリのアドレス
  • target : 分岐先のラベルl_yesのアドレス
  • key : 引数として取得したstruct static_key型のポインタとbool型の値を加算した値

このデータはjump_label_init()で起動時に初期化され、初期化後は初期化後の値にしたがって0か1を返す