Linux内核设备驱动程序中的分散 - 收集列表

时间:2013-09-30 03:14:18

标签: c linux kernel dma

我正在开发一个可以访问分散 - 收集列表(sg)元素的设备驱动程序。我可以从中提取数据并使用sg_copy_to_buffer将其存储在已分配的缓冲区中。 现在,我的想法是创建一个新的分散列表,并从这个缓冲区复制到我创建的新分散列表中(当然这是后来完成的)并将这个新的分散列表返回给内核。 (这是针对性能指标等) 我尝试在线搜索文档以使用分散列表等,但无济于事。 我通常在做什么:

char *buffer = kmalloc (***);
struct scatterlist *sglist = kmalloc (sizeof (struct scatterlist)...);
sg_init_one(sglist, buffer, BUFFER_SIZE);

sg_copy_to_buffer (inp_sglist, inp_sglist_len, buffer);

*** Later ***
sg_copy_from_buffer (sglist, 1, buffer);

是否有良好的文档可以帮助我将散点列表映射到虚拟缓冲区? 我试着看http://lwn.net/Articles/256368/ http://www.linuxjournal.com/article/7104

任何帮助或指示都将不胜感激!

1 个答案:

答案 0 :(得分:1)

通常,用户在其虚拟内存中分配缓冲区,然后调用设备驱动程序。 当用户发出写入时,您将获得具有写入数据的缓冲区的sglist,并在sg_copy_to_buffer()中使用它。 当用户发出读取时,您将获得读取数据缓冲区的sglist,并在sg_copy_from_buffer()中使用它。

本文描述了从I / O请求获取sglist的调用。这是一篇很好的文章,但差不多10岁。许多x86系统现在都有一个IOMMU来支持硬件虚拟化。

通常,设备驱动程序使用sglist生成设备I / O操作列表,一个用于sglist条目中每个不相交的数据块,而不是将数据复制到本地缓冲区。