NIC MMIO区域用于什么?

时间:2016-10-19 08:03:01

标签: networking operating-system nic

我对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区域。

起初我认为这两个区域用于接收和发送数据包,一个是RX缓冲区,另一个是TX缓冲区,但经过一些测试后,我认为我错了。

那么,这些MMIO区域实际上用于什么?如果它们不是TX和RX缓冲区,那么这些缓冲区在哪里?

感谢。

1 个答案:

答案 0 :(得分:0)

这些是内存基地址寄存器(BAR)。这是概念的OSDev explanation。内存BAR的使用取决于设备,可能是单独谈话的主题。例如,PCI设备可能有一个小BAR,可以访问它拥有的任何寄存器。此外,设备RAM的某些部分可能会通过较大的BAR曝光。

您的问题是关于NIC的,因此,您的示例中的一个BAR确实是NIC寄存器所在的基本HW地址。 e1000驱动程序可以在PCI资源分配步骤中查询地址(这是一个长篇大论,但总而言之,一个合适的地址位于hw_addr field struct e1000_hw })。并且,在其操作期间,e1000可以从一些寄存器读取或使用所提到的地址+一些偏移量写入它们。您可以找到corresponding header中定义的不同寄存器的偏移量。例如,当驱动程序需要管理Tx响铃时,它可以使用适当的registers查询/更新其头部或尾部。例如,您可以查看驱动程序writes zeroes的位置。

您还询问了Rx和Tx缓冲区的位置。您是否指 data 缓冲区并不十分清楚。如果是这样,我担心lspci可能没有帮助,因为实际使用主机内存缓冲区和DMA(直接内存访问)技术接收和传输数据包数据。例如,如果驱动程序想要传输数据包,它将获取存储数据包的缓冲区的物理地址(主机存储器),并通过setting the packet buffer address准备所谓的描述符。它。然后将描述符推送到设备。一旦NIC获得描述符,它将启动DMA事务,即它将直接在主机存储器上放置存储器访问请求,并最终读取要传输的缓冲区的内容。

所以,我希望你找到我的简短回答至少有点用处。当然,您可以从驱动程序源和一些与HW相关的文档中了解更多信息。