[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f58I1ftO-h1JTgDaN82Ehk8X-V-3WvADdgcjGdLUwDcE":3},{"item":4,"related":44},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":35,"sourceName":36,"sourceUrl":37,"status":38,"seoTitle":7,"seoDescription":9,"canonicalUrl":35,"isFeatured":39,"sno":40,"sortOrder":41,"publishedAt":42,"updatedAt":43,"createdAt":43},"68fb22bc-a992-4b22-afc6-694e9e129914","article","DMA-BUF Fence：GPU 和摄像头如何知道共享画面何时处理完？","dma-buf-fence-async-device-synchronization","DMA-BUF 让 Linux 设备驱动共享缓冲区，dma-fence 则表示异步硬件操作何时完成。本文借助摄像头与 GPU 的画面流水线解释同步依赖，并区分 fence 与 CPU 缓存维护。","手机拍照时，摄像头把画面写进内存，图像处理器接着降噪，GPU 再负责显示。若每个部件都复制一份完整画面，不仅浪费内存，也会增加延迟。Linux 的 DMA-BUF 机制让不同设备驱动能够共享缓冲区；而 DMA Fence（栅栏）则用来表达一个异步设备操作何时完成。\n\nDMA-BUF 的直觉很像共享一张工作台。摄像头、显示控制器和 GPU 都可能访问同一块缓冲内存，但驱动要管理该缓冲区的导入、映射和生命周期。共享并不意味着各方可以不顾时序地同时乱写：摄像头必须先写完，后续处理才应读取；GPU 若仍在渲染，显示设备就不能假设新帧已经完成。\n\nFence 就是这种时序关系的信号。设备提交操作后，系统可以先继续做其他事；当硬件完成对应工作，fence 被标记为已触发，等待方再继续。它避免了让 CPU 一直忙等“做完了吗”，也能把多个设备之间的依赖关系传递下去。在 Linux 里，dma-fence 是内核抽象，sync_file 则可把一个或多个 fence 以文件描述符形式传递给用户空间或其他子系统。\n\n例如，摄像头驱动把一帧写进共享缓冲区，并提供表示写入完成的 fence。图像处理流水线等待该 fence，再提交滤镜工作；显示控制器随后依据处理完成信号安排扫描输出。若前一步迟迟未完成，消费者就知道不能读取尚未就绪的数据。这种异步协作对低延迟视频、图形渲染和多媒体管线很重要。\n\n一个常见误解是：有了 fence，CPU 缓存同步就全部自动解决了。实际上，设备访问与 CPU 访问之间的缓存一致性和显式同步仍有各自规则。DMA-BUF 文档也要求用户在 CPU 映射访问时遵循相应的同步约定；fence 主要表示异步操作的完成依赖，不是所有缓存维护工作的万能替代品。\n\n可以把共享缓冲区想成一块公共白板，DMA-BUF 负责让不同团队都能使用同一块白板，fence 则是“我写完了，你可以看”的交接信号。若没有清晰交接，内容可能被读到一半；若大家频繁复制，效率又会下降。正确的驱动与用户空间协作，才让零拷贝流水线既快又可靠。\n\n来源：[Linux 内核文档：DMA-BUF](https:\u002F\u002Fdocs.kernel.org\u002Fdriver-api\u002Fdma-buf.html)","\u002Fuploads\u002F2026-10-13\u002F64fc5816-d18b-4f2b-82af-7f5e51240048.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31],{"id":24,"name":25,"slug":26},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":28,"name":29,"slug":30},"8d35e42e-9f5b-4dd9-b30f-dc2c53d06096","硬件","hardware",{"id":32,"name":33,"slug":34},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",null,"Linux Kernel Documentation","https:\u002F\u002Fdocs.kernel.org\u002Fdriver-api\u002Fdma-buf.html","published",false,52,0,"2026-10-13T00:00:00.000Z","2026-10-13T02:13:45.324Z",[45,53,62],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":42,"createdAt":52},"5f2d281d-4673-42f3-b5e4-4cc68974abc6","SR-IOV：一张实体网卡怎样变成多个可分配给虚拟机的设备？","sriov-pci-device-virtual-functions","SR-IOV 允许支持该能力的 PCIe 设备由物理功能创建多个虚拟功能，供不同工作负载更直接地使用。本文解释 PF\u002FVF 分工、性能价值，以及为什么硬件虚拟化本身不等于完整隔离。","\u002Fuploads\u002F2026-10-13\u002F8b63e99b-a5e9-4f90-bbdb-81b28a2a38be.jpg",44,"2026-10-13T02:13:46.843Z",{"id":54,"type":6,"title":55,"slug":56,"summary":57,"coverUrl":58,"authorName":14,"sno":59,"publishedAt":60,"createdAt":61},"ccf00154-c4a8-4439-a8e8-4151b1c20721","AF_XDP：Linux 怎样把高速网卡数据直接交给用户程序？","linux-af-xdp-fast-packet-path","AF_XDP 是 Linux 面向高性能收发包的套接字接口，可把 XDP 处理后的数据送入用户态环形队列。本文从网卡、缓冲区和队列讲清数据路径，并说明所谓零拷贝依赖驱动与硬件支持。","\u002Fuploads\u002F2026-10-17\u002Ffdcc8edb-927f-41dc-8802-1e9053c47bfa.jpg",45,"2026-10-17T00:00:00.000Z","2026-10-17T03:08:33.177Z",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":68,"publishedAt":42,"createdAt":69},"2ff97b85-3142-4a75-924f-e6afa339d700","NVMe ZNS：为什么有些 SSD 要求数据按区域顺序写？","nvme-zns-zoned-namespace","ZNS 把 SSD 命名空间划分为必须顺序写入的区域，让主机参与闪存数据布局与回收。本文解释这种分工如何减少无效搬运，也说明它给文件系统和应用带来的管理成本。","\u002Fuploads\u002F2026-10-13\u002Fd2d45247-533f-4b02-b1a8-56f14d1dade3.jpg",46,"2026-10-13T02:13:43.485Z"]