8

私の最近のプロジェクトでは、のようなデータ構造std::mapが強く求められています。ただし、デフォルトの実装でstd::mapはC ++例外が使用されますが、これはWindowsカーネルでは許可されていません。

std::mapバグやパフォーマンスの低下なしに、短時間で再発明するのは難しいと思います。std::mapだから、 Windowsカーネルにの代替が存在するかどうか知りたいです。

STLPortが候補になる可能性があります。std::mapしかし、それだけを抽出してC++例外を無効にする方法がわかりません。

4

2 に答える 2

4

カーネルモードのC++コードには、(完全な)標準ライブラリがないという問題に先行するいくつかの(重大な)制限があります。

http://msdn.microsoft.com/en-us/library/windows/hardware/gg487420.aspxを参照してください

現在、カーネルモードコードで使用するC ++の「完全に安全な」サブセットの厳密でテスト可能な定義を提供することはできませんが、通常は安全な構造とそうでない構造について、いくつかの有用なガイドラインが利用できます。

カーネルモードドライバーのC++の問題

Microsoftの開発者は、C++がカーネルモードドライバーに特定の問題を引き起こす多くの領域を発見しました。

メモリ内のコード

カーネルモードドライバーの作成にC++を使用する場合の最も深刻な問題は、データではなく、メモリページ、特にメモリ内のコードの管理です。大きなドライバーはページング可能であることが重要であり、ページングされたコードは常にメモリ内にあるとは限りません。システムがページングを実行できない状態になる前に、必要なすべてのコードが常駐している必要があります。

C ++コンパイラが非PODクラスおよびテンプレートのコードを生成する方法により、関数の実行に必要なすべてのコードがどこにあるかを知ることが特に困難になり、コードを安全にページング可能にすることが困難になります。コンパイラは、少なくとも次のオブジェクトのコードを自動的に生成します。これらのオブジェクトは「ラインから外れて」配置され、開発者はそれらが挿入されるセクションを直接制御できません。つまり、必要なときにページアウトされる可能性があります。

  • コンストラクタ、デストラクタ、キャスト、代入演算子などのコンパイラ生成コード。(これらは多くの場合明示的に提供できますが、提供する必要があることを認識するように注意する必要があります。)
  • アジャスターサンク。階層内のさまざまなクラス間で変換するために使用されます。
  • 仮想関数サンク。仮想関数への呼び出しを実装するために使用されます。
  • 基本クラスとポリモーフィズムを管理するために使用される仮想関数テーブルサンク。
  • テンプレートコード本体。明示的にインスタンス化されていない限り、最初に使用されます。
  • 仮想関数テーブル自体。

C ++コンパイラは、これらのエンティティがメモリ内のどこに配置されるかを直接制御するためのメカニズムを提供していません。メモリの配置を制御するために必要なプラグマは、C++を念頭に置いて設計されていません。

ライブラリ

ライブラリの作成と使用には、いくつかの明確な懸念事項があります。

  • エクスポートされたC++関数の名前は、リリースごとに異なる可能性があります。
  • ユーザーモードで使用できるすべての機能がカーネルモードライブラリで使用できるわけではありません。
  • 標準テンプレートライブラリは、単一のDLLからのデータオブジェクトを処理するように設計されています。
于 2013-02-13T01:32:04.700 に答える
2

周りを見回すと、おそらくstd::mapに代わるものが見つかるはずです。なぜstd::mapが必要なのですか、それは必要なハッシュテーブルですか?次に、おそらく、強化されたハッシュテーブルであるuthashを使用できます。

于 2013-02-13T12:43:36.503 に答える