4

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

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 等。

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

4

1 回答 1

2

通常,用户在他们的虚拟内存中分配一个缓冲区,然后调用设备驱动程序。当用户发出写操作时,您会获得包含写数据的缓冲区的 sglist,并在 sg_copy_to_buffer() 中使用它。当用户发出读取指令时,您将获得读取数据缓冲区的 sglist 并在 sg_copy_from_buffer() 中使用它。

文章中描述了从 I/O 请求中获取 sglist 的调用。这是一篇很好的文章,但已经有将近 10 年的历史了。许多 x86 系统现在都有 IOMMU 来支持硬件虚拟化。

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

于 2013-10-02T01:09:51.597 回答