2016-04-05 23 views
0

pci_alloc_consistent(..)で宣言された1つのBARと1つのDMA領域を示すPCIEデバイスがあるとします。 BARのフラグは、プリフェッチ不可、キャッシュ不可、メモリ領域を示します。ioreadの待ち時間

DMA領域を読み取る際のレイテンシの主な原因は何か、同様にBARを読み取るレイテンシの原因は何ですか?

この簡単な質問にお答えいただきありがとうございます.D!

答えて

1

これは宿題のようなものですが、私はコンセプトがよく理解されていないと思っていますので、私は答えを追加します。

これを考えるには、読み取りを完了するために何が起こる必要があるかを検討するのが最も良い方法です。 CPUとデバイスはPCIeリンクの別々の側面にあります。 PCI Expressをミニネットワークとして表示すると便利です。各リンクはポイントツーポイントです(別のPCに接続されたPCのようなものです)。中間スイッチ(別名PCIブリッジ)もあります。その場合、それはあなたのPCがもう一方のPCに接続されているスイッチに接続されているようなものです。

CPUが独自のメモリ(割り当てた "DMA"領域)を読み込もうとすると、比較的高速です。それは速く起こるように設計された高速バスを持っています。また、頻繁に(または最近)使用されたデータをCPUに「近づける」ために、複数のキャッシュ層が組み込まれています。

しかし、CPUがデバイス内のBARから読み込みたい場合、CPU(実際にはCPUと統合されたPCIeルートコンプレックス)はPCIe読み取り要求を作成し、要求を送信し、デバイスが要求をデコードする間待機する必要がありますBARの場所にアクセスし、要求されたデータを送り返す。チクタク。これが完了するのを待っている間、あなたのCPUは何もしていません。

これは、別のコンピュータからWebページを要求するのとほぼ同じです。 HTTPリクエストを公式化して送信し、Webサーバーがコンテンツにアクセスしてリターンパケットを作成して送信する間、待機します。

デバイスがCPUの「内」にあるメモリにアクセスしたい場合は、まったく同じことを逆にします。 (「ダイレクトメモリアクセス」とは、それを処理するためにCPUを中断する必要がないことを意味しますが、ここではルートコンプレックスが依然としてリクエストをデコードし、読み込みを行い、結果データを返すことになります)

また、CPUとデバイスの間に中間のPCIeスイッチがあると、追加のバッファリング/キューイング遅延(ネットワーク内のスイッチやルータの場合とまったく同じ)が追加される可能性があります。そしてそのような遅延は両方向で発生するため、倍増します。

もちろん、PCIeは非常に高速です。そのため、すべてが単なるナノ秒で起こりますが、それでも「ローカル」の読み込みよりも遅いオーダーです。

+0

お返事ありがとうございます。 BARは実際のメモリではなく、ルートコンプレックスがデバイスへのTLPを生成するだけのアドレスなので、CPUからBARを読み取ることは常にポストされていないことです。たいていの場合、読み込みは2usが必要ですが、場合によっては15msとなるため、ioreadを中断しないように設定する方法はありますか?これは、100(単一タスク分離CPU)であるHZ値の領域においても同様に、タスクプリエンプションである可能性がある。私は10msecで満足しますが、15msでは満足しません。 – toomanychushki

+0

BARの1回の読み込みは中断されません(少なくとも私が取り組んだアーキテクチャでは)。 CPUの観点からロード命令を実行するだけです。割り込みは、機械命令の途中では認識されません。だから問題は次のとおりです:時間はどこに行くのですか?私は最初に遅延がどちら側にあるか把握します。実際のPCIeトランザクションが完了するまでの時間を調べるために、読み取り前後にタイムスタンプカウンタ(またはアーチで利用可能なもの)を読むことができます。シーケンス全体で割り込みが無効になっています。 –

関連する問題