読者です 読者をやめる 読者になる 読者になる

linuxのメモ

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

自己修正コード - alternative()

概要

置換元の命令を任意の命令で置き換えるためにデータを初期化し、初期化完了後はいずれかの命令を実行する

詳細

alternative(小文字でマクロを指定した場合)はアセンブリ命令を実行するALTERNATIVEマクロのwrapperとなる

ALTERNATIVEマクロ内では実行可能なアセンブリ命令の文字列を生成する

このマクロ内では以下の引数を受け取る

  • 置換元の命令の文字列 : oldinstr
  • 動的に挿入する命令の文字列 : newinstr
  • 動的に挿入する命令の機能番号を示す : feature1

OLDINSTR()を実行し命令に必要なアドレスを確保する

そして、ALTINSTR_ENTRY()マクロ内でpushsectionにより、altinstructionsセクションに初期化したalt_instr構造体のデータを追加する

その後、ALTINSTR_REPLACEMENT()マクロ内でpushsectionにより、altinstr_replacementセクションに動的に挿入する命令を追加する

このマクロ内では命令の置換は行われず初期化だけが行われ、実際の命令の置換はapply_alternatives()で行われることになる

また、altinstructionsaltinstr_replacementディレクティブについてはarch/x86/kernel/vmlinux.lds.Sリンカスクリプト内で定義されており、altinstructions内のデータにアクセスするためには__alt_instructionsシンボルでアクセスできる

尚、初期化はコンパイル時に行われるためコンパイル時に初期化されたoldinstrを実行時に動的に初期化する