0

我正在通过 realtek r8169 驱动程序,但有点卡在这条线上

    tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
                     &tp->RxPhyAddr, GFP_KERNEL);

从书Linux设备驱动程序中,它只是说它是...Function handles both the allocation and the mapping of the buffer, ...arguments are device structure and the size of buffer needed

这是什么意思:分配我可以理解,但它是什么意思mapping

这是否意味着我在 pdev 中拥有的东西代表了设备的 rx 描述符,我将在从dma_alloc_coherent哪个tp->RxDescArray描述符作为软件对象的返回中拥有相同的东西?tp->RxDescArray 是RxDesc驱动程序中的类型,如下所示

    struct RxDesc {
        __le32 opts1;
        __le32 opts2;
        __le64 addr;
     };

如果这就是映射:意味着我在 pdev 中表示的物理设备上的设备 rx 描述符与我在软件对象中的相同tp->RxDescArray就是映射的含义。那么谁定义的结构RxDesc,这是否包含在数据表中。如果是,那么在哪个部分?数据表中有许多部分。应该更清楚吗`

更新 也想知道这条线是做什么的

  tp->RxDescArray[NUM_RX_DESC - 1].opts1 |= cpu_to_le32(RingEnd);

tp->RxDescArray 是 RxDesc 类型(不是 RxDesc 数组)此语句是否标记了end变量 RxDescArray 意味着接下来会发生什么将在该end地址之后

更新 2

我需要有关是否有数据表的信息,例如来自 intel E1000E 驱动程序或来自 RealTek 的 r8169 驱动程序,然后我如何创建创建 Rx Descrptor 结构,在上面的代码中它执行类似这样的操作

    struct RxDesc {
    __le32 opts1;
    __le32 opts2;
    __le64 addr;
     }

什么是 opts1、opts2 和 addr?该驱动程序的作者是如何产生创建此结构的想法的。只有他有很多十六进制值的数据表

4

2 回答 2

3

DMA 访问由 IOMMU 进行转换,在英特尔® 定向 I/O 虚拟化技术 (VT-d) 规范中描述了英特尔系统上的 IOMMU 。

函数 dma_alloc_coherent 分配内存并将映射引入 DMA 页表,以便设备可以访问内存。返回的地址不是内存的虚拟或物理地址,而是设备可以用来访问内存的 I/O 虚拟地址 (IOVA)。IOVA 在设备执行 DMA 时由 IOMMU 转换为物理内存地址。

IOMMU 阻止任何设备访问尚未映射到该特定设备的 I/O 地址空间的物理内存。

于 2021-02-14T02:28:21.780 回答
0

RingEnd 标记 NIC 的环形缓冲区的结束。这样 NIC DMA 引擎就知道从哪里跳转到环形缓冲区的开始处。

于 2021-02-07T11:19:13.330 回答