3

Linux での単体テスト用にメモリ I/O デバイスをエミュレートするにはどうすればよいですか?

組み込み展開用のソースコードの単体テストを書いています。

コードは、チップと通信するために特定のアドレス空間にアクセスしています。

  • このコードを Linux で単体テスト (UT) したいと考えています。
  • 単体テストは、人間の介入なしで実行できる必要があります。
  • UT を通常のユーザーとして実行する必要があります。
  • テストするコードは、ターゲット システムで実行されているソース コードとまったく同じでなければなりません。

これを解決する方法についてインスピレーションを得るためにどこに行くことができるかについてのアイデアはありますか?

通常のユーザーは、特定のメモリ割り当てを特定のアドレスで行う必要があることを MMU に伝えることができますか。それとも、データ ブロックが特定のメモリ領域にある必要がありますか?

私が理解しているように:

  • sigsegv は使用できません。ハンドラーから戻った後、同じメモリアクセスコードが再度呼び出され、再び失敗するためです。(または偶然、メモリ領域に実際に有効なデータが含まれている可能性がありますが、私が望むものではありません)

    ありがとう

    ヘンリー

4

2 に答える 2

2

まず、ハードコードされた依存関係ではなく、コードの注入された依存関係を読み取るアドレスを作成します。これで、テスト条件下での場所を気にする必要がなくなり、好きな場所にすることができます。

次に、テスト対象によっては、依存関係としてマジックアドレスとの間で読み取り/書き込みを行う関数を挿入する必要がある場合もあります。これで、テスト対象のコードをだましてI/Oを実行していると思わせる方法について心配する必要はありません。スタブ/モック/ハードウェアI/Oの動作は何でもできます。

説明した条件下で低レベルのコードをテストすることは非常に困難ですが、非テストモードでは非常に効率的です。これは、あまりにも多くのレベルの間接参照を導入したくないためです。

「正確にソースコード」は、それをどのように解釈するかに応じて、多くの罪を隠すことができます。たとえば、「依存性注入」はマクロを介して行うことができるため、ユニットソースは「同じ」ですが、卑劣な-Dコンパイラオプションでの動作を完全に変更しました。

于 2012-05-31T21:22:37.760 に答える
0

私の知る限り、ブロックデバイスを作成する必要があります(キャラクターデバイスが機能するかどうかはわかりません)。そのメモリ範囲をそれ自体にマップするカーネル モジュールを作成します。読み取り/書き込み関数を作成するため、そのメモリ範囲に触れるたびに、それらの読み取り/書き込み関数が呼び出されます。

これらの読み取り/書き込み機能をカーネルに登録して、それらのアドレスへの読み取り/書き込みがあるたびにカーネルが呼び出され、ユーザーに代わってカーネルによって読み取り/書き込み機能が実行されるようにします。

于 2012-05-31T21:46:17.573 に答える