首页 > 其他分享 >DMA属性 【ChatGPT】

DMA属性 【ChatGPT】

时间:2023-12-09 16:58:14浏览次数:49  
标签:DMA ATTR 映射 dma 缓冲区 ChatGPT 属性

DMA属性

本文档描述了在linux/dma-mapping.h中定义的DMA属性的语义。

DMA_ATTR_WEAK_ORDERING

DMA_ATTR_WEAK_ORDERING指定了对映射的读写可能是弱有序的,也就是说读和写可能会相互交错。

由于平台可以选择性地实现DMA_ATTR_WEAK_ORDERING,那些没有实现的平台将简单地忽略该属性并表现出默认行为。

DMA_ATTR_WRITE_COMBINE

DMA_ATTR_WRITE_COMBINE指定了对映射的写入可能会被缓冲以提高性能。

由于平台可以选择性地实现DMA_ATTR_WRITE_COMBINE,那些没有实现的平台将简单地忽略该属性并表现出默认行为。

DMA_ATTR_NO_KERNEL_MAPPING

DMA_ATTR_NO_KERNEL_MAPPING允许平台避免为分配的缓冲区创建内核虚拟映射。在某些架构上,创建这样的映射是一项非平凡的任务,并且消耗非常有限的资源(如内核虚拟地址空间或DMA一致地址空间)。使用此属性分配的缓冲区只能通过调用dma_mmap_attrs()传递到用户空间。通过使用此API,您保证不会对dma_alloc_attr()返回的指针进行解引用。您可以将其视为必须传递给dma_mmap_attrs()和dma_free_attrs()的cookie。确保每次调用这两个函数时也设置该属性。

由于平台可以选择性地实现DMA_ATTR_NO_KERNEL_MAPPING,那些没有实现的平台将简单地忽略该属性并表现出默认行为。

DMA_ATTR_SKIP_CPU_SYNC

默认情况下,dma_map_{single,page,sg}函数族将给定的缓冲区从CPU域传输到设备域。一些高级用例可能需要在多个设备之间共享缓冲区。这需要为每个设备单独创建映射,并且通常通过多次调用dma_map_{single,page,sg}函数来执行,每次传递给参与缓冲区共享的每个设备的设备指针。第一次调用将缓冲区从“CPU”域传输到“设备”域,这会同步给定区域的CPU缓存(通常意味着缓存已被刷新或根据DMA方向无效化)。然而,对于其他设备的dma_map_{single,page,sg}()的后续调用将在CPU缓存上执行完全相同的同步操作。CPU缓存同步可能是一个耗时的操作,特别是如果缓冲区很大,因此强烈建议尽可能避免。DMA_ATTR_SKIP_CPU_SYNC允许平台代码跳过对给定缓冲区的CPU缓存同步,假设它已经被传输到“设备”域。此属性也可用于dma_unmap_{single,page,sg}函数族,以在释放其映射后强制缓冲区保留在设备域中。谨慎使用此属性!

DMA_ATTR_FORCE_CONTIGUOUS

默认情况下,DMA映射子系统允许从dma_alloc_attrs()函数分配的缓冲区由单独的页面组装而成,如果可以将其作为连续块映射到设备DMA地址空间。通过指定此属性,分配的缓冲区将被强制在物理内存中也是连续的。

DMA_ATTR_ALLOC_SINGLE_PAGES

这是对DMA映射子系统的一种提示,表明尝试以提供更好的TLB效率的方式分配内存可能不值得(也就是说,尝试使用较大的页面构建映射可能不值得)。如果:

  • 您知道对该内存的访问不会导致TLB失效。您可能知道访问可能是顺序的,或者它们不是顺序的,但不太可能在不同物理页面上来回跳转。
  • 您知道访问内存时TLB缺失的惩罚很小,可以忽略不计。如果您正在进行解密或解压等大量操作,这可能是适用的情况。
  • 您知道DMA映射是相当短暂的。如果您预期映射的寿命很短,那么优化分配(避免使用大页面)可能是值得的,而不是获得较大页面的轻微性能优势。

设置此提示并不保证您不会获得大页面,但意味着我们不会那么努力地去获取它们。

注意
目前DMA_ATTR_ALLOC_SINGLE_PAGES仅在ARM上实现,尽管ARM64的补丁可能很快会发布。

DMA_ATTR_NO_WARN

这告诉DMA映射子系统抑制分配失败报告(类似于__GFP_NOWARN)。

在某些架构上,分配失败会通过错误消息报告到系统日志中。尽管这有助于识别和调试问题,但处理失败的驱动程序(例如,稍后重试)对此没有问题,并且实际上可能会用并非任何问题的错误消息淹没系统日志,这取决于重试机制的实现。

因此,这为驱动程序提供了一种在分配失败不是问题的调用上避免这些错误消息,并且不应该打扰日志的方法。

注意
目前DMA_ATTR_NO_WARN仅在PowerPC上实现。

DMA_ATTR_PRIVILEGED

一些高级外围设备,如远程处理器和GPU,在特权“监管员”和非特权“用户”模式下对DMA缓冲区执行访问。此属性用于指示DMA映射子系统缓冲区在提升的特权级别下是完全可访问的(理想情况下在较低特权级别下是不可访问的,或者至少是只读的)。

标签:DMA,ATTR,映射,dma,缓冲区,ChatGPT,属性
From: https://www.cnblogs.com/pengdonglin137/p/17891159.html

相关文章

  • DMA与ISA和LPC设备 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-isa-lpc.htmlDMA与ISA和LPC设备作者[email protected]本文档描述了如何使用旧的ISADMA控制器进行DMA传输。尽管ISA在今天已经基本淘汰,但LPC总线使用相同的DMA系统,因此它将在相当长的时间内存在。头文件和......
  • genalloc/genpool 子系统 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/genalloc.htmlgenalloc/genpool子系统内核中有许多内存分配子系统,每个子系统都针对特定的需求。然而,有时内核开发人员需要为特定范围的特定用途内存实现新的分配器;通常这些内存位于设备的某个位置。该设备的驱动程序的作者当......
  • 引导时内存管理 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/boot-time-mm.html#c.memblock_flags"Boottimememorymanagement"(引导时间内存管理)早期系统初始化不能简单地使用“正常”的内存管理,因为它还没有设置。但是仍然需要为各种数据结构分配内存,例如物理页面分配器。一种名为mem......
  • 动态DMA映射使用通用设备 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-api.html动态DMA映射使用通用设备作者[email protected]本文档描述了DMAAPI。要了解API的更详细介绍(以及实际示例),请参阅动态DMA映射指南。该API分为两部分。第一部分描述了......
  • 内存管理文档 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/index.html内存管理指南这是关于Linux内存管理子系统的指南。如果您只是想了解如何分配内存,请参阅内存分配指南。有关控制和调整指南,请参阅管理员指南。物理内存页表进程地址引导内存页分配虚拟连续内存分配Slab分配高内存......
  • 内存分配指南 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/memory-allocation.html内存分配指南Linux提供了各种用于内存分配的API。您可以使用kmalloc或kmem_cache_alloc系列来分配小块内存,使用vmalloc及其衍生物来分配大的虚拟连续区域,或者直接使用alloc_pages从页面分配器请求页面。......
  • 核心API文档 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/index.html#memory-management核心API文档这是核心内核API手册的开头部分。非常感谢您进行文档的转换和编写!核心实用程序本节包含一般和“核心核心”文档。首先是一大堆来自docbook时代的kerneldoc信息,实际上应该在有人有精......
  • 写入内核文档注释 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/doc-guide/kernel-doc.html写入内核文档注释Linux内核源文件中可能包含内核文档格式的结构化文档注释,用于描述代码的函数、类型和设计。将文档嵌入到源文件中可以更容易地保持文档的最新状态。注意内核文档格式与javadoc、gtk-doc或D......
  • Unreliable Guide To Locking 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/kernel-hacking/locking.htmlRusty'sRemarkablyUnreliableGuidetoKernelLocking作者RustyRussell简介欢迎阅读Rusty'sRemarkablyUnreliableGuidetoKernelLockingissues。本文档描述了LinuxKernel2.6中的锁定系统......
  • 关于键盘导航顺序和 tabindex 属性的关联关系
    "tabindex"属性是HTML元素中的一个属性,用于定义元素在通过键盘导航时的顺序。该属性接受一个整数值,通常为正整数,用于指定元素的tab键顺序。但是,当"tabindex"属性的值为-1时,它有特殊的含义。当"tabindex"的值为-1时,它表示该元素虽然可以通过JavaScript聚焦,但在通过按下Tab键进行导......