シグナルによるVM実験用サンプル
■ 概要
シグナルの延長で特権命令やアクセス不可の資源へのアクセスのエミュレートを行う
ことで,実験的にVMの動作(ハイパーバイザの動作)を行います.(2020/11/17)
具体的には,以下のようなことをします.
- 特権命令やユーザーモードではアクセス不可の資源へのアクセスが
発生した際には,SIGILLやSIGSEGVなどのシグナルが発生し,
通常はプロセス停止する.
- このシグナルにシグナルハンドラを登録し,ハンドラの実行の延長で,
スタック上に退避されているシグナル発生時のレジスタ情報(コンテキスト)を
参照し,プログラムカウンタの値からシグナル発生箇所
(特権命令などの実行箇所)を調べ,実行した命令を知り,そのエミュレートを
した上で,結果に応じてレジスタ情報を書き換えてシグナル復帰する.
- これによりユーザ・プログラムからは,その命令が正常に実行できたように
見える.(実際にはシグナル発生し,シグナルハンドラ内でエミュレートしている)
Linux/x86 or Linux/x86_64 の環境で動作します.
CentOS(32bit)/Debian(64bit)で動作確認済み.
(シグナル発生時のコンテキストの保存方法に依存するため,
上記環境でないと正常動作しません.x86/x86_64の両方には対応しています)
シグナル発行時のコンテキスト保存については,Linuxの
linux/arch/x86/kernel/signal.c
の以下を参照.
get_sigframe()
setup_sigcontext()
struct sigframe
struct sigcontext