2016-10-19 3 views
2

NIC(ネットワークインターフェイスカード)MMIO領域の使用について混乱しています。例えばNIC MMIOリージョンとは何ですか?

、これは私のコンピュータ上のNICの情報

03:02.1 Ethernet controller: Intel Corporation 82546EB Gigabit Ethernet Controller (Copper) (rev 03) 
    Subsystem: Intel Corporation PRO/1000 MT Dual Port Server Adapter 
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- 
    Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- 
    Latency: 64 (63750ns min), Cache Line Size: 64 bytes 
    Interrupt: pin B routed to IRQ 19 
    Region 0: Memory at e1b00000 (64-bit, non-prefetchable) [size=128K] 
    Region 2: Memory at e1a40000 (64-bit, non-prefetchable) [size=256K] 
    Region 4: I/O ports at 2000 [size=64] 
    Expansion ROM at e1a00000 [disabled] [size=256K] 
    Capabilities: <access denied> 
    Kernel driver in use: e1000 
    Kernel modules: e1000 

である私はそれが2つのMMIO領域を持っていることがわかります。

最初は、これらの2つの領域がパケットの送受信に使用されていると思います.1つはRXバッファ、もう1つはTXバッファですが、何らかのテストをした後、私は間違っていたと思います。

実際、これらのMMIO領域はどのように使用されていますか? TXバッファとRXバッファがない場合、これらのバッファはどこにありますか?

ありがとうございました。

+0

どのようにこれらの領域が使用されているかテストしましたか? –

+0

ハイパーバイザーを使用して、CPUコアがこれらのMMIO領域にアクセスするのを無効にします。それでもパケットの送受信はできますが、その後NICを無効にして再度有効にしようとすると、コンピュータがハングアップします。 –

答えて

0

これらは、メモリベースアドレスレジスタ(BAR)です。ここにその概念のOSDev explanationがあります。メモリBARの使用はデバイスに依存し、別のトークの対象になる可能性があります。例えば、PCIデバイスには、レジスタにがあるものにアクセスするための小さなBARがあります。また、デバイスRAMの特定の部分は、より大きなBARによって公開される可能性があります。

あなたの質問はNICに関するものなので、実際には、例のBARの1つはNICレジスタが存在するベースHWアドレスです。 e1000ドライバはPCIリソース割り当てステップ中にアドレスを問い合わせることができます(長い話ですが、hw_addrfieldのアドレスはstruct e1000_hwです)。そして、その動作中に、e1000は、上記のアドレス+何らかのオフセットを使用して、いくつかのレジスタから読み出したり、書き込んだりすることがあります。 corresponding headerで定義された異なるレジスタのオフセットを見つけることができます。例えば、ドライバがTxリングを管理する必要がある場合、適切なregistersを使用してヘッドまたはテールを照会または更新することができる。例えば、ドライバwrites zeroesがどのようにそこにあるのか見てみることができます。

RxとTxバッファの場所についても尋ねました。 データバッファーを意味するのかどうかは明らかではありません。もしそうなら、実際にパケットデータが受信され、ホストメモリバッファとDMA(ダイレクトメモリアクセス)技術を使用して送信されるので、lspciは役に立たないかもしれません。例えば、ドライバがパケットを送信したい場合には、パケットが格納されているバッファの物理アドレス(ホストメモリ)を取得し、いわゆる記述子setting the packet buffer addressで作成する。ディスクリプタがデバイスにプッシュされます。 NICがディスクリプタを取得するとすぐに、DMAトランザクションを開始する。すなわち、DMAはホストメモリに直接メモリアクセス要求を行い、最終的には送信されるバッファの内容を読み込む。

私の短い答えが少なくとも少し役に立ちますと願っています。もちろん、ドライバのソースやHW関連のドキュメントから多くの情報を得ることができます。

関連する問題