gpt4 book ai didi

c - "scatterlist"在 Linux 中如何工作?

转载 作者:太空狗 更新时间:2023-10-29 16:11:52 25 4
gpt4 key购买 nike

正如我们所知,分散列表收集物理上分散在内存中的内存,但实际上是连续的。与 DMA 通信时,它会向 DMA 提供内存的抽象 View ,因为内存在物理上是连续的。

scatterlist 如何处理这个问题?它是一种在 scatterlist 中维护的链表吗?

例如,如果有 4000 字节的数据要使用 DMA 传输,因为数据在物理上是连续的,分散列表如何使它连续? scatterlist 实现是否会使用 Kmalloc 分配 4000 字节的数据以确保它获得物理上连续的内存?还是会创建一个链表?

注意:这里我查询的不是SG表,而是单个散点表

假设我们要保存 4000 字节的物理不连续内存的数据

struct scatterlist sg,
sg_init_one(&sg,data,4000)

现在这个 sg 如何解决这个问题?

最佳答案

您似乎混合了两个不同的散点列表,即 Linux 内核中的 struct scatterlist 和特定 DMA Controller 可能支持的散点列表。在这两种情况下,它们都不连续。这类似于第一种情况下的数组和第二种情况下的链表。当您调用 dmaengine_prep_slave_sg() 时,实际的 DMA 驱动程序将其转换为内部结构,该结构可能是 SG 列表的副本,一个适合最大 DMA 长度边界的新 SG 列表,DMA hw 链接列表等。根据 DMA 驱动程序(让我们考虑最近添加的 drivers/dma/hsu/hsu.c),初始 SG 列表被复制并以最多 4 个 DMA 硬件描述符的 block 形式提供给硬件,在完成之后如果项目的初始数量超过 4,每个 block 都会中断并继续,直到发送/接收所有内容。

关于c - "scatterlist"在 Linux 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com