linuxのメモ

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

自己修正コード - ALTINSTR_ENTRY()

概要

alt_inster構造体のデータを初期化する

詳細

alt_inster構造体では以下のメンバを持つ

  • instr_offset : 32bit整数
  • repl_offset : 32bit整数
  • cpuid : 16bit符号無し整数
  • instrlen : 8bit符号無し整数
  • replacementlen : 8bit符号無し整数
  • padlen : 8bit符号無し整数

よってそれぞれの値を以下のように初期化する

  • instr_offset : 置換元の命令のアドレスの相対位置を保持
    • 661bラベル*1のアドレスから現在位置のアドレスを減算して得られた値を、long型のデータとして保存
    • 現在位置より前のアドレスを減算するため、演算した結果は負数となる
  • repl_offset : 挿入する命令のアドレスの相対位置を保持
    • b_replacement()で得られる挿入する命令の開始アドレスから現在位置のアドレスを減算して得られた値をlong型のデータとして保存
  • cpuid : 機能番号を保持
  • instrlen : 置換元の命令のサイズを保持
    • OLDINSTR()OLDINSTR_2()で確保したメモリのサイズをalt_total_slenから取得し、byte型のデータとして保存
  • replacementlen : 挿入する命令のサイズを保持
    • alt_rlen()で新たに挿入する命令のサイズを取得しbyte型のデータとして保存
  • padlen : 余白分のメモリサイズを保持
    • 置換元の命令より挿入する命令が大きい場合に確保したアドレスのサイズをalt_pad_lenから取得しbyte型のデータとして保存

*1:置換元の命令の開始ラベル