您的位置:首页 > 房产 > 家装 > 7k7k小游戏网页_北京网站设计济南兴田德润评价_品牌建设的五个要素_微信营销推广方案

7k7k小游戏网页_北京网站设计济南兴田德润评价_品牌建设的五个要素_微信营销推广方案

2025/5/4 15:38:30 来源:https://blog.csdn.net/ljl1704/article/details/147288498  浏览:    关键词:7k7k小游戏网页_北京网站设计济南兴田德润评价_品牌建设的五个要素_微信营销推广方案
7k7k小游戏网页_北京网站设计济南兴田德润评价_品牌建设的五个要素_微信营销推广方案

1. PCIe 网卡的基本访问方式

PCIe 设备通过 配置空间(Configuration Space) 和 内存映射寄存器(MMIO) 与主机通信,而非直接使用 io_addr/io_data 这样的分立寄存器。
关键区别:

特性DM9000(传统设备)PCIe 网卡
寄存器访问方式分立 io_addr/io_data统一的内存映射(MMIO)
地址分配固定或平台指定PCIe 配置空间动态分配
数据传输通过 io_data 读写缓冲区DMA 或 MMIO 缓冲区

2. PCIe 网卡的核心寄存器区域

(1)PCI 配置空间(Configuration Space)
  • 作用:存放设备的基本信息(厂商ID、设备ID),并分配 MMIO 或 I/O 空间地址。

  • 大小:标准 256 字节,扩展(PCIe)可达 4KB。

  • 关键寄存器

    • BAR(Base Address Register):指定 MMIO 或 I/O 空间的基地址。

      // Linux 内核中获取 BAR0 的 MMIO 地址
      void __iomem *regs = pci_iomap(pdev, BAR0, pci_resource_len(pdev, BAR0));
    • Command Register:启用设备的中断、DMA 等功能。

(2)内存映射寄存器(MMIO)
  • 作用:替代 DM9000 的 io_addr/io_data,通过直接读写内存地址控制网卡。

  • 访问方式

    // 写入寄存器
    iowrite32(value, regs + REG_CTRL);// 读取寄存器
    u32 val = ioread32(regs + REG_STATUS);
  • 典型寄存器

    • 控制寄存器(CTRL):启动/停止网卡。

    • 状态寄存器(STATUS):查询链路状态、中断标志。

    • MAC 地址寄存器:配置 MAC 地址。

    • DMA 描述符寄存器:管理数据缓冲区。


3. 数据传输机制

PCIe 网卡通常使用 DMA(直接内存访问) 传输数据,而非像 DM9000 那样通过 io_data 逐字节读写:

  1. 发送数据

    • 驱动将数据包存入内存中的 发送描述符环(TX Descriptor Ring)

    • 更新 DMA 描述符寄存器,通知网卡读取内存中的数据。

    • 网卡通过 DMA 将数据发送到网络。

  2. 接收数据

    • 驱动预分配内存中的 接收描述符环(RX Descriptor Ring)

    • 网卡通过 DMA 将收到的数据写入内存,触发中断通知驱动。

           +-------------------+       +-------------------+|   TX Descriptor   | ----> |    Packet Data    ||        Ring       |       |    (in Memory)    |+-------------------+       +-------------------+^                           ||                           v+-------+                  +--------+|  DMA  |                  |  PCIe  || Engine|                  |  NIC   |+-------+                  +--------+^                           ||                           v+-------------------+       +-------------------+|   RX Descriptor   | <---- |    Packet Data    ||        Ring       |       |    (from Wire)    |+-------------------+       +-------------------+

4. 对比 DM9000 与 PCIe 网卡

功能DM9000PCIe 网卡
寄存器访问通过 io_addr/io_data直接 MMIO 读写
地址分配静态(平台指定)动态(PCIe 配置空间分配 BAR)
数据传输通过 io_data 逐字节读写DMA 批量传输
性能较低(受 PIO 限制)高(DMA + 并行 PCIe 带宽)

5. 驱动代码示例(PCIe 网卡)

以 Linux 内核中的 igb 驱动(Intel I350 网卡)为例:

// 1. 映射 MMIO 寄存器
void __iomem *hw_addr = pci_iomap(pdev, BAR0, 0);// 2. 写入控制寄存器(启动网卡)
iowrite32(IGB_CTRL_START, hw_addr + IGB_REG_CTRL);// 3. 配置 DMA 描述符环
struct dma_desc *tx_ring = dma_alloc_coherent(&pdev->dev, size, &dma_handle, GFP_KERNEL);
iowrite32(dma_handle, hw_addr + IGB_REG_TX_DESC);// 4. 收到数据时(中断处理)
u32 status = ioread32(hw_addr + IGB_REG_ISR);
if (status & IGB_INT_RX) {// 从 RX 描述符环读取数据skb = build_skb(rx_ring[next_rx].data);
}

6. 关键点总结

  1. PCIe 网卡没有分立 io_addr/io_data,而是通过 MMIO 寄存器 和 DMA 实现高效通信。

  2. BAR 寄存器 是核心,它决定了 MMIO 或 I/O 空间的基地址。

  3. DMA 描述符环 是数据传输的关键,驱动与网卡通过内存中的描述符交互。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com