NOR フラッシュのような動作をエミュレートするライブラリ (C++) を作成する必要があります。(プラットフォーム - Windows、言語 - C++) (非常に長い投稿で申し訳ありません。これまでに行ったことを説明しようとしています :) )
必要な動作:
ユーザーがフラッシュ メモリとして使用するメモリの範囲を返す必要があります。彼は返されたメモリ バッファから任意のバイトを読み取ることができるはずですが、これは問題ではありません。主な問題は書き込みです。フラッシュの書き込み動作が異なるため、アドレスがcontent (バイナリ) 10101010 で、ユーザーがそのアドレスに 01011001 を書き込もうとすると、その場所には実際には、書き込み後に 10101010 & 01011001 = 00001000 が含まれているはずです。これを行う方法がわかりません!
これらは私が考えているアプローチです:
データを複数回使用して複数回使用した後に分析できるようにするには、データをファイルとして内部的に保存する必要があるため、メモリをマップしたファイル IO を使用してメモリを返すことを計画しています。読み取りは問題ではありませんが、メモリ書き込みをトラップし、書き込む前に AND マスクを適用する方法がわかりません。
以下は私が考えたいくつかの方法です...
アプローチ 1:
公開されたポインターを読み取り専用としてマークすると、ユーザーはメモリから直接読み取りを行うことができますが、書き込みの場合は、メモリに書き込むための唯一のインターフェイスとなるインターフェイスを公開できます。インターフェースなので、マスキングを適用する要件を処理できます。
利点:
=>実装をシンプルに保ちます。
短所:
⇒書き込みに関するユーザ制限を設けて、モジュールの使い勝手を低下させています。
アプローチ 2:
すべての可能なメモリ アクセス演算子をオーバーロードするクラスを作成します。このようなもの
template <class T> class flashMemory
{
T data;
public:
void operator = (T newData) {data &= newData};
// Overload other operators too...
};
利点: => ここでも、実装が単純になります。
欠点: => ほとんどの書き込みケースを処理できますが、次のコード スニペットのような状況ではこれらを処理できません。
flashMemory *flashPtr = flashObj.getPointer();
flashPtr[10] = 'X'; //Using overloaded operator, This is fine
memcpy(flashPtr, someBuff, someSize); //This is NOT fine
...
char *myPtr = (void*)flashPtr; //Everything below using typecasted ptr is NOT fine.
myPtr[100] = 'X';
memcpy(myPtr, 0, someSize);
memcpy(myPtr, destPtr, dataSize);
したがって、これも完全な解決策ではない可能性があり、実際には新しいコードで多くの問題が発生する可能性があります。
アプローチ 3:
3 番目のアプローチは、ページ保護を READ_ONLY に設定し、シグナル ハンドラー (Linux では mprotect と sigaction) を介して書き込み試行をトラップすることですが、現時点では書き込み呼び出しのみをトラップできますが、書き込み要求を完了するための情報を取得することはできません。 . 書き込み呼び出しをトラップし、マスクを適用した後にデータを書き込むことができるかどうかを調べます。これが可能であれば、完全な解決策になる可能性があります。
利点:
1) エミュレーターを使用するユーザーに変更を加えることなく、透過的に書き込み要求を処理できます。
これは完璧に見えますが、アクセス違反があったという割り込みしか取得できませんが、実際に書き込まれているデータを取得し、割り込みハンドラーに書き込む前にマスクを適用する方法がわかりません! (ただし、Linuxでこれを試しましたが、Windowsではこれを実行していません)
アプローチ 4:
メモリがマップされたIOを備えたエミュレートされたデバイスをいくつか用意すると、デバイスのメモリ範囲への書き込みがデバイスドライバーに送られ、それを使用して好きなことを行うことができます。
これは単なる考えです。これがまったくできるかどうかはわかりません。また、できたとしても、私の要件にはやり過ぎかもしれません。
アプローチ 4:
アプローチ 3 のように読み取りと書き込みを透過的にサポートするには、Windows に相当する Linux の FUSE フレームワークを使用できます (現在、DOKAN http://dokan-dev.net/en/と CBFS http://www.eldos. com/cbfs/ )。これを使用して、コードをファイルシステムとしてシステムに提示できます。すべての読み取りおよび書き込み呼び出しは、必要に応じてデータを操作できるユーザー空間のコードに転送されます。したがって、コードには 2 つの部分があり、
flash_emulator クラスをアプリケーション ライター (現在持っているもの) に公開するライブラリ => これにより、作成したユーザー空間ファイルシステムでフラッシュ エミュレーション ファイルが開かれ、メモリ マップされた file-io が実行され、マップされたアドレスがに返されます。これを使用して、アプリケーション作成者は、ファイル システム アクション (読み取りおよび書き込み) に変換されるメモリ操作を実行できます。
シンプルなユーザー空間ファイル システム。=>これにより、ユーザー空間ファイルシステムに必要な基本的な必須インターフェースが実装され、システムファイルシステムを内部的に使用して実際にファイルが保存されます。また、実装された読み取りおよび書き込み操作は、ディスクに保存されているデータにアクセスします。読み取りは現在のようにファイルから直接読み取りますが、書き込み操作はマスクを適用してファイル システムに書き込みます。
利点: => すべてのメモリ操作を透過的にサポートし、舞台裏でフラッシュのような動作をエミュレートできます。
欠点: => 使用する必要がある外部フレームワークが必要であり、これは私たちが作成するコードよりもはるかに大きくなります。(それらが無料のフレームワークであるかどうかを確認する必要があります。まだわかりません。無料でない場合は確認して戻ってきます)
透明なフラッシュのような書き込み特性を持つためだけにユーザー空間ファイルシステムを実装するのはやり過ぎかもしれませんが、アプリケーション ライターのコードに影響を与えずにそれを行うことがより重要である場合、これは可能性の 1 つに見えます。これについてあなたの見解を教えてください。ありがとうございました。
ありがとうございました、
マイクロカーネル