2011-08-28 16 views
6

MMUをサポートせずにメモリを保護する方法を知りたいと思います。私はそれをGoogleにしようとしましたが、価値ある論文や研究を見たことはありません。そして、それを扱う人は、初期化されていないポインタやソフトエラーによるメモリ破損ではなく、ハードウェアの過渡的なフォールトがメモリ位置に書き込む命令を破壊するために、それを処理します。MMUを使用しないメモリ保護

私がこれを知りたい理由は、メモリ保護なしで独自のmanycoreプラットフォームで作業しているからです。今、私の質問は、(特にプログラマーの間違いとは対照的に)ソフトエラーのために野生の書き込みのために、メモリを保護するためにソフトウェアを使うことができます。これに関する助けは本当に感謝しています。

+0

あなたが必要とすることはありませんか? –

+0

私はそれをデバッグする必要はありませんが、実行時にメモリを破壊するためのワイルドな書き込みは避けてください。基本的には、安全で信頼性の高いシステムが必要です。 – MetallicPriest

答えて

5

ランタイムメモリ保護をお探しの場合は、唯一のオプションはハードウェアサポートです。ハードウェアは、損傷を引き起こす可能性がある前に、悪いメモリアクセスに介入する唯一の方法です。どのソフトウェアソリューションも、保護しようとしている非常に大きなメモリエラーに対して脆弱です。

ソフトウェアでは、検証/検出スキームを実装する可能性があります。現在実行中のプログラムがアクセスしてはならないメモリの部分を定期的にチェックして、それらが変更されているかどうかを確認することができます(恐らくこれらの領域のCRC処理によって)。もちろん、不正プログラムがチェックサムが保持されている場所やチェックプログラムのコードが保持されている場所に損害を与えた場合、すべてのベットはオフになります。

このソフトウェアチェックソリューションでさえ、永続的なランタイム保護よりもデバッグユーティリティの方が多くなります。 MMUを持たないデバイスは、デバイスのメモリを絶えず調べるスペアサイクルを持たない小型の組み込みデバイスです。

通常、MMUのないデバイスは、カーネルやその他のものがない単一のプログラムを実行するように設計されているため、保護する必要はありません。複数のプログラムを実行して保護が必要な場合は、探している種類の機能をサポートするより高度なハードウェアが必要になるでしょう。

+1

メモリ保護をハードウェアで実装できる場合、おそらくソフトウェアで実装することができます。 –

+1

@David:確かに、ハードウェアをエミュレートする。その時点では、仮想マシンにすぎません。その後、実際のハードウェアの速度が再生されます。おそらく、この男は自分のVMを実装することには興味がありません。なぜなら、それはちょっと狂っているからです。 – SoapBox

+1

私はそれにすべて同意します。ハードウェアが唯一の方法だと言って、あなたに問題を出しました。おそらく、ハードウェアが唯一の現実的または純粋な方法だと言えるでしょう。それで全部です! –

2

ソフトウェアでメモリ保護を実装するには、コンパイラとその関連ライブラリからのサポートが必要です。私はこのプラットフォーム上に1つのコンパイラしか存在しないことを期待しているので、ベンダーに連絡するべきです。私は肯定的な応答のための多くの希望を保持しません。たとえそのようなツールがあったとしても、私はソフトウェアメモリ保護のパフォーマンスが受け入れられないと予想します。

+0

どんな種類のサポート。どういう仕組みでしょうか? – MetallicPriest

+3

コンパイラは通常、メモリにアクセスするたびに簡単な読み取りまたは書き込み命令を書き込みます。しかし、そのようなすべての命令を、あなたが探しているランタイム保護を実行したライブラリ関数への呼び出しに置き換える必要があります。 –

+0

...あなたがその極端なところに行くつもりならば、あなたのプログラムを例えばに移植することもできます。 PythonやLuaを使ってやってください。あなたはより良い性能と同様の安定性を得るでしょう。 –

0

実行するアプリケーションプラットフォームによって異なります。ソフトウェアエラーから保護できるType-Safe Language(ATSなど)という技術があります。そして、そのような言語は良いパフォーマンスを持つかもしれません(例えば、ATS)。

1

MMUの少ないシステムは、いくつかの組み込みソリューションに存在します。

メモリはカーネルコードで管理されます。メモリ全体(ヒープ)は、さまざまなサイズのヒープリストに分割されます(ヒープリストは、4バイト、8バイト、16バイトから1024バイトまでのサイズにすることができます)。各ヒープブロックにヘッダーが添付されています特定のヒープブロックが取得されるかどうかを示します。したがって、新しいヒープブロックを割り当てる必要があるときは、ヒープリストをブラウズして、どのヒープブロックが空いているかを確認し、要求するアプリケーションに割り当てることができます。特定のサイズのヒープブロックを解放した場合も同様です。そのブロックのヘッダーは、解放されたことを反映して更新されます。

この実装では、アプリケーションが特定のサイズのヒープブロックを要求し、そのヒープリストのサイズがいっぱいである場合のシナリオを処理する必要があります。その場合、次のサイズのヒープリストからブロックを分割するか、より小さなサイズのヒープブロックを結合して、要求されたサイズのヒープリストに追加します。

実装ははるかに簡単です。

関連する問題