2

カーネルモジュールに特定のCPU拡張機能を実装することに関する情報を探しています。私は関連する何かを見つけました:http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c実際、それは私が見つけることができる唯一のソースコードであり、さらに近いです。

基本的に、私は特定のCPU拡張機能で構築されたバイナリのみの共有オブジェクトを持っています。これは、ほとんどの命令セットを備えた少し古いCPUで実行する必要がありますが、派手な新しいものはありません。ええ、私はそれがかなり遅くなることを知っています、しかしそれはSIGILLsでクラッシュするよりはましです。

4

4 に答える 4

2

私はあなたがユーザーランドでこれを行うことができると思います。SIGILLwithのハンドラーをインストールし、sigaction()を指定しますSA_SIGINFO。のフィールドsi_codeでは、siginfo_tのいくつかの原因を区別できますSIGILL。たとえば、信号が発信されたときに命令をエミュレートしようとしてkill()も意味がありません。ハンドラーの3番目の引数は、障害発生時のCPUコンテキストを含む構造体を指します(ドキュメントを参照)。これを変更してシグナルハンドラから戻ると、変更が有効になります。それでもうまくいかない場合は、試してくださいsetcontext()

明らかに、カーネルで実行するよりも効率は少し劣りますが、よりクリーンで安全です。

于 2010-08-06T12:52:45.423 に答える
2

あなたはこれを行うことができますが、それは少し苦痛です。無効なオペコードをインターセプトする必要があるため、既存の不正な命令ハンドラーを変更するか、ハンドラーをラップする必要があります。これは汚くて複雑です。

カーネルmodを避けたいが、純粋なカーネルとして実行したい場合は、ラップされた例外アプローチがおそらくそれを行う唯一の方法です。カーネルを変更できる場合は、パッチを適用したハンドラーの方が適しています。

于 2013-02-16T23:31:13.160 に答える
1

カーネルモジュールを使用してこの問題を修正できるとは思いません。欠落している命令を許可するVMでこれを実行するか(XENを使用してみます)、オブジェクトを再コンパイルしてそれらを使用しないようにする必要があると思います。

于 2010-08-05T23:34:05.957 に答える
1

さて、カーネルソースを読んだ後、これに対するマイナーなサポートがすでにあるようです。実際にどれだけ使用されているかはわかりませんが、エミュレートされたさまざまな命令を格納するためのリンクリストがあります。実際にこれを実行できる場合は、おそらくカーネルヘッダーが提供するツリーに変更します。

カーネルモジュールを正しく理解していれば、プラグイン可能なエミュレーションをサポートするための問題はないようです。

于 2010-11-17T02:33:12.877 に答える