問題タブ [pci]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
578 参照

windows - デバイス ドライバー: 非ページ プールでのメモリの断片化を回避するにはどうすればよいですか?

32 ビット Windows 7 環境で PCI Express ボードに問題があります。このボードは、32 の個別の SD アナログ ビデオ チャネルのリアルタイム H.264 エンコーディングを実行するオーディオ/ビデオ キャプチャ デバイスです。DMA を使用して、圧縮されたフレームを Win7 ホスト ドライバーに配信します。

システムの起動時に、ボード ドライバーは、DmaAdapter オブジェクトの AllocateCommonBuffer 関数を使用して、非ページ プールから DMA バッファーを割り当てます。ボードにマップするには、すべてのバッファが同じ 256MB の物理アドレス範囲に存在する必要があります。この割り当ては、win7 ホスト システムの起動時に常に成功します。

ボードには、単純なブートローダー以外の常駐ファームウェアはありません。アプリケーションの実行時にファームウェア イメージを (ドライバーを介して) ボードにダウンロードする必要があります。ただし、このファームウェアのダウンロード プロセスの一環として、Windows アプリケーションはドライバーを介して BOARD_RESET ioctl を発行し、ボードを既知の状態にする必要があります。残念ながら、ボードがリセット コマンドを受信すると、SURPRISE_REMOVAL イベントが発生したと考える win7 PnP マネージャーのビューから一時的に「消え」ます。その後、ボード ドライバーは、割り当てられたすべての DMA バッファーを強制的に解放して非ページ プールに戻し、PnP マネージャーからの StartDevice イベントを待機します。

次の StartDevice イベントを受信すると、ボード ドライバーは DMA 割り当てを完了できなくなります。断片化が原因で、同じ物理アドレス範囲にマップできる十分なバッファを非ページ プールから見つけることができません。ドライバーは StartDevice イベントに失敗し、PnP マネージャーによってサービスから削除されます。

この状況に対するプログラムによる回避策を探しています。ボードのリセット中に何らかの方法でデバイス ノードを一時停止することは可能ですか? PnP マネージャーはそれを削除として検出しませんか? デバイスの削除検出をオーバーライドできる PnP 構成はありますか? ドライバーが最初に起動したときに正常に取得した DMA バッファーを保持する方法はありますか? このドライバーだけが使用できるように、非ページ プールのページ範囲を予約する方法はありますか? DMA バッファはかなり大きく、それぞれ 634880 バイトの 200 個のバッファがあり、それらはすべて同じ 256MB の範囲 (つまり、0x10000000 境界) から来る必要があります。ボード ドライバーの完全なソース コードがあり、必要な変更を加えることができます。これは、ベンダーから購入したリファレンス デザインの一部です。これは、Windows デバイス ドライバーに初めて触れたときです。

0 投票する
1 に答える
1691 参照

c# - PCI / PCI-X / PCI-E HBA 上のデバイスと通信してデバイスを管理するサンプル アプリケーション

私はこれの完全な初心者です。私は、PCI / PCI-X / PCI-E HBA 上のデバイスと通信して管理する「概念実証」の種類のサンプル C# .NET アプリケーションを開発するように言われました。ここに含まれる通信プロトコルの知識がありません。グーグルがあまり役に立たないか、検索が最適化されていない可能性があります。過去の経験からよく知っているのは、C# - ADO.NET だけです。これと参照リンクにどのようにアプローチするべきかについての指針を持っている体はありますか。IF が既に存在するサンプル アプリケーションは、ビジネス ニーズに合わせて複製する際に非常に役立ちます。

0 投票する
2 に答える
328 参照

c++ - カーネル実行中の CUDA 転送メモリ

CUDA カーネルを別々のストリームに入れることで「オーバーラップ」できることは知っていますが、カーネルの実行中にメモリを転送できるかどうか疑問に思っています。結局、CUDAカーネルは非同期です

0 投票する
2 に答える
11509 参照

pci - PCIe 64 ビットの非プリフェッチ可能スペース

私は PCIe 仕様である恐怖を読んでいますが、次の質問のペアに対する解決策はまだ得られません。

  1. PCIe では、巨大な (たとえば 16GB) 64 ビットのプリフェッチ不可能なメモリ空間を 4GB 境界より上にマッピングできますか? それとも、32 ビットの時代と同じ 1 GB にバインドされていて、プリフェッチできない巨大な領域を要求する方法がないのでしょうか?

  2. 仕様で許可されていると仮定すると(そして私の読書では許可されています)、広く利用可能なBIOSはそれをサポートしていますか? それとも、理論上は許可されていますが、実際には行われていませんか?

0 投票する
2 に答える
1073 参照

c - PCIEスロットへのビデオのストリーミング

コンピューターに接続されているカメラから、PCIEを介してコンピューターに接続されているFPGAに直接ビデオをストリーミングできるようにしたいと思います。

これを行うためにjavascriptやC#などの高級言語を使用してもかまいません(これらはビデオストリーミング機能があることがわかっている言語なので)が、そのレベルのハードウェアに到達するには、使用する必要があるかもしれないことを認識していますC(私はかなりよく知っています)。

Linux(Windows 7コンピューター)のインストールや特定の言語の使用など、これを達成するために行かなければならない特定のルートがあるのか​​、それともすでにこれを実行しているライブラリがあるのか​​、疑問に思いました。 。

ありがとう!

0 投票する
1 に答える
4390 参照

caching - キャッシュ可能な PCIe BAR の mmap の実行方法

mmap()この BAR をプロセッサ キャッシュにキャッシュ可能にすることを目標に、PCIe BAR のカスタム関数を使用してドライバーを作成しようとしています。これが最大の帯域幅を達成するための最良の方法ではなく、書き込みの順序が予測できないことは承知しています (この場合も問題ではありません)。

これは、MMAP が値をキャッシュするのをどのように防止しますか?で説明されている内容と似ています。

プロセッサは Sandy Bridge i7、PCIe デバイスは Altera Stratix IV dev です。ボード。

まず、CentOS 5 (2.6.18) でやってみました。MTRR 設定を変更して、BAR がキャッシュ不可能な MTRR 内にないことを確認し、ビットをクリアして使用io_remap_pfn_range()しました。読み取りは期待どおりに機能しました。読み取りは正しい値を返し、同じアドレスへの 2 回目の読み取りでは必ずしも読み取りが PCIe に送られるとは限りません (FPGA で読み取りカウンターがチェックされました)。ただし、書き込みによりシステムがフリーズし、ログや画面にメッセージが表示されずに再起動しました。_PAGE_PCD_PAGE_PWT

次に、PAT をサポートする CentOS 6 (2.6.32) で試してみました。結果は同じです。読み取りは正しく動作し、書き込みはシステムのフリーズと再起動を引き起こします。興味深いことに、非テンポラル/書き込み結合フル キャッシュ ライン書き込み (AVX/SSE) は期待どおりに動作します。つまり、それらは常に FPGA に送信され、FPGA はフル キャッシュ ライン書き込みを監視し、読み取りは後で正しい値を返します。ただし、単純な 64 ビット書き込みでもシステムのフリーズ/再起動が発生します。

また、ドライバーコードioremap_cache()を試してみました。iowrite32()結果は同じです。

ハードウェアの問題だと思いますが、何が起こっているのかについて誰かがアイデアを共有できれば幸いです.

編集: CentOS 6: Machine Check Exception: 5 Bank 5: be2000000003110a で MCE メッセージをキャプチャできました。

2 ソケットの Sandy Bridge (Romley) でも同じコードを試しました。読み取りと非一時的な書き込みの動作は同じです。単純な書き込みでは MCE/クラッシュは発生しませんが、システム状態には影響しません。つまり、メモリ内の値は変化しません。 .

また、古い 2 ソケット Nehalem システムでも同じコードを試しました。コードは異なりますが、単純な書き込みでも MCE が発生します。

0 投票する
1 に答える
1235 参照

windows - デバイス構成スペースへのアクセス - カーネル PCI デバイスの獲得

ベンダーID、デバイスIDをプログラムで指定して、pciデバイスを取得する方法を書いています(Linuxカーネルのpci_get_deviceと同じように)。

そのためには、デバイス オブジェクトの構成を取得する必要があります。私は同じことをここから読んでいます:http://msdn.microsoft.com/en-us/library/windows/hardware/ff558707(v=vs.85).aspx

これをテストするために、I/O デバイスドライバーをインストールするサービスインストールフレームワークである偽のドライバーを作成し、DriverEntry からこの PCI 機能をテストできます。

しかし、OS は irql_not_less_or_equal でクラッシュします。

誰が何が問題なのか教えてもらえますか (私はこれを Driver Entry から呼び出し、現在インストールされているドライバーの deviceObject を渡しています)。

0 投票する
2 に答える
2349 参照

dos - プラグアンドプレイ BIOS によるリソース割り当て

プラグ アンド プレイ BIOS 仕様によると、PnP BIOS を使用している場合、ハードウェアを構成できます。

これは、BIOS がすべてのデバイスのリソース要件を読み取り、それらを構成する (それらにバス リソースを割り当てる) ことを意味します。

PnP は、マザーボードに組み込まれている/統合されているデバイスに常にリソースを割り当てます (つまり、I/O またはメモリ アドレスと irq を割り当てます)?

PnP BIOS (つまり、$PnP 構造が存在する) は、mobo (つまり、mobo に組み込まれている/統合されている)およびPCI 拡張カードに存在するすべてのデバイスに常にリソース (I/O およびメモリ アドレス) を割り当てます。

BIOS は非組み込みデバイス (つまり、mobo に組み込まれていないデバイス) を「構成」する方法を知らない可能性があり、mobo 自体に組み込まれている/統合されているデバイスのみを構成しますが、アドレス (I/O およびメモリ) を割り当てる必要があります。 DOS のような非 PnP OS を使用する場合の競合を避けるための irq。

私の質問は:

PnP BIOS は、POST 中、つまり OS ブートローダーに制御をロードして転送する前に、I/O、メモリ アドレス、および irq をPCI 拡張カード デバイスに割り当てる必要がありますか? すべての PnP BIOS に当てはまりますか?

[プラグアンドプレイ OS] オプションが [いいえ] に設定されているとします。つまり、PnP OS はなく、DOS のような非 PnP OS があることを BIOS に伝えました。

一部の BIOS には、このオプションがありません。リソースは常にすべてのデバイス (つまり、組み込みデバイスと拡張スロット上のデバイスの両方) に割り当てられますか?

2012 年 8 月 1 日の更新:

PnP BIOS 仕様 v1a の「システム BIOS POST 要件」というタイトルのセクション 2.1 には、次のように記載されています。

(この投稿に関連する 3 つのポイントのみを説明しました。(*) でマークされた情報は、標準のステートメントの私の解釈です。)

プラグ アンド プレイの目標を達成するために、システム BIOS POST は、以下に示す要件を達成する責任があります。

  1. システム BIOS に認識さているすべての「静的」デバイスの構成:

    最低限」、これにはシステム ボード デバイスが含まれます。また、「プラグ アンド プレイ ISA カード」、EISA、ISA、PCI、または利用可能なその他のスタティック バス アーキテクチャのいずれかにあるデバイスも「含めることができます」 。

    *事実上、上記のステートメントは、任意の静的バス (PCI、ISA、または EISA など) 上のシステム ボードに「組み込まれている/統合されている」デバイスは、BIOS によって「構成されなければならない」ということを示しています。 * システム BIOS プログラマーは、 moboに組み込まれたデバイスをシステム設計の一部として構成するための規定を組み込んでいる必要があります。

    これには、「PCI/ISA/EISA カード スロットに取り付けられたカード」も含まれますか?

  2. BIOS POST リソース アービトレーション: システム BIOS は、システム リソースの使用状況を認識する必要があります。ランタイム サービス (後のセクションで説明) を通じて提供される情報と、システム BIOS が認識しているリソース情報を使用することで、重大なリソースの競合を回避できます。「競合するデバイスを無効にしてオペレーティング システムをロードする方が、リソースの競合やシステム障害の可能性を引き起こすよりはましです。」

    *これは、mobo または ISA/EISA 拡張カード スロットに組み込まれている/統合されている ISA/EISA デバイスのようです。 PCI デバイスのリソースは、I/O (またはメモリ) アドレス割り当ての両方に関して競合することはできないため(アドレスはPCI デバイス用に配線されていないため、競合しないアドレスを割り当てるために BIOS の「手」にかかっているため)。および irq 割り当て (becoz PCI 割り込みは設計により共有可能です。)、したがって、これは、「すべての」PCI デバイス (組み込みまたは非組み込み) が初期化/割り当てられたメモリまたは I/O アドレスと irq 割り当てであることを意味します。

  3. プラグ アンド プレイおよび非プラグ アンド プレイ オペレーティング システムの両方のサポート: プラグ アンド プレイ システムの BIOS POSTは、「両方」のプラグ アンド プレイ対応および「非プラグ アンド プレイ」オペレーティング システムで動作するようにシステムを構成する必要があります。 system.* 非プラグ アンド プレイ環境では、システム BIOS 」または適切なシステム ソフトウェア (デバイス ドライバ) の「いずれか」が「すべての」デバイス (プラグ アンド プレイ ISA カード、PCI デバイスなど) を構成する必要があります。これにより、すべての環境が「標準の PC 互換システムとまったく同じようにロード」できるようになります。ただし、プラグ アンド プレイ環境では、システム BIOS はオペレーティング システムを支援して、システム ボード デバイスのランタイム構成や、システム ボード デバイスが変更されたときのイベント認識などの機能を実行できるようになりました。

*仕様のこれら 3 つのステートメントはすべて、非 PnP OS (DOS など) を起動する場合、システム BIOS が「すべて」を構成する (または、少なくともアドレスと irq を割り当てる) 必要があることを示しているようです。マザーボード (mobo) に組み込まれている/統合されているかどうかにかかわらず、PCI デバイス。ISA および EISA デバイスの場合、BIOS はこれらの ISA/EISA デバイス (組み込みまたは非組み込みにかかわらず) のリソースを有効化/割り当ててはなりません。これにより、競合するリソース割り当てが発生します。

仕様の上記のステートメントから結論を下すのは正しいですか。つまり、「BIOS が非 PnP OS を起動する必要がある場合は、システム内の「すべての」PCI デバイス (mobo または PCI 拡張カードスロットに埋め込まれているかどうか) を有効にして (つまり、リソースを割り当てて) 、それらが利用できるようにする必要があります。 OSおよびアプリケーションプログラムで使用するために」?

2012 年 8 月 4 日の更新:

Linux Device Drivers 3rd ed の第 12 章をご覧ください。. 著者は、多くの箇所で、I/O またはメモリ アドレスと IRQ の割り当ては、Linux カーネルが実行を開始する時点で BIOS によって既に行われていることを明示的に言及しており、Linux カーネルは必要に応じて割り当てを調整する場合があります。

私たちが到達しようとしていることについて言及している別のリファレンスかもしれません。

0 投票する
1 に答える
2273 参照

windows - Windows での PCI デバイス メモリ レジスタの読み取り

システムの PCI バス上にある AHCI コントローラの HBA メモリ レジスタを読み取る必要があります。システム内のすべての PCI デバイスの構成スペースを読み取ることができるドライバーがあります (ReadConfig および WriteConfig を使用)。これにより、AHCI デバイスの構成スペースの最後の BAR である ABAR コンテンツを取得できます。ここで、これらのメモリ レジスタの値を読み取る必要があります。誰もこれを行う方法を知っていますか? PCITree はこれを行うことができるので、これが可能であることはわかっています。

私はドライバー開発が初めてなので、どんな助けでも大歓迎です... :)

0 投票する
1 に答える
6796 参照

c# - PCI デバイスのデバイス ID を取得するには?

C# で、デバイス マネージャーからシステム デバイス ID を取得しようとしています。USB デバイス ID を見つけるためのコードをいくつか見つけましたが、コードを USB デバイスから PCI デバイスに変更する方法がわかりません。

これは私が見つけたコードです: