web-dev-qa-db-ja.com

デバイスのメモリにアクセスするようにPCI / PCIe BARはどのように構成されていますか?

以前の 質問 で、PCI/PCIeデバイスが使用するメモリアドレスをシステムRAMにマップする必要はなく、「デバイス上の」メモリを参照することもできることを確認しました。 RAMまたはレジスタ。

しかし、この場合、BARはどのように設定されますか?

それは単にケースですか(構成中の場合):

  • デバイスは、たとえば16MBのメモリを公開したいことをアドバタイズします。
  • BARにはベースアドレスが割り当てられます。
  • その後、デバイスはオフセットを内部メモリにマッピングしますか?

これは、デバイスが16MBのシステムメモリにアクセスしたい場合とどのように異なりますか(つまり、デバイスに独自のメモリがありませんか?)

ありがとう!

編集:アドレス指定は次の間でどのように異なりますか?
A:デバイスには独自のメモリがありません。共有メモリを使用するビデオアダプタ。
B:デバイスにはメモリがあり、システムと共有します(たとえば、RAMバッファを備えた架空のHDDアダプタ)。

どちらの場合も、BARはOSによって割り当てられ、アドレス可能なメモリを占有しますか?

この区別は、RAMで完全に占有されているシステムでは重要です(たとえば、4 GB RAMがインストールされている32ビットシステムは、2GBの共有RAM [状況(A)]。しかし、同じシステムには、オンボード2 GB RAMキャッシュを備えた架空のHDDアダプター用のアドレススペースが残っていません[状況(B)]?

1
KevinM

BARはシステムRAMのデバイスバッファには使用されず、デバイスはBARを介してそのようなバッファを要求しません。むしろ、デバイスのホストレジスタインターフェイス仕様には、ホストが特定のサイズ(または指定された範囲内のサイズ)のバッファを割り当てて、デバイスで使用できるようにする必要があるという規定が含まれます。

むしろ、ホストドライバーは、システムRAMからバッファーを割り当て、デバイスにその場所(および、固定サイズでない場合はその大きさ)を通知します。おそらく、次のように記述します。おそらくより複雑なプロトコルの一部として、デバイスレジスタへのアドレス。

次に、デバイスは、バッファに向けられたメモリの読み取りおよび書き込みトランザクションを開始することにより、I/O操作に関連付けられたバッファにアクセスするのと同じようにシステムRAMバッファにアクセスします。

1
Jamie Hanrahan

BAR設定の解釈は正しいです。

では、それはどのように異なりますか。

デバイスのオンボードメモリ/レジスタは通常、特別なRAMであり、バイポートRAMの場合があります(各セルに2つのポートがある場合、1つはホストバスに接続され、もう1つはデバイスの内部バスに接続されます。両側からのより高速で同時アクセス)、それはレジスタ、またはデバイスのロジックを制御するFPGAの入力または出力である可能性があります フィールドプログラマブルゲートアレイ

デバイスがRAMを使用してアクセスできるメインシステムDMAは、ほとんどの場合、まったく異なる指定になっています。最も一般的なケースでは、デバイスのデータソースまたはデータ宛先として使用されます。たとえば、ディスクドライブの場合、デバイスはそのメモリにアクセスして、データを読み込んだり、このデータをメディアに書き込んだりします。このような送信元と宛先の場所は、システムバッファによって制限されません。たとえば、ページング(仮想メモリへのスワップインと仮想メモリからのスワップアウト)は、問題のページの物理ページアドレスとの間で直接実行されます。

DMAアクセスの他の可能な種類は、デバイスがシステムから自身のニーズのためにメモリ領域を要求する場合です。例の1つは、画面に表示する画像のバイナリ表現を保持するための独自のRAMが通常ない統合ビデオアダプタです。ただし、この場合はディスク書き込み操作と非常によく似ています。唯一の違いは、それが連続的であるということです。

1
Serge

PCI(e)デバイスは、少なくとも標準のPCI(e)構成方法(BAR)を使用しない限り、専用のシステムメモリバッファーを要求できません。一般的にこれを行うデバイスは統合GPUのみであり、メモリバッファを予約するマザーボードチップセットで特別なサポートがありますが、これらはシステムBIOSによってのみ理解および設定されます。

0
psusi