LWN 翻译:DMA-BUF cache handling: Off the DMA API map (part 2)

Linux 4.6亮点特性 源于https://kernelnewbies.org/Linux_4.6 1.USB3.1 SuperSpeedPlus(10Gbps)支持 USB 3.1新增SuperSpeedPlus协议,支持高达10Gbps的速度。使用SuperSpeedPlus协议的USB 3.1设备称为USB 3.1 Gen2设备。 2.提高OOM kill任务时的可靠性 在以前的版本,OOM keller(... 阅读详情

声明:本文非原创,只是翻译!
原文:https://lwn.net/Articles/822521/
作者:John Stultz ( Linaro 成员,kernel timekeeping maintainer)
备注:本文需要有 DMA-BUF 的背景知识,如果你还不了解 DMA-BUF,建议先阅读译者本人的《dma-buf 由浅入深》系列 第三章 “map attachment” 和 第六章 “begin / end cpu_access”。

在上一篇文章中,我介绍了一些关于 ION、DMA-BUF Heap、DMA API 的背景知识,以及 CPU Cache “所有权”的基本概念,最后站在传统 DMA API 的角度来描述 DMA-BUF 是如何处理 cache 同步问题的。文章最后还讨论了为什么传统的 DMA API 在现代移动平台上性能会这么差。本文将和大家一起讨论如何让 DMA-BUF exporter 避免不必要的 cache 操作,并就如何改进这些方法提出了一些大致的建议。

站在 DMA API 的角度来看:通过调用 dma_buf_map_attachment(),DMA-BUF 的所有权就转移到了 DMA 设备,通过调用 dma_buf_unmap_attachment() 又将所有权交还给 CPU,而每次调用这两个函数都会执行 cache 相关的操作。虽然这样的一个顺序操作能够确保 CPU Cache 处理的正确性,但是对于涉及多个 DMA 设备的 buffer pipeline 操作,CPU 实际上根本没有参与过对这些 buffer 的访问,而每次的 cache map 和 unmap 操作加起来则可能会导致明显的性能问题。

谁拥有 buffer ?

为了避免这些多余的 cache 操作,DMA-BUF 接口允许将 DMA API 的某些规则颠倒过来。需要注意的是,DMA API 假设 CPU 是所有 memory 的天然拥有者,且只有在 DMA 传输过程中(buffer 的所有权已明确转移给了 DMA 设备),才需要考虑这一反向规则。DMA-BUF 接口要求 CPU 在访问 DMA-BUF 之前需要先调用 dma_buf_begin_cpu_access(),在访问结束后调用 dma_buf_end_cpu_access()。如果 CPU 想从用户空间访问该 buffer,则可以使用 DMA_BUF_IOCTL_SYNC ioctl() 命令来发起 begin/end cpu_access 的调用。

特殊接口:

  • dma_buf_begin_cpu_access()
    通过该接口,exporter 驱动可以确保当前 buffer 只允许被 CPU 访问,这个过程中可能需要 allocate 或 swap-in 以及 pin(固定)后端存储。另外,exporter 驱动还需要确保 CPU 访问的方向与它所请求的方向是一致的。

  • dma_buf_end_cpu_access()
    该接口在 importer 完成 CPU Access 时调用,exporter 可以在该接口中实现 cache flush 操作,并 unpin 之前在 dma_buf_begin_cpu_access() 中 pin 过的内存资源。

以上接口在使用时,我们可以认为 DMA-BUF memory 默认情况下是属于 DMA 设备的,而不是 CPU。因此,需要在这些接口中完成 CPU Cache 的同步操作,以确保 CPU 拿到的数据是和 DMA-BUF 中一致的。同时,该方法还能避免那些仅在多个设备之间传递、映射和访问 DMA-BUF 时,所造成的高昂的 cache 同步操作。

然而,这种与 DMA API 不一致的调用规则可能会带来一些困扰,而且并不是所有 DMA-BUF exporter 驱动都采用相同的实现策略。某些 exporter 驱动打算仍然遵循 DMA API 调用规则,在每次执行 map 和 unmap 操作时都对 CPU cache 做 flush 和 invalidate 动作;另一些 exporter 驱动则可能只会在它们的 begin 和 end 回调接口中才进行 cache 同步操作,而还有的 exporter 驱动则可能这两种方案都实现。

虽然 DMA BUF 设计出来的目的是为了在用户空间和多个 DMA 设备之间共享内存,但是最先导出 DMA-BUF 的 exporter 往往是一个比较特殊的驱动程序,它拥有厂商定制化的、驱动强相关的 buffer allocation 代码。例如,一个 GPU 驱动程序,它分配了一个 buffer,然后对它进行渲染操作,并返回一个 handle 给用户空间。随后,用户空间应用程序可以将该 buffer 和其他 buffer 一起再送回给 GPU,以便将 web 浏览器窗口与桌面的其他窗口进行合成。DMA-BUF 提供了一种更通用的 handle 类型,因此即使该 buffer 不用于多设备共享,它的 handle 一样可以使用。

但是,要知道 buffer 只有在 CPU 和 DMA 设备之间共享时才需要考虑 cache 同步操作,因此 DMA-BUF exporter 可以针对仅在多设备之间共享 buffer 的情况做一些 cache 的优化处理。例如,一些 DMA-BUF exporter 驱动在第一次执行 DMA mapping 操作时,先将 scatter-gather table 保存下来,只要后续的 dma_buf_map_attachment() 调用都是在同一 DMA 方向上执行的,那么就继续使用这些 table。这样,我们就能避免每次在调用 dma_buf_map_attachment() 和 dma_buf_unmap_attachment() 时所伴随的高昂的 cache 操作,并最终在 dma_buf_detach() 中释放之前的 DMA mapping 资源。这些优化之所以能起作用,是因为 exporter 被绑定到了 DMA 设备上,所以 buffer 其实并没有真正被共享,或者说共享 buffer 的 DMA 设备之间都是 Cache 一致的,所以也就没必要维护 cache 的操作了。

译者注:上面这段实在不好翻译,尤其是下面黑体字部分,实在不好理解,故将原文贴出来,希望能有高人纠正错误,以免误人子弟。


But, knowing that the buffer was shared between just the CPU and the device, the DMA-BUF exporter could optimize some of the cache operations. For instance, some DMA-BUF exporters cache the scatter/gather table resulting from the first DMA mapping operation and, as long as the dma_buf_map_attachment() calls are done in the same direction, reuse that table. In this way, they can avoid expensive cache operations on each dma_buf_map_attachment() and dma_buf_unmap_attachment() call, finally releasing the mapping in dma_buf_detach(). These optimizations work because the exporters are tied to the device, so the buffers aren’t really being shared, or the devices the buffers are shared with are cache coherent, so the cache maintenance is unnecessary.

  1. 第一句话明明说的是 buffer 在 CPU 和 device 之间共享,那这种情况肯定是每次都要进行 cache 操作的,怎么优化?

  2. 第二句话为什么说 exporter 是被绑定到了 device 上的?为什么说 buffer 并不是真正被共享的?多个 DMA 设备之间共享 buffer 就不叫共享了?

Linux News搬运工的浅见:

  关于小龙兄上面提问,我的理解是:

  1. 这里举的特殊例子是类似IOMMU table,这部分其实完全独立于buffer内容改变,不需要每次clean/invalidate。不知道原作者是不是这个意思。

  2. 仍以iommu table为例,此刻它是只有这一个device在用的,不会同时被其他HW IP或CPU使用。此外如果多个device之间的buffer能由硬件做到cache coherent,也不需要再刷cache。

这种方法虽然有效,但是它导致了 upstream 版本中,十几个 DMA-BUF exporter 驱动却有着各自不同的 cache 处理方式和调用规则。因此,当我们开始研究如何实现一个通用的 DMA-BUF exporter 框架,以便从某种性能的角度来支持 multi-device pipeline 时,却始终没能找到一个明确的实现方案。

处理具有多种映射关系的 buffer 所有权问题

虽然 DMA API 为如何使用 map 和 unmap 调用(来指定 buffer 所有权)提供了良好的说明文档,但要想在移动平台上获得优异的性能,通常需要多个 DMA 设备和 CPU 同时建立起对 buffer 的有效映射,这使得 buffer 所有权的概念变得更加微妙。例如,在图形系统中,通常由 GPU 和 Display 同时映射到同一块 buffer 上。为此,系统必须在这一帧绘制完成之前就建立起多个设备之间的 framebuffer 共享映射关系。这样 GPU 可以直接往该 buffer 写入数据,然后在写入完成后向 display 驱动发送信号,接着 display 驱动就可以立即显示该 buffer 了。

针对于这种特定的应用场景,DMA-BUF 添加了基于 explicit fence 架构的 dma-fence,为驱动程序(或用户空间)提供了一套等待 buffer fence 的机制。最终会有另外一个驱动对该 fence 进行 signal,从而启动 buffer 所有权的切换工作。但是,要支持这种并行的映射关系就需要小心翼翼的处理 cache 同步问题,通常这由驱动程序调用 DMA API 同步接口来实现。当某个开发人员在一个集成设备上使用厂商定制的 kernel 进行开发时,他可能知道某个 buffer 具体来自哪个驱动,又将被传递给谁,从而能够添加最合适的、正确的 cache 处理代码。但是一旦超出他的可控范围,情况就会变得相当复杂。

所以我们这里看到有两种不同的 所有权跟踪 处理方式。隐式处理(Implicit handling)意味着 DMA-BUF 的所有权是在 dma map 或 unmap 的时候发生切换的,而 显式处理(Explicit handling)是指 buffer 已经映射到两个或多个设备上了,它的所有权则是通过 DMA-BUF fence 来完成有效切换的。

DMA-BUF exporter 通常在传递 buffer 所有权时处理 cache 相关操作。它们可以在调用 dma_buf_map_attachment() 和 dma_buf_unmap_attachment() 的隐式上下文中执行此操作,或者也可以在 dma_buf_begin_cpu_access() 和dma_buf_end_cpu_access() 调用中执行。然而,在显式处理情况下,DMA-BUF exporter 没有 DMA-BUF fence 信号的回调接口,因此 exporter 无法对所有权的切换进行任何 cache 管理操作,这就造成了一种困境。在这种情况下,buffer cache 管理的职责被分摊到了 DMA-BUF exporter 和使用该 buffer 的驱动程序身上。要正确执行此操作,每个驱动程序都必须了解其在 buffer pipeline 中的位置,进而了解其下游设备的 cache 一致性。

更麻烦的是,即使 DMA-BUF exporter 确实有 dma-fence signal 的回调接口,它也无法知道当前使用的是哪种所有权跟踪方式。假设显式处理模式下默认为 CPU 所有权,我们就在 map 和 unmap 函数中执行 cache 操作?或者隐式处理模式下默认为设备所有权,我们于是在 dma_buf_begin_cpu_access() 和* dma_buf_end_cpu_access()* 中进行 cache 操作?又或者驱动程序通过执行 explicit fence signal 来切换所有权的时候,我们是否避免了额外的 cache 开销?这些选择可能会给我们留下一个要么使用太慢,要么可能与某些驱动程序不兼容的实现方案,这完全违背了 DMA BUF 作为通用交换机制的初衷。

因此对于试图编写 DMA-BUF exporter 驱动的开发人员来说,这一切开始让人觉得像是在 Rusty Russell 经典 API 等级 中的10级(“阅读文档,你会弄错”)或11级(“遵循常规,你会弄错”),尤其是在你关心性能的情况下。这给在 vendor 厂商之间共享通用 DMA-BUF Heap 的目标带来了巨大障碍。

可行的解决方案

我觉得我们可以改善这种情况,并且我有一些想法可以拿出来和大家一起讨论。由于 DMA-BUF 接口已经偏离了 DMA API,我认为我们应该为 DMA-BUF 的使用方法建立一些明确的规范,并形成良好的开发文档,这样 DMA-BUF exporter 作者和 DMA-BUF 使用者都能对该模型有一个统一的认识。我们应该重点朝着下面这几个方向努力:

  • 在 DMA API 隐式的 map/unmap 函数之外,为 DMA-BUF 对象创建一个正式的所有权。

  • 提供一套跟踪所有权的调用机制,这些接口可以添加到 dma buf_ops 结构体中,这样 exporter 驱动就可以知道这些所有权的状态变化。

  • 不赞成使用隐式处理模式,应该让驱动程序使用以上新的机制来标记显式处理模式下的所有权切换。

  • 为 DMA-BUF 添加一些状态跟踪的接口,这样我们就可以知道它们的 cache 状态,并且只有在所有权发生切换时才执行相应的 cache 操作,因此那些状态跟踪接口就变得尤为重要了。

以上大部分内容可以通过形成文档以及加强当前的 DMA-BUF exporter 调用机制来实现。dma_buf_begin_cpu_access() 和 dma_buf_end_cpu_access() 调用足以处理 device-to-CPU 和 CPU-to-device 的转换。但我们需要明确定义这些函数的正确使用规范,并始终应该由 DMA-BUF exporter 驱动来实现,从而让 buffer 默认为 device-owned 的概念正规化。这样就可以放心地实现 pre-flushed buffer 并跳过不必要的 cache 操作。

但是,这种方法有一个缺点,对于 CPU 需要多次访问 buffer 的情况(中间不涉及到 device 的参与),每次调用都会有不必要的 cache flush 操作。此外,还有一个问题是,对于既有 CPU-coherent 设备、又有 non-coherent 设备参与的混合系统而言,在这些设备之间切换所有权时,我们可能需要进行 CPU-cache 同步操作。对于这两种情况,使用 device-usage 函数调用和状态跟踪接口也许会有所帮助,这样就可以决定是否要做所有权的切换了(而不仅仅只是使用)。

这种 所有权 的概念还需要考虑将来的 partial cache flush 操作,以便允许 CPU 和 DMA 设备同时对同一块 buffer 进行访问。这样的话,buffer 所有权(以及相关的 cache 操作)将在单个 cache line 的粒度上进行管理,而不是在整个 buffer 的层面上管理,这看起来更像是文件操作上的协同锁(advisory range locks)。

不可否认,DMA-BUF Heap(以及之前的 ION)在某些情况下,用户空间会比内核空间更了解 buffer 的用途。因此,让用户空间来为某个 pipeline 选择 buffer 分配类型是最为合适的。DMA-BUF 设计理念为我们提供了非常实用的灵活性,它允许将 buffer 的规则和策略留给 exporter 驱动去实现,因此我并不想消除这些灵活性。但是我又确实认为,随着 vendor 厂商开始他们的 ION 迁移工作,能有一个明确的、既定的规范,不至于让大家掉到坑里才是更加重要的事情,这样可以避免出现一批不必要的、不兼容的 heap 和使用者。希望本文能抛砖引玉,引起大家进一步的讨论。

鸣谢

非常感谢 Rob Clark、Robert Foss、Sumit Semwal、Azam Sadiq Pasha kapatral Syed、Daniel Vetter 和 Linus Walleij 对于这两篇文章的前期评审和反馈意见!

上一篇:《LWN 翻译:DMA-BUF cache handling: Off the DMA API map (part 1)》

点击阅读原文,在我的 优快云 博客上浏览本文,体验更佳!

缓冲区共享和同步dma_buf 之二 可以使用作为一个sync_file的dma-buf 文件描述符, 执行 DMA_BUF_IOCTL_EXPORT_SYNC_FILE,以获得当前围栏集。在访问映射之前,客户端必须使用 DMA_BUF_SYNC_START 和适当的读/写标志调用 DMA_BUF_IOCTL_SYNC。为实现与其他 dma-buf 使用者的隐式同步,用户空间可以执行 DMA_BUF_IOCTL_IMPORT_SYNC_FILE 将sync_file 插入到 dma-buf 中。将sync_file插入到dma-buf中。 阅读详情

相关推荐

ION to SMMU

ION DMA-BUF IOMMU

relax33的博客 1576

linux内存管理机制--学习整理汇总 dma-buf(3)

linux 内存管理和使用 dma_buf

求变,从思想开始 5840

DMA缓冲区同步避坑指南:为什么你的ioctl(DMA_BUF_IOCTL_SYNC)总返回-EAGAIN?

本文深入解析了DMA缓冲区同步中ioctl(DMA_BUF_IOCTL_SYNC)返回-EAGAIN的常见问题,探讨了缓存一致性、dma-buf子系统架构及ARM Mali GPU实战案例。通过分析隐式围栏、IOMMU配置和并发访问冲突,提供了有效的解决方案和调试技巧,帮助开发者优化同步策略,规避常见陷阱。

n4o5p6q7r的博客 179

缓冲区共享和同步dma_buf 之一

dma-buf 子系统提供了用于跨多个设备驱动程序和子系统共享硬件 (DMA) 访问缓冲区以及同步异步硬件访问的框架。

IT_Beijing_BIT的博客 2527

使用逻辑分析仪处理IIC信号

逻辑分析仪

xc_123的博客 4485

VM与欧姆龙PLC通讯设置实战:Fins TCP/UDP协议详解

本文详细解析了VM(VisionMaster)与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战设置。内容涵盖网络配置、协议选择(TCP可靠性与UDP实时性)、VM端地址映射与数据点添加、以及数据接收解析流程,并提供了常见错误排查与高级调试技巧,帮助视觉与自动化工程师快速实现稳定可靠的工业通讯集成。

weixin_29172963的博客 327

LWN 翻译:DMA-BUF cache handling: Off the DMA API map (part 1)

kernel 中的 DMA API 都是用来在 CPU 和 device 之间共享 memory 的。近年来,传统的 DMA API 已经被运用到 ION、DMA-BUF 和 DMA-BUF Heap 这些接口中,但是在接下来的讲解中我们会看到,关于内存共享的效率问题,到现在都还没能被彻底解决掉。

hexiaolong2009的专栏 4597

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7476

dma-buf 由浅入深(六) —— begin / end cpu_access

本篇我们将一起来学习 dma-buf 用于 Cache 同步操作的 begin_cpu_access 和 end_cpu_access 这两个接口。之所以将这两个接口放在第六篇讲解,是因为它们在内核中的使用频率并不高,只有在特殊场景下才派的上用场。

hexiaolong2009的专栏 1万+

Anaconda离线创建python环境

既然是离线创建python环境,就需要有一个已经创建好的python环境。所以我们有两台win10的机器,分别是A和B。两台机器都安装了anaconda。其中A可以连网,因此我们在A上创建好一个python2.7的环境py27,然后将py27移植(安装)到B上。B连不连网都无所谓。 一、机器上A上创建python2.7的环境py27 有两种方法: 方法1:使用Anaconda的图形界面。首先,点击Environments->Create,然后输入要创建的环境名称"py27",然后选择2.7,如图

FY_2018的博客 6786

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么)

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 目录 Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 一、简单介绍 二、一些专有项简介 Entity Context Group Collector Matcher System Feature 三、注意实现 四、ECS 的下载 Github 上下载 Unity Asset Store 中下载 U...

仙魁XAN 7779

DMA Buffer Sharing API Guide

DMA Buffer Sharing API Guide ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sumit Semwal <sumit dot semwal at linaro dot org> ...

wanggongzhen1983的专栏 723

区域法(zonal method)重构波前

目的:实现区域法的Matlab代码 1.理论介绍 区域法波前重构即从波前探测器测得的波前斜率中恢复出波前的相位值,其分为:休晋模型(Hudgin)[90]、绍契威尔模型(Southwell)[40]和弗雷德模型(Fried)[48]。 1.1 Fried模型,对于N×N微透镜阵列构成的网格: 以3*3的子透镜为例,解释上式,对其展开 改写为矩阵形式: 记作:S=AΦ,A根据N而确定。S是波前探测器测得的斜率,Φ是重构矩阵的相位值。 1.2 而Southwel...

EyRe1的博客 8193

dma_buf_fops

static const struct file_operations dma_buf_fops = { .release = dma_buf_file_release, .mmap = dma_buf_mmap_internal, .llseek = dma_buf_llseek, .poll = dma_buf_poll, .unlocked_ioctl = dma_buf_ioctl, #ifdef CONF

wmzjzwlzs的专栏 509

tsmc12:via0的spacing问题(Via0.S.1)

12nm有个via0 grid的概念,除了普通fill外,基本都有via0这一层,这一层需要与via0 grid对齐。手动调整cell的位置比较容易出这个drc,比如修m0po max length drc时。解决方法1: 替换EEQV类型cell,这种类型是专门为了修via0 Grid问题存在的。更多学习内容请关注「拾陆楼」知识星球。解决方法2: 翻转或移动。

m0_61544122的博客 1115

基于自抗扰控制的虚拟同步发电机二次调频控制研究

摘要:本文针对高比例可再生能源并网导致的电力系统频率稳定性问题,提出基于自抗扰控制(ADRC)的虚拟同步发电机(VSG)二次调频控制策略。通过分析VSG工作原理和传统调频方法的不足,设计了非线性ADRC和线性ADRC两种控制器,详细阐述了参数整定方法。仿真结果表明,该策略能有效消除频率稳态偏差,提升系统抗扰能力,为分布式电源参与电网调频提供了新思路。 关键词:虚拟同步发电机;自抗扰控制;二次调频;频率调节;抗扰能力

huanghm88的专栏 243

display:Buffer Sharing and Synchronization

缓冲区共享和同步 dma-buf子系统提供了用于在多个设备驱动程序和子系统之间共享用于硬件(DMA)访问的缓冲区以及用于同步异步硬件访问的框架。 例如,drm的“prime”多GPU支持可使用此功能,但当然不限于GPU用例。 它的三个主要组成部分是:(1)dma-buf,表示一个sg_table,并作为文件描述符公开给用户空间,以允许在设备之间传递;(2)fence,该机制提供了一种机制,用于在一个设备完成访问时发出信号, (3)保留,它管理与缓冲区关联的共享或专用fence。 NOTE: dma

maze的专栏 2115

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux DMA 驱动学习总结

Linux DMA驱动构架分析       以linux2.6.32中的S3C2440驱动为例进行分析,DMA驱动所对应的源码为linux-2.6.32.2\arch \arm\mach-s3c2440\dma.c,代码入口为: arch_initcall(s3c2440_dma_init); 205 static int __init s3c2440_dma_init(void)

bcbobo21cn的专栏 4684

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

DMA fence原理

dma fence;dma 同步机制

只要有梦的专栏 976

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

dma-buf 由浅入深(三) —— map attachment

在上一篇《kmap/vmap》中,我们学习了如何使用 CPU 在 kernel 空间访问 dma-buf 物理内存,但如果使用CPU直接去访问 memory,那么性能会大大降低。因此,dma-buf 在内核中出现频率最高的还是它的 dma_buf_attach() 和 dma_buf_map_attachment() 接口。本篇我们就一起来学习如何通过这两个 API 来实现 DMA 硬件对 dma-buf 物理内存的访问。

hexiaolong2009的专栏 3万+

201_DMA-BUF简单介绍

首先需要明确DMA-BUF,Dma buffer,ION和DMA-BUF Heap是不同的概念。在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬件设备进行交互的应用能有一个内存能跟设备驱动程序共享数据,理想情况是这个buffer能够直接是通过memory map得到,并且是物理连续的,这样就能让DMA直接读写这块buffer,减少CPU或者外设来访问内存的开销。

踏雪寻春的专栏 1万+

LWN:ION变了个形,就要打入Linux内部了!

点击上方蓝色字关注我们~Destaging IONJuly 9, 2019This article was contributed by Marta Rybczyńska...

Linux News搬运工 2078

DMA Buffer Sync

在 Android 中,图像处理通常涉及多种硬件模块(如)的协作,数据通常会存储在共享的中。

Damon_X的博客 543

DRM驱动代码分析:gem_prime_import

DRM驱动代码分析:gem_prime_import

yuuu_cheer的博客 964

Linux图形显示DRM框架学习

一、Direct Rendering Manager(DRM)是linux内核子系统,负责与显卡交互。DRM提供一组API,用户空间程序可以使用该API将命令和数据发送到GPU并执行诸如显示器的模式设置之类的操作。用户空间程序可以使用DRM API命令GPU执行硬件加速的3D渲染、视频解码、GPU计算。 二、fbdev:Linux内核已经有一个fbdev的API,用来管理图形适配器的帧缓存区,但不能用于满足基于3D加速的现代基于GPU的视频硬件需求,这些设备通常需要在自己的内存中设置和管理命令队列,以将命令

Neil驱动的博客 1万+
上一篇: LWN:若干新增的capability!
下一篇: LWN:5.8内核合并窗口第二部分!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值