当前位置: 首页 > article >正文

内存申请和使用的场景分析(以AP->kernal->ISP为例)

在 ISPImage Signal Processor系统中AP 与 ISP 之间的内存交互本质上是一个**“AP 申请可 DMA 访问的共享内存 → 内核建立映射 → 硬件寻址读写 → 同步与回收”**的过程。下面按数据流分层详细拆解。一、ISP 内存需求的特殊性与普通应用内存不同ISP 使用的内存有严格约束特性要求原因物理连续性最好物理连续或 IOMMU 映射ISP DMA 通常按物理地址突发传输Cache 一致性必须显式同步AP带 Cache与 ISP无 Cache同读写大页/对齐通常 4KB/64KB/1MB 对齐DMA 效率、页表映射要求安全/隔离可能需要 TrustZone 隔离保护 RAW 图像等敏感数据二、整体架构与角色┌─────────────────────────────────────────┐ │ 用户空间 (Camera HAL / APP) │ │ 调用 ioctl/mmap │ ├─────────────────────────────────────────┤ │ 内核空间 (V4L2 / ISP Driver) │ │ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ CMA/ION │ │DMA-BUF │ │IOMMU │ │ │ │ 分配器 │ │ 框架 │ │/SMMU │ │ │ └────┬────┘ └────┬────┘ └───┬────┘ │ ├────────┼────────────┼───────────┼──────┤ │ APB/AHB/AXI 总线 │ │ │ ├────────┼────────────┼───────────┼──────┤ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────┐ │ │ │ ISP 硬件 │ │ │ │ (DMA 控制器 → 处理流水线) │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘三、内存申请与下发的完整流程阶段 1用户态发起 Buffer 请求Camera HAL如 Android CamX/HAL3通过V4L2Video4Linux2或厂商私有接口请求图像 Buffer// 典型调用链ioctl(fd,VIDIOC_REQBUFS,req);// 申请 N 个 Bufferioctl(fd,VIDIOC_QUERYBUF,buf);// 查询 Buffer 信息mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,offset);// 映射到用户态关键参数req.memory V4L2_MEMORY_DMABUF或V4L2_MEMORY_MMAP。阶段 2内核态分配内存多种机制ISP 驱动在内核态根据平台选择不同的分配器方式 ACMAContiguous Memory Allocator—— 最常用// ISP 驱动中structpage*pagedma_alloc_from_contiguous(dev,count,order);phys_addr_tphyspage_to_phys(page);// 物理地址ISP DMA 直接用这个内核启动时预留一片物理连续内存cma64M等参数。适合 ISP 输入/输出需要大段物理连续地址的场景。方式 BION / DMA-BUF —— 现代主流Android/Linux// 分配共享 Bufferintfdion_alloc(len,heap_id_mask,flags);// 旧 ION// 或structdma_buf*dmabufdma_buf_export(...);// 标准 DMA-BUFIONAndroid或DMA-BUFLinux 主线分配文件描述符化的内存。支持物理不连续内存通过IOMMU/SMMU映射为 ISP 可见的 IOVA。零拷贝共享AP、ISP、GPU、VPU 都可以通过 fd 共享同一块内存。方式 CSMMU/IOMMU 映射离散内存聚合如果系统没有足够大的连续物理内存物理页: [Page0 0x1000] [Page1 0x5000] [Page2 0x3000] // 物理不连续 ↓ SMMU 页表映射 IOVA: [0x80000000] [0x80001000] [0x80002000] // ISP 看到的连续地址// 驱动代码示例iovaiommu_map(domain,iova,phys,size,IOMMU_READ|IOMMU_WRITE);// 将 IOVA 写入 ISP 寄存器ISP 以为自己访问的是连续地址阶段 3地址下发给 ISP 硬件这是核心步骤。驱动将内存地址配置到 ISP 的寄存器中// ISP 驱动配置 DMA 读写地址voidisp_config_buffer(structisp_device*isp,structisp_buffer*buf){phys_addr_tdma_addrbuf-dma_addr;// 物理地址或 IOVA// 写入 ISP 寄存器通过 AXI/APB 总线writel(dma_addr,isp-baseISP_REG_DMA_SRC_ADDR);// 输入 RAW 地址writel(dma_addroffset_y,isp-baseISP_REG_DMA_DST_ADDR_Y);// 输出 Y 地址writel(dma_addroffset_uv,isp-baseISP_REG_DMA_DST_ADDR_UV);// 输出 UV 地址// 配置长度、stride、格式等writel(buf-size,isp-baseISP_REG_DMA_SIZE);}关键概念ISP 是总线主设备Bus Master内置 DMA 控制器。它直接通过AXI/AHB总线发起读写不需要 CPU 干预。CPU 只需告诉 ISP数据在物理地址0x8A000000处去取吧。阶段 4Cache 同步数据一致性APCPU写数据到内存后如果 ISP 直接读取可能读到 Cache 里的旧数据因为内存里的数据还没回写。必须在下发前做Cache 同步// 方式 1写回并无效化 Cache最常用dma_sync_sg_for_device(dev,sglist,nents,DMA_TO_DEVICE);// CPU → 内存 → ISPdma_sync_sg_for_cpu(dev,sglist,nents,DMA_FROM_DEVICE);// ISP → 内存 → CPU// 方式 2分配时标记为 Non-Cacheable简单但性能差dma_alloc_attrs(dev,size,dma_handle,GFP_KERNEL,DMA_ATTR_NON_CONSISTENT);// 方式 3硬件自动一致性ARM CCI/DSU 等高端平台支持典型时序AP 填充图像数据到 Buffer走 Cache。dma_sync_sg_for_device()把 Cache 脏数据刷回内存。下发地址给 ISP启动 ISP。ISP DMA 读内存 → 处理 → 写回内存。ISP 中断通知 AP 完成。dma_sync_sg_for_cpu()无效化 CPU Cache确保 AP 读到最新数据。阶段 5中断回收与 Buffer 轮转ISP 处理完后通过中断通知 APISP 完成帧处理 ──→ 触发 IRQ ──→ ISP 驱动 ISR ──→ V4L2 唤醒用户态 │ ▼ 将 Buffer 标记为 DONE 用户态 dequeue 取走图像 空 Buffer 重新 enqueue 给 ISP这是典型的生产者-消费者环形队列Ring Buffer模型AP 预先分配 N 个 Buffer如 4~8 个组成队列。ISP 处理完一个AP 填下一个实现流水线并行。四、一个完整的代码级流程示例以 Linux V4L2 CMA 物理连续内存为例// 1. 驱动初始化预留/申请 CMA staticintisp_probe(structplatform_device*pdev){structisp_dev*ispdevm_kzalloc(pdev-dev,sizeof(*isp),GFP_KERNEL);// 从 CMA 分配 3 个 Buffer用于 Triple Bufferingfor(i0;i3;i){isp-buf[i].vaddrdma_alloc_coherent(pdev-dev,SIZE,isp-buf[i].dma_addr,GFP_KERNEL);// dma_addr: ISP 用的物理地址// vaddr: CPU 用的虚拟地址}}// 2. 用户态请求 Buffer staticintisp_reqbufs(structfile*file,void*priv,structv4l2_requestbuffers*p){// 将内核分配的 dma_addr 通过 mmap 暴露给用户态// 用户态拿到虚拟地址可直接读写}// 3. 下发配置并启动 ISP staticvoidisp_start_streaming(structisp_dev*isp){structisp_buffer*buflist_first_entry(isp-ready_list,...);// Cache 同步CPU 写的数据刷到内存dma_sync_single_for_device(isp-dev,buf-dma_addr,buf-size,DMA_TO_DEVICE);// 配置 ISP 硬件寄存器writel(buf-dma_addr,isp-baseISP_DMA_ADDR_REG);writel(0x1,isp-baseISP_START_REG);// GO! ISP 开始 DMA}// 4. 中断处理 staticirqreturn_tisp_irq_handler(intirq,void*dev_id){structisp_dev*ispdev_id;// 同步 Cache让 CPU 能看到 ISP 写的新数据dma_sync_single_for_cpu(isp-dev,buf-dma_addr,buf-size,DMA_FROM_DEVICE);// 唤醒等待的进程vb2_buffer_done(buf-vb,VB2_BUF_STATE_DONE);// 切换下一个 Bufferisp_switch_buffer(isp);returnIRQ_HANDLED;}五、关键问题与优化问题解决方案物理内存不够连续使用 IOMMU/SMMU 做 IOVA 映射或增大 CMA 预留Cache 不同步花屏严格使用dma_sync_*接口或分配 Non-Cacheable 内存Buffer 切换延迟Triple/Quad BufferingISP 处理时 AP 准备下一帧安全域隔离TrustZone Secure MemoryISP 安全通路访问安全内存跨 IP 共享使用 DMA-BUF fdISP、GPU、VPU 零拷贝共享六、总结AP 向 ISP 下发内存的完整链路可以概括为申请AP用户态通过 V4L2 → 内核驱动调用dma_alloc_coherent/ion_alloc/dma_buf分配物理连续或 IOMMU 映射的内存。映射内核返回物理地址或 IOVA给驱动同时通过mmap映射虚拟地址到用户态。同步AP 填完数据后调用dma_sync_*_for_device刷 Cache。下发驱动将物理地址/IOVA 写入 ISP 的 DMA 寄存器。硬件读写ISP 通过 AXI 总线直接 DMA 读写内存无需 CPU 参与。中断回传ISP 完成触发中断驱动同步 Cache 并通知 AP 取数据。理解这个流程的关键在于ISP 是独立的总线主设备CPU 只负责指路和同步实际搬运由 DMA 完成。

相关文章:

内存申请和使用的场景分析(以AP->kernal->ISP为例)

在 ISP(Image Signal Processor)系统中,AP 与 ISP 之间的内存交互本质上是一个**“AP 申请可 DMA 访问的共享内存 → 内核建立映射 → 硬件寻址读写 → 同步与回收”**的过程。下面按数据流分层详细拆解。一、ISP 内存需求的特殊性 与普通应用…...

告别手动标注!用SAM(Segment Anything)和Python脚本,5分钟批量生成你的分割数据集

5分钟批量生成分割数据集:SAM自动化标注全流程实战 在计算机视觉领域,数据标注一直是制约模型开发效率的瓶颈。传统手工标注不仅耗时费力,还容易引入人为误差。Meta开源的Segment Anything Model(SAM)彻底改变了这一局…...

【国家级攻防演练级建议】:DeepSeek私有化部署中4类隐蔽后门植入路径与实时检测方案

更多请点击: https://kaifayun.com 第一章:DeepSeek私有化部署中隐蔽后门植入的攻防对抗本质 在私有化场景下,DeepSeek模型的部署链路常跨越镜像构建、权重加载、推理服务启动及API网关接入等多个环节。攻击者可利用构建上下文污染、依赖包劫…...

DeepSeek代码审查能力白皮书(2024企业级实测报告)

更多请点击: https://kaifayun.com 第一章:DeepSeek代码审查能力白皮书(2024企业级实测报告)概述 本报告基于2024年Q1至Q3期间,面向金融、电信与云原生三大垂直行业的17家头部企业客户开展的深度实测,覆盖…...

Lindy多步骤任务自动化落地全图谱(企业级架构师压箱底实践)

更多请点击: https://codechina.net 第一章:Lindy多步骤任务自动化落地全图谱(企业级架构师压箱底实践) Lindy效应在自动化系统设计中揭示了一个关键洞察:越久经考验的实践,其未来预期寿命越长。Lindy多步…...

Midjourney V6锐化失控?3步诊断+5组--sref/--stylize协同参数公式,立竿见影修复模糊与锯齿

更多请点击: https://intelliparadigm.com 第一章:Midjourney V6锐化失控的本质归因 Midjourney V6 引入的全新扩散架构与隐式细节增强机制,导致图像生成过程中高频纹理被过度强化,其根本原因并非参数误配,而是模型在…...

SpringBoot WebClient 介绍

目录一、什么是 WebClient?二、 WebClient 能解决什么问题?三、WebClient 和 RestTemplate 的区别四、WebClient 的核心优势1. 非阻塞(Non-Blocking)2. 支持异步3. 链式 API 更现代五、WebClient 的核心对象六、Mono 和 Flux 是什…...

仅限首批200位架构师获取:DeepSeek-DDD联合建模工作坊实录(含领域事件风暴原始会议录像+决策日志)

更多请点击: https://kaifayun.com 第一章:DeepSeek领域驱动设计的范式演进与本质洞察 DeepSeek作为面向大规模智能体协同与复杂业务语义建模的新一代AI原生架构,其领域驱动设计(DDD)实践已突破传统分层单体范式&…...

CI/CD流水线中的幽灵依赖——DeepSeek项目92%存在未声明的transitive risk,你中招了吗?

更多请点击: https://intelliparadigm.com 第一章:CI/CD流水线中的幽灵依赖——DeepSeek项目92%存在未声明的transitive risk,你中招了吗? 在现代CI/CD实践中,开发者常误以为 package.json 或 requirements.txt 中显式…...

如何在原神中解放双手:自动钓鱼、拾取与对话跳过的终极指南

如何在原神中解放双手:自动钓鱼、拾取与对话跳过的终极指南 【免费下载链接】genshin-impact-script 原神脚本,包含自动钓鱼、自动拾取、自动跳过对话等多项实用功能。A Genshin Impact script includes many useful features such as automatic fishing…...

NBT数据可视化编辑解决方案:NBTExplorer技术解析与应用指南

NBT数据可视化编辑解决方案:NBTExplorer技术解析与应用指南 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款面向Minecraft数据管理的…...

PrediPrune:机器学习驱动的编译器超级优化候选剪枝策略

1. 项目概述与核心挑战在编译器优化的世界里,我们总在追求极致的性能。传统的编译器优化器,比如LLVM的Pass,依赖于一系列预定义的、经过验证的转换规则。它们很高效,但想象力也受限于这些规则。超级优化器(Superoptimi…...

终极指南:5步掌握Cursor AI Pro完整功能免费解锁技巧

终极指南:5步掌握Cursor AI Pro完整功能免费解锁技巧 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...

3分钟终极指南:用ncmdump轻松解密网易云音乐NCM格式文件

3分钟终极指南:用ncmdump轻松解密网易云音乐NCM格式文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump正是解决这个问题的神器&…...

Python到Android的魔法之旅:5步将你的代码变成移动应用

Python到Android的魔法之旅:5步将你的代码变成移动应用 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 想象一下,你花了几个月时间精心…...

Safe Exam Browser虚拟机绕过实战:深度解析与安全研究指南

Safe Exam Browser虚拟机绕过实战:深度解析与安全研究指南 【免费下载链接】safe-exam-browser-bypass A VM and display detection bypass for SEB. 项目地址: https://gitcode.com/gh_mirrors/sa/safe-exam-browser-bypass 在数字化教育快速发展的今天&…...

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极指南

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

从SIM800到BK A7670E:4G Cat.1模块硬件平替转接板设计全解析

1. 项目概述:从2G到4G的硬件平替升级 手头有个老项目,用的还是SIM800这种经典的2G模块,现在网络环境变了,2G退网是大势所趋,信号覆盖越来越差,项目得活下去,升级到4G成了刚需。但问题来了&#…...

5分钟掌握AutoClicker:Windows鼠标点击自动化的终极指南

5分钟掌握AutoClicker:Windows鼠标点击自动化的终极指南 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker AutoClicker是一款专为Windows设计的鼠…...

如何用OpenHRMS打造企业级人力资源管理系统:30+模块完全指南

如何用OpenHRMS打造企业级人力资源管理系统:30模块完全指南 【免费下载链接】OpenHRMS 项目地址: https://gitcode.com/gh_mirrors/op/OpenHRMS 还在为繁琐的人力资源管理头疼吗?🤔 面对员工考勤、薪酬计算、绩效评估等复杂流程&…...

如何高效使用HiveWE:魔兽争霸III地图制作的完整秘籍

如何高效使用HiveWE:魔兽争霸III地图制作的完整秘籍 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 还在为魔兽争霸III原版编辑器加载缓慢、操作卡顿而烦恼吗?HiveWE作为一款专注于速…...

三分钟快速上手:FanControl让你的电脑风扇从此安静又高效

三分钟快速上手:FanControl让你的电脑风扇从此安静又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

3分钟掌握抖音视频批量下载:解放双手的素材收集革命

3分钟掌握抖音视频批量下载:解放双手的素材收集革命 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为一个个手动保存抖音视频而烦恼吗?想要高效收集创作者素材却苦于没有合适的…...

【独家首发】Sora 2 AVI支持并非“开箱即用”:3层封装校验机制详解(RIFF→AVI→OpenCV Mat内存映射链路图解)

更多请点击: https://codechina.net 第一章:Sora 2 AVI支持并非“开箱即用”:核心矛盾与技术定位 Sora 2 的官方文档与发布说明中明确将 AVI 视为“实验性容器支持”,而非默认启用的输入格式。其底层解码栈基于 FFmpeg 5.1 构建&…...

软件测试行业的未来趋势:这3类测试将成为主流

随着数字化转型的深入推进,软件已经成为驱动各行业变革的核心生产力,从自动驾驶汽车到企业级云原生平台,从智慧医疗设备到工业互联网系统,软件的复杂度、规模和对安全性的要求都在呈指数级增长。作为软件质量保障的核心环节&#…...

为开源项目OpenClaw配置Taotoken作为其大模型服务后端

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为开源项目OpenClaw配置Taotoken作为其大模型服务后端 OpenClaw 是一个功能强大的开源工具,它允许开发者便捷地调用各类…...

C语言预处理指令全解析

第六章 预处理命令在c语言中,所有# 开头的指令,被称为预处理指令。gcc 编译预处理 所有的预处理指令,都要在这步处理完汇编编译连接#include包含头文件。 全局变量的声明,函数的声明, 自定义构造类型声明, …...

AI算法工程师必学的Python库:这10个库,AI开发必备

对于软件测试从业者来说,随着人工智能技术在测试领域的渗透越来越深——从自动化测试用例生成到缺陷智能预测,从测试结果分析到测试环境智能化调度,掌握AI开发的核心工具链已经成为从功能测试向AI测试开发、智能化测试转型的核心竞争力。Pyth…...

终极艾尔登法环存档迁移指南:3分钟学会角色无损转移

终极艾尔登法环存档迁移指南:3分钟学会角色无损转移 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档迁移而烦恼吗?当游戏版本更新后,你辛辛苦苦培…...

安卓用户如何免费获取大模型API密钥并开始调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 安卓用户如何免费获取大模型API密钥并开始调用 对于安卓开发者或移动端技术爱好者而言,直接体验和调用多种大模型的能力…...