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

标签 c linux kernel dma

我正在开发一个可以访问分散-聚集列表 (sg) 元素的设备驱动程序。我能够从中提取数据并使用 sg_copy_to_buffer 将其存储在分配的缓冲区中。 现在,我的想法是创建一个新的散点列表并从这个缓冲区复制到我创建的新散点列表中(当然这是稍后完成的)并将这个新的散点列表返回给内核。 (这用于性能指标等) 我尝试在网上搜索文档以使用 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 等等

如有任何帮助或指点,我们将不胜感激!

最佳答案

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

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

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

关于c - Linux 内核设备驱动程序中的分散聚集列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085935/

相关文章:

c - 链表节点的大小

python 版本与 .bash_profile 中设置的不同

linux - 在 GNU/Linux 中,如何将 mingw-w64 与 SCons 结合使用来生成 64 位 Windows 可执行文件?

linux - 在新的 linux 内核中上下文切换要慢得多

kernel - 向 user_struct 添加另一个字段

linux - 如何在不重命名传递给 insmod 的 .ko 的情况下重命名内核模块名称?

c - 读取 C 中的行并转换为 float

c - 如何仅使用标准库分配对齐的内存?

C 中 long double 的转换说明符

linux - 使用 xdg-open 别名打开是否安全