RK3568上使用4G及以上内存时报错RGA_MMU unsupported memory larger than 4G

“RGA_MMU unsupported Memory larger than 4G!”报错解决办法 j解决使用RGA程序长时间运行报错:RGA_MMU unsupported Memory larger than 4G! 该报错标识当前配置的图像任务配置的内存无法满足当前匹配到的硬件核心对内存的要求,由于不同的硬件版本的RGA的IOMMU对内存位数的要求不同,当分配的内存超过对应硬件的限制时,则会出现该该报错。 阅读详情

RK3568上使用4G及以上内存时报错RGA_MMU unsupported memory larger than 4G

RK3568上使用4G及以上内存时报错RGA_MMU unsupported memory larger than 4G

煤气灶

煤气灶

来自专栏 · 宇宙机全能战士

2 人赞同了该文章

在瑞芯微RK3568上用了4G的内存,然后在使用rga的时候报错:

先看内核启动日志。

上图左右的Early memory node ranges分别是4G内存板子和2G内存板子启动过程中物理内存分布的内核打印。右边的内存分布的最后一个区间以0x000000007fffffff结尾,这个值刚好是2G。左边的内存分布以0x00000001ffffffff结尾,这个值是8G。对左边的内存分布进行转换和分析:

第一个地址范围:2 MB 到 13.28 MB,大小为11.27MB

第二个地址范围:14.87 MB 到 3,840 MB,大小为3818MB

第三个地址范围:7,936 MB 到 8,192 MB,大小为256MB

4G的物理内存,为什么会有起始地址>4G的第三个地址范围,这应该是RK3568的固件的处理。

这与这张图片中的解释相一致。

为什么第二个地址范围到3840MB的位置结束,而不是到4096MB的位置结束?

查阅了文档《Rockchip RK3568 Technical Reference Manual》,其中Chapter 1 System Overview 中的1.1 Address Mapping 中的表格指定了MMIO映射关系。

MMIO 是一种通过 CPU 访问硬件设备寄存器的方式,它将设备的寄存器空间映射到内存地址空间中,使得操作系统能够像访问普通内存一样访问硬件设备的寄存器。设备的每个寄存器或寄存器组都会映射到一个特定的内存地址,CPU 通过访问这些内存地址来与硬件设备进行交互。

可以看到这个地址是从0xF0000000开始,也就是3840MB:

结尾处为0xFE*C0000,大约在4056MB:

所以可以推断,从3840MB到4096MB的这256M,是rk3568用于MMIO的地址空间,不能用作访问内存的地址空间。为了能访问到4G末尾的[3840MB,4096MB]这一段内存,只能通过从4G以上的内存区间来映射,rk3568用的是前面第三个地址区间,也就是[7936MB,8192MB]来实现。

为什么将驱动从rga3降级到rga2后,能解决这个问题?参考librga/docs/Rockchip_FAQ_RGA_CN.md at main · airockchip/librga 中的1.9:

由于部分RGA1/RGA2的IOMMU仅支持最大32位的物理地址,而RGA Device Driver、RGA2 Device Driver中对于不满足硬件内存要求的调用申请,默认是通过swiotlb机制进行访问访问受限制的内存(原理上相当于通过CPU将高位内存拷贝至符合硬件要求的低位内存中,再交由硬件进行处理,处理完毕后再通过CPU将低位内存搬运回目标的高位内存上。)因此效率十分低下,通常在正常耗时的3-4倍之间浮动,并且引入受CPU负载影响。

RGA Multicore Device Driver(即rga3)中针对访问受限制的内存会禁用swiotlb机制,直接通过调用失败的方式显示的通知调用者申请符合要求的内存再调用,来保证RGA的高效。

rk文档中提供了一种方法,限制内存在0~4G:

注释uboot的以下代码中的红框部分:

这段代码将使用atags_get_tag函数获取atag信息,并将内存分布存放于mem数组中,mem数组中的每一项对应Early memory node ranges打印中的一个地址范围。将红框中的代码注释掉,相当于大于4G的内存就不使用了,所以就浪费了第三个地址范围内的256M大小的内存,注释前后的对比:

左边是没注释掉方框时的输出,右边是注释掉的,可以观察到第三个地址范围在注释后不再出现了。并且node0的总页面数从1043968下降至978432,下降了65536个页面,相当于256M。

对于4G的内存,考虑一下浪费256M是可否可以接受。

后续如果内存扩展到8G怎么办?

根据文档,有两种方法:

1、申请DMA上的内存:

librga/samples/allocator_demo/src/rga_allocator_dma_demo.cpp at main · airockchip/librga · GitHub

观察图片中的Zone Ranges,DMA段的内存是小于4G的,从这段内存里申请内存给rga用就不会出错。

2、使用drm接口申请内存,带上参数,限制申请4G以下的内存

librga/samples/allocator_demo/src/rga_allocator_drm_phy_demo.cpp at main · airockchip/librga · GitHub

PRO-RK3566开发板适配Rockchip原厂buildroot系统:突破RGA_MMU 4GB内存限制实战 本文详细介绍了在PRO-RK3566开发板上适配Rockchip原厂buildroot系统时遇到的RGA_MMU 4GB内存限制问题及解决方案。通过分析RGA_MMU工作原理,提出并实现了修改u-boot内存初始化代码的有效方法,解决了gstreamer视频录制报错问题,同时提供了完整的适配流程与验证步骤,为嵌入式开发者提供了宝贵经验。 阅读详情

相关推荐

攻克RK3588 RGA内存壁垒:从4G报错到高效分配的实战指南

本文针对RK3588平台上RGA硬件处理多路高清视频流时遇到的“4G内存壁垒”报错问题,提供了从快速绕行到根本解决的实战指南。文章首先分析了RGA2核心不支持4G以上物理地址内存的根本原因,随后介绍了强制使用RGA3核心的快速方案,并重点深入讲解了通过dma_buf_alloc和MPP buffer group两种方法分配4G以内物理地址内存的底层原理、实施步骤与全链路集成方案,帮助开发者彻底攻克此性能瓶颈,实现稳定高效的多媒体处理。

sql99的博客 575

解决linux无法识别4G以上内存问题一例

单位的旧服务器,操作系统为sles 10 sp1,安装时仅有2G内存,迁移到虚拟机之后增加内存到8G,无法识别新增内存,需要启用bigsmp内核才能识别更多内存,刚开始查了很多重新编译内核的资料,但没有跟所用版本一样的资料,在一个删除了网卡的虚拟机上各种make, make install, 最后不知道怎么好了,但是重新导入虚拟机后无法重现。。。        后来想到用yast安装,选择ker

i3myself的专栏 2464

RK3588开发避坑:RGA处理图像遇到‘4G内存错误’?试试这个指定RGA3核心的API

本文针对RK3588开发中RGA图像处理遇到的'4G内存错误'问题,深入分析了RGA2和RGA3核心的架构差异,并提供了强制使用RGA3核心的API解决方案。通过imconfig函数指定RGA3核心,开发者可有效规避内存限制,同时文章还探讨了DMA32内存分配等高级优化策略,帮助构建高效的图像处理流水线。

weixin_30730053的博客 494

RK3588 linux RGA初探

RGA(Raster Graphic Acceleration Unit)是一个独立的2D硬件加速器,可用于加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作。

ansondroider的博客 6652

RK RGA _MMU unsupported memory larger then 4G!问题解决

RK RGA _MMU unsupported memory larger then 4G!问题解决

yinsui1839的博客 2214

rga_mm: RGA_MMU unsupported Memory larger than 4G!解决

对于内存刚好是4GB的,这个修改是把位于4GB以上空间的256MB内存,不上报给内核。内存会损失256MB,如果可以接受的,可以这么使用。经过这么修改,如果能正常工作,说明就是大于等于4GB内存触发的问题,大于4GB的内存直接不上报给kernel。uboot下做如下修改。对于8GB内存的,不建议这样修改,否则内存直接变成4GB了。

小灰灰的博客 2232

使用SecureCRT上传大于4G的文件:is too large for zmodem.ZModem does not support files larger than 4 Gigabytes

使用SecureCRT通过rz命令上传大于4G的文件时,软件报错。需要通过SecureRCT自带的SFTP解决。

qq_38473254的博客 1835

瑞芯微RGA kernel层报错集锦

该问题为分配器DRM本身的问题,DRM本身认为当用户态获取到物理地址后,正常来讲内核态是不需要虚拟地址的了,所以在分配buffer时就会将对应的kmap释放,仅释放kmap也不会影响到用户态中映射虚拟地址和使用,但是当这块buffer用户态的虚拟地址传入RGA驱动,驱动进行物理地址页表的转换查询时,由于该buffer的kmap已经被释放,或是无法查询到对应的页表项,或是直接访问到错误的地址导致内核crash。

小灰灰的博客 1863

20250319在荣品的PRO-RK3566开发板的buildroot系统下使用1080p的USB摄像头出图

XXXXXXXXXX 请务必检查IO电源域配置!XXXXXXXXXX 请务必检查IO电源域配置!XXXXXXXXXX 请务必检查IO电源域配置!XXXXXXXXXX 请务必检查IO电源域配置!XXXXXXXXXX 请务必检查IO电源域配置!当VCCIo2供电是1.8V,则FLASH_VOL_SEL管脚必须保持为高电平;当VCCIO2供电是3.3V,则FLASH_VOL_SEL管脚必须保持为低电平;

南岭笑笑生之家 1036

R语言实现神经网络ANN

【代码】R语言实现神经网络ANN。

所念皆星河 1049

【精选】98 深入探索RK3568平台Linux系统中的内存映射与虚拟内存

RK3568平台是由瑞芯微电子推出的一款高性能嵌入式处理器,广泛应用于多个领域,包括智能家居、工业自动化、多媒体娱乐等。该平台以其强大的性能、丰富的接口资源和灵活的扩展性备受开发者青睐。在RK3568平台上进行应用程序开发通常需要运行Linux操作系统,因此深入了解Linux系统中的内存映射与虚拟内存对于嵌入式系统开发至关重要。内存映射和虚拟内存是操作系统提供的强大工具,用于管理内存资源、进程隔离和文件访问。深入了解RK3568平台Linux系统中的内存映射与虚拟内存是嵌入式系统开发的关键一步。

一直在水些技术小文 328

RK3588s RGA库使用

主要介绍了RK3588中自带的2D图形加速引擎及其使用流程,最后用示例程序展示了使用RGA库从YUV到RGB的颜色空间转换。

zongheng_raobo的博客 1万+

瑞芯微RK35xx升级RGA驱动版本和API版本

本文介绍了瑞芯微RK35xx系列芯片升级RGA驱动和API版本的详细步骤。开发环境使用Ubuntu 20.04系统,内核版本5.10。升级过程分为两部分:RGA内核驱动升级通过替换SDK中的驱动文件并修改相关配置;RGA API库升级则需下载最新库文件,修改编译工具链后编译生成动态库。文章还提供了版本验证方法和测试命令,并针对RK3568升级中可能出现的异常情况给出了解决方案,即修改Uboot中关于内存管理的参数配置。整个过程需注意版本兼容性,确保驱动和API版本匹配。

qq_45147279的博客 899

rga的4G内存报错和4G内存分配方法

mpp_buffer_group_get_internal申请的内存可以和mpp_frame关联 这样可以很方便的处理内存和图像帧跟视频的关系 因为mpp_frame存储了视频编解码需要的pts gop 等视频需要的信息。除了例程接口dma_buf_alloc方式可以分配4G内存外 解码mpp中的mpp_buffer的分配接口mpp_buffer_group_get_internal也可以分配4G内存。rga的库和mpp的库要保证是最新的 不然系统自带的库可能太老会分配失败。

lajuchenghui的博客 1709

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

本文通过讲解MCU CAN解包模块的模块设置、输入输出信号的设置及仿真测试验证,说明了CAN解包模块的设置方法、CAN解包模块输入输出信号的设置方法以及CAN解包模块的仿真测试及修正方法。在模型搭建过程中,建议养成一种搭建完成仿真测试验证的习惯,在模块阶段发现错误,解决错误,避免在后期模块集成之后报出大量错误,增加解决错误的工作量和难度。希望通过本文的介绍能给相关技术人员带来一些参考和帮助。

qq_43011586的博客 5681

机器学习ROC曲线中的阈值thresholds

在ROC曲线上的不同点对应于不同的阈值。根据任务的具体要求,可以选择合适的阈值,以达到平衡召回率和误报率,或者根据具体应用场景调整模型的工作点。,表示样本属于正例的概率。这个概率值可以被截断为二元分类的决策,通过选择一个阈值来决定样本是被分类为正例还是负例。通过改变阈值,可以得到不同的真正例率(TPR)和假正例率(FPR),从而绘制出ROC曲线。总体来说,ROC曲线提供了模型在不同阈值下的性能综合情况,帮助分析模型的分类能力。通常来说,随着阈值的增加,TPR会减小,而FPR会增加。ROC曲线的绘制涉及。

行子的博客 3655

20250402在荣品的PRO-RK3566开发板适配Rockchip原厂的buildroot系统解决rga_mm RGA_MMU unsupported memory larger than 4G!

20250402在荣品的PRO-RK3566开发板适配Rockchip原厂的buildroot系统解决rga_mm RGA_MMU unsupported memory larger than 4G!缘起:使用Rockchip原厂的buildroot系统:RK3566_Linux5.10_V1.2.0_20241022.tar.gz。现在初步确定是 4GB内存的问题。报告4GB内存的问题。【参考:WINXP到WIN7的DDR内存经典的3.2GB的问题^_】4、DEBUG口原厂的SDK默认是1.5Mbps。

南岭笑笑生之家 1614

别再只会setStyleSheet了!Qt实现背景透明的5种方法全解析(附性能对比)

本文深入解析Qt实现背景透明的5种高阶方案,包括QPalette、setWindowOpacity、QGraphicsOpacityEffect、样式表和复合透明方案,并提供详细的性能对比与优化建议。针对不同平台和场景,帮助开发者选择最适合的透明效果实现方式,提升UI设计质量与性能表现。

weixin_27061475的博客 259

20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gc2093

Z:\RK3566_RK3568_Linux5.10_V1.2.0\kernel\arch\arm64\boot\dts\rockchip01荣品-最小\rk356x\rp-mipi-camera-gc2093-rk3566.dtsi。Z:\RK3566_RK3568_Linux5.10_V1.2.0\kernel\arch\arm64\boot\dts\rockchip01荣品-最小\rk356x\rp-mipi-camera-gc2093-rk3566.dtsi。10分钟:15*60*10=9000。

南岭笑笑生之家 1137

树莓派学习系列7——GPIO基础

前言 原来学单片机的时候,就是通过一系列的引脚来控制单片机。终于学到了通过引脚来控制树莓派了。话不多说咱们先来了解基础。

我在等那么一天的博客 1万+

Android Qcom USB Driver学习(五)

在前面的第二期中,我们知道一些非标的USB的充电类型Floatingcharger,其具有和普通DCP相似的大电流能力,但在最初检测的时候会限制Inputcurrentlimit到100mA,来进行检测是否是SDP类型,所以要支持大电流输入就需要进行vote操作,前面的几篇都有涉及,所以本文学习一下pmicusbcharger都相关的vote机制。...

Android驱动开发 2901

rga移植与测试

RGA (Raster Graphic Acceleration Unit)是一个独立的2D硬件加速器,可用于加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作

hurryddd 2088

深入瑞芯微ISP生态:手把手配置RK3588上的RKAIQ Server并与Windows端RKISP Tuner联调

本文详细介绍了如何在RK3588平台上配置RKAIQ Server并与Windows端的RKISP Tuner进行联调,以实现高效的ISP调优。从环境准备、服务部署到实战调试,涵盖了IMX415相机适配等关键步骤,帮助开发者快速掌握瑞芯微ISP生态的核心技术。

weixin_32447969的博客 670
上一篇: Pytorch Transformer
下一篇: cmake find_package
江太翁
博客等级 码龄15年 271粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值