linuxのメモ

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

準仮想化 - _paravirt_alt()

概要

準仮想環境下で実行される命令の置き換え、及び実行するためのアセンブラ命令を生成する

詳細

このマクロでは以下の引数を取得する

  • 挿入する命令を示す文字列 : insn_string
  • 挿入する命令の種類を示す : type
  • 使用するレジスタの種類を示す : clobber

insn_string命令を配置するが、この時に命令の開始アドレスを771ラベルに、終了アドレスを772ラベルにそれぞれ紐付ける

その後、_ASM_ALIGNでアライメントの幅を決定し、arch/x86/kernel/vmlinux.lds.Sで定義されているparainstructionsセクションに以下のデータを配置する

  • _ASM_PTRサイズのinsn_string命令の開始アドレスを示すポインタ
  • byteサイズのtypeで示されるinsn_string命令の種類
  • byteサイズのinsn_string命令のサイズ
  • short(2byte)サイズのclobberで示される使用されるレジスタの種類

配置したデータはparavirt_patch_site構造体のデータとなり、挿入された命令はapply_paravirt()で適用される