カーネルモジュールにおけるCPUの拡張機能を実装
-
26-09-2019 - |
質問
私はカーネルモジュール内の特定のCPU拡張を実装に関連する情報を探しています。 ます。http:私は、関連する何かを見つけました/実際に/www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c には、それは私がそれも近い見つけることができる唯一のソースコードです。
基本的に、私は命令セットではなく、派手な新しいもののほとんどを持っている少し古いCPU上で実行する必要がある特定のCPUの拡張、で構築されたバイナリのみ共有オブジェクトを持っています。ええ、私はそれがかなり遅くなるだろう知っているが、それはSIGILLsでクラッシュよりはましだ。
解決 4
さて、カーネルソースを読んだ後、すでにこのためのマイナーなサポートがあるように思えます。私は実際にそれが実際に使われているどのくらい見ることはできませんが、様々なエミュレートされた命令を格納するためのリンクリストが存在します。私は実際にこれが軌道に乗ることができるよ場合は、私はおそらく、カーネルヘッダ供給ツリーに変更します。
私は右の理解カーネルモジュールをしていた場合は、プラグイン可能なエミュレーションをサポートするために、問題が存在することになるように、そこには見えません。
他のヒント
私はあなたがユーザランドでこれを行うことができると思います。 SIGILL
でsigaction()
のハンドラをインストールし、SA_SIGINFO
を指定します。 si_code
のフィールドsiginfo_t
はSIGILL
のいくつかの原因を区別することができます。例えば、信号は意味がありませんkill()
から来たときの命令をエミュレートしようとしています。故障時のCPUコンテキストを含む構造体へのハンドラ点の三番目の引数(ドキュメントを参照)。あなたはおそらくこれを変更し、シグナルハンドラからの復帰、変更が効果を取ることができます。それが仕事をしない場合、setcontext()
を試してみます。
明らかに、それは少し小さいカーネルでそれを行うよりも効率的ではなく、クリーンで安全になります。
あなたはこれを行うが、その少し痛みを伴うことができます。無効オペコードは、傍受される必要がありますので、汚れや複雑ます。
でハンドラを、既存の違法命令ハンドラを変更、またはラップするいずれかの必要性 あなたが任意のカーネルの改造を避けるため、純粋なカーネルとして実行したい場合は、は、ラップ例外的なアプローチは、おそらくそれを行うための唯一の方法です。あなたがカーネルを変更することができた場合は、パッチを当てたハンドラが優れています。
私はあなたがカーネルモジュールを使用してこの問題を解決することができるとは思いません。私はあなたに欠けて指示することができます(私はXENを使用しようとするだろう)、または、それはそれらを使用しないようにオブジェクトを再コンパイルVMでこれを実行するためのいずれかが必要だと思います。