“scatterlist”如何在linux中运行?

时间:2015-03-26 03:09:09

标签: c linux-kernel linux-device-driver embedded-linux dma

正如我们所知,分散列表收集了内存中分散的内存,但实际上是连续的。当与DMA通信时,它为DMA提供了一个抽象的内存视图,因为这是物理上连续的内存。

scatterlist如何处理这个问题?它是一种在scatterlist内保持的链表吗?

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

注意:这里我的查询不是关于SG表,而是关于单个分散列表

让我们说我们想要保存4000字节物理上不连续的内存

的数据
struct scatterlist sg,
sg_init_one(&sg,data,4000)

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

1 个答案:

答案 0 :(得分:5)

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

相关问题