linuxOS_D21X/doc/topics/sdk/display/display_mem_managment.html
2025-01-23 16:35:08 +08:00

307 lines
48 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn" lang="zh-cn" data-whc_version="27.0">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="description" content="CMA Linux-3.5 引入了一套 Contiguous Memory Allocator简称 CMA基于 DMA 映射框架为内核提供连续大块内存的申请和释放。CMA 主要思路是将预留内存纳入 DMA 映射管理,可以给系统内所有设备共享使用,这样就既解决了为 GPU、Camera、显示等图像处理类模块预留大块的连续内存又解决了预留内存被空置的问题提升内存使用率。 CMA ..."/><meta name="DC.rights.owner" content="(C) 版权 2025"/><meta name="copyright" content="(C) 版权 2025"/><meta name="generator" content="DITA-OT"/><meta name="DC.type" content="concept"/><meta name="DC.relation" content="../../../topics/sdk/display/display-design_intro.html"/><meta name="DC.relation" content="../../../topics/sdk/display/display_init_process.html"/><meta name="DC.relation" content="../../../topics/sdk/display/display_backlight.html"/><meta name="DC.contributor" content="yan.wang"/><meta name="DC.contributor" content="yan.wang"/><meta name="DC.date.modified" content="2024-01-15"/><meta name="DC.format" content="HTML5"/><meta name="DC.identifier" content="display_preserve_memory_managment_process"/><meta name="DC.language" content="zh-CN"/><title>预留内存管理流程</title><!-- Generated with build number 2024112209. --><meta name="wh-path2root" content="../../../"/><meta name="wh-toc-id" content="display_preserve_memory_managment_process-d4445e5036"/><meta name="wh-source-relpath" content="topics/sdk/display/display_mem_managment.dita"/><meta name="wh-out-relpath" content="topics/sdk/display/display_mem_managment.html"/>
<link rel="stylesheet" type="text/css" href="../../../webhelp/app/commons.css?buildId=2024112209"/>
<link rel="stylesheet" type="text/css" href="../../../webhelp/app/topic.css?buildId=2024112209"/>
<script src="../../../webhelp/app/options/properties.js?buildId=20250123154945"></script>
<script src="../../../webhelp/app/localization/strings.js?buildId=2024112209"></script>
<script src="../../../webhelp/app/search/index/keywords.js?buildId=20250123154945"></script>
<script defer="defer" src="../../../webhelp/app/commons.js?buildId=2024112209"></script>
<script defer="defer" src="../../../webhelp/app/topic.js?buildId=2024112209"></script>
<link rel="stylesheet" type="text/css" href="../../../webhelp/template/aic-styles-web.css?buildId=2024112209"/><link rel="stylesheet" type="text/css" href="../../../webhelp/template/notes.css?buildId=2024112209"/><link rel="stylesheet" type="text/css" href="../../../webhelp/template/aic-common.css?buildId=2024112209"/><link rel="stylesheet" type="text/css" href="../../../webhelp/template/aic-images.css?buildId=2024112209"/><link rel="stylesheet" type="text/css" href="../../../webhelp/template/footnote.css?buildId=2024112209"/><link rel="stylesheet" type="text/css" href="../../../webhelp/template/aic-web-watermark.css?buildId=2024112209"/><link rel="stylesheet" type="text/css" href="../../../webhelp/template/topic-body-list.css?buildId=2024112209"/></head>
<body id="display_preserve_memory_managment_process" class="wh_topic_page frmBody">
<a href="#wh_topic_body" class="sr-only sr-only-focusable">
跳转到主要内容
</a>
<header class="navbar navbar-default wh_header">
<div class="container-fluid">
<div class="wh_header_flex_container navbar-nav navbar-expand-md navbar-dark">
<div class="wh_logo_and_publication_title_container">
<div class="wh_logo_and_publication_title">
<a href="http://www.artinchip.com" class=" wh_logo d-none d-sm-block "><img src="../../../company-logo-white.png" alt=" Linux SDK 使用指南 SDK 指南文件 "/></a>
<div class=" wh_publication_title "><a href="../../../index.html"><span class="booktitle"> <span class="ph mainbooktitle">Linux SDK 使用指南</span> <span class="ph booktitlealt">SDK 指南文件</span> </span></a></div>
</div>
</div>
<div class="wh_top_menu_and_indexterms_link collapse navbar-collapse" id="wh_top_menu_and_indexterms_link">
</div>
</div>
</div>
</header>
<div class=" wh_search_input navbar-form wh_topic_page_search search " role="form">
<form id="searchForm" method="get" role="search" action="../../../search.html"><div><input type="search" placeholder="搜索 " class="wh_search_textfield" id="textToSearch" name="searchQuery" aria-label="搜索查询" required="required"/><button type="submit" class="wh_search_button" aria-label="搜索"><span class="search_input_text">搜索</span></button></div></form>
</div>
<div class="container-fluid" id="wh_topic_container">
<div class="row">
<nav class="wh_tools d-print-none navbar-expand-md" aria-label="Tools">
<div data-tooltip-position="bottom" class=" wh_breadcrumb "><ol class="d-print-none"><li><span class="home"><a href="../../../index.html"><span>主页</span></a></span></li><li><div class="topicref" data-id="id"><div class="title"><a href="../../../topics/sdk/chapter-advanced-app.html">高级应用</a><div class="wh-tooltip"><p class="shortdesc">系统、存储、多媒体、接口、安全等模块的详细配置和设计说明。</p></div></div></div></li><li><div class="topicref" data-id="concept_mcc_32s_nbc"><div class="title"><a href="../../../topics/chapter-title/chapter-multi-media-sdk.html">多媒体</a><div class="wh-tooltip"><p class="shortdesc">GE、VE、Display、DVP、MPP、MPP 播放器等多媒体模块的介绍和使用说明。</p></div></div></div></li><li><div class="topicref" data-id="id"><div class="title"><a href="../../../topics/sdk/display/display_user_guide.html">Display 使用指南</a></div></div></li><li><div class="topicref" data-id="display_design_intro"><div class="title"><a href="../../../topics/sdk/display/display-design_intro.html">设计说明</a></div></div></li><li><div class="topicref" data-id="topicset"><div class="title"><a href="../../../topics/sdk/display/display_init_process.html">关键流程设计</a></div></div></li><li class="active"><div class="topicref" data-id="display_preserve_memory_managment_process"><div class="title"><a href="../../../topics/sdk/display/display_mem_managment.html">预留内存管理流程</a></div></div></li></ol></div>
<div class="wh_right_tools">
<button class="wh_hide_highlight" aria-label="切换搜索突出显示" title="切换搜索突出显示"></button>
<button class="webhelp_expand_collapse_sections" data-next-state="collapsed" aria-label="折叠截面" title="折叠截面"></button>
<div class=" wh_navigation_links "><span id="topic_navigation_links" class="navheader">
<span class="navprev"><a class="- topic/link link" href="../../../topics/sdk/display/display_init_process.html" title="初始化流程" aria-label="上一主题: 初始化流程" rel="prev"></a></span>
<span class="navnext"><a class="- topic/link link" href="../../../topics/sdk/display/display_backlight.html" title="背光设计" aria-label="下一主题: 背光设计" rel="next"></a></span> </span></div>
<div class=" wh_print_link print d-none d-md-inline-block "><button onClick="window.print()" title="打印此页" aria-label="打印此页"></button></div>
<button type="button" id="wh_toc_button" class="custom-toggler navbar-toggler collapsed wh_toggle_button navbar-light" aria-expanded="false" aria-label="Toggle publishing table of content" aria-controls="wh_publication_toc">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</nav>
</div>
<div class="wh_content_area">
<div class="row">
<nav id="wh_publication_toc" class="col-lg-3 col-md-3 col-sm-12 d-md-block d-none d-print-none" aria-label="Table of Contents Container">
<div id="wh_publication_toc_content">
<div class=" wh_publication_toc " data-tooltip-position="right"><span class="expand-button-action-labels"><span id="button-expand-action" role="button" aria-label="Expand"></span><span id="button-collapse-action" role="button" aria-label="Collapse"></span><span id="button-pending-action" role="button" aria-label="Pending"></span></span><ul role="tree" aria-label="Table of Contents"><li role="treeitem"><div data-tocid="revinfo_linux-d4445e1079" class="topicref" data-id="revinfo_linux" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/revinfo/revinfo_linux.html" id="revinfo_linux-d4445e1079-link">修订记录</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="id-d4445e1096" class="topicref" data-id="id" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action id-d4445e1096-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/env/sdk-compile.html" id="id-d4445e1096-link">SDK 编译</a><div class="wh-tooltip"><p class="shortdesc">介绍不同编译环境下 SDK 的详细编译流程。</p></div></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="tocId-d4445e1240" class="topicref" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action tocId-d4445e1240-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/advanced/lb_usage_commands.html" id="tocId-d4445e1240-link">使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="concept_rcx_czh_pzb-d4445e1360" class="topicref" data-id="concept_rcx_czh_pzb" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action concept_rcx_czh_pzb-d4445e1360-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/chapter-app.html" id="concept_rcx_czh_pzb-d4445e1360-link">应用场景</a><div class="wh-tooltip"><p class="shortdesc">描述了 SDK 在不同应用场景中的配置和使用包括系统更新、OTA、安全方案等。</p></div></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="id-d4445e1678" class="topicref" data-id="id" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action id-d4445e1678-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/peripheral/peripheral-intro.html" id="id-d4445e1678-link">外设移植</a><div class="wh-tooltip"><p class="shortdesc"><span class="ph">触摸屏、显示器、WIFI 模块、按键</span>等外设的介绍和使用说明。</p></div></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="id-d4445e1964" class="topicref" data-id="id" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action id-d4445e1964-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/bringup/chapter-bringup.html" id="id-d4445e1964-link">BringUp</a><div class="wh-tooltip"><p class="shortdesc">在硬件上电后快速初始化系统,为操作系统的启动准备好必要的硬件环境。</p></div></div></div></li><li role="treeitem" aria-expanded="true"><div data-tocid="id-d4445e2153" class="topicref" data-id="id" data-state="expanded"><span role="button" tabindex="0" aria-labelledby="button-collapse-action id-d4445e2153-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/chapter-advanced-app.html" id="id-d4445e2153-link">高级应用</a><div class="wh-tooltip"><p class="shortdesc">系统、存储、多媒体、接口、安全等模块的详细配置和设计说明。</p></div></div></div><ul role="group" class="navbar-nav nav-list"><li role="treeitem" aria-expanded="false"><div data-tocid="uBoot-d4445e2170" class="topicref" data-id="uBoot" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action uBoot-d4445e2170-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/boot/uboot-module.html" id="uBoot-d4445e2170-link">U-Boot</a><div class="wh-tooltip"><p class="shortdesc">启动支持的基本功能以及运行时的基本硬件环境。</p></div></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="concept_mtx_tk3_pzb-d4445e3028" class="topicref" data-id="concept_mtx_tk3_pzb" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action concept_mtx_tk3_pzb-d4445e3028-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/linux/chapter_linux.html" id="concept_mtx_tk3_pzb-d4445e3028-link">Linux</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="chapter-system-d4445e3198" class="topicref" data-id="chapter-system" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action chapter-system-d4445e3198-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/chapter-title/chapter-system.html" id="chapter-system-d4445e3198-link">系统</a><div class="wh-tooltip"><p class="shortdesc"></p></div></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="chapter-memory-d4445e4054" class="topicref" data-id="chapter-memory" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action chapter-memory-d4445e4054-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/chapter-title/chapter-memory-sdk.html" id="chapter-memory-d4445e4054-link">存储</a><div class="wh-tooltip"><p class="shortdesc">SDMC、SPI NAND、SPI NOR 等存储模块的介绍和使用说明。</p></div></div></div></li><li role="treeitem" aria-expanded="true"><div data-tocid="concept_mcc_32s_nbc-d4445e4438" class="topicref" data-id="concept_mcc_32s_nbc" data-state="expanded"><span role="button" tabindex="0" aria-labelledby="button-collapse-action concept_mcc_32s_nbc-d4445e4438-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/chapter-title/chapter-multi-media-sdk.html" id="concept_mcc_32s_nbc-d4445e4438-link">多媒体</a><div class="wh-tooltip"><p class="shortdesc">GE、VE、Display、DVP、MPP、MPP 播放器等多媒体模块的介绍和使用说明。</p></div></div></div><ul role="group" class="navbar-nav nav-list"><li role="treeitem" aria-expanded="false"><div data-tocid="ge-d4445e4455" class="topicref" data-id="ge" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action ge-d4445e4455-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/ge/ge_user_guide.html" id="ge-d4445e4455-link">GE 使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="ve-d4445e4637" class="topicref" data-id="ve" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action ve-d4445e4637-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/ve/ve-user-guide.html" id="ve-d4445e4637-link">VE 使用指南</a></div></div></li><li role="treeitem" aria-expanded="true"><div data-tocid="id-d4445e4777" class="topicref" data-id="id" data-state="expanded"><span role="button" tabindex="0" aria-labelledby="button-collapse-action id-d4445e4777-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_user_guide.html" id="id-d4445e4777-link">Display 使用指南</a></div></div><ul role="group" class="navbar-nav nav-list"><li role="treeitem" aria-expanded="false"><div data-tocid="display_configuration-d4445e4791" class="topicref" data-id="display_configuration" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action display_configuration-d4445e4791-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_config.html" id="display_configuration-d4445e4791-link">Display 配置</a><div class="wh-tooltip"><p class="shortdesc">显示模块的参数配置,包括 menuconfig 配置 和 dts 配置。</p></div></div></div></li><li role="treeitem"><div data-tocid="display_debug_guide-d4445e4965" class="topicref" data-id="display_debug_guide" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_debug.html" id="display_debug_guide-d4445e4965-link">调试指南</a></div></div></li><li role="treeitem"><div data-tocid="display_test_guide-d4445e4979" class="topicref" data-id="display_test_guide" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_test_guide.html" id="display_test_guide-d4445e4979-link">测试指南</a></div></div></li><li role="treeitem" aria-expanded="true"><div data-tocid="display_design_intro-d4445e4993" class="topicref" data-id="display_design_intro" data-state="expanded"><span role="button" tabindex="0" aria-labelledby="button-collapse-action display_design_intro-d4445e4993-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display-design_intro.html" id="display_design_intro-d4445e4993-link">设计说明</a></div></div><ul role="group" class="navbar-nav nav-list"><li role="treeitem"><div data-tocid="display_component_architecture-d4445e5007" class="topicref" data-id="display_component_architecture" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_sourcecode_and_arch.html" id="display_component_architecture-d4445e5007-link">源码和框架说明</a></div></div></li><li role="treeitem" aria-expanded="true"><div data-tocid="topicset-d4445e5021" class="topicref" data-id="topicset" data-state="expanded"><span role="button" tabindex="0" aria-labelledby="button-collapse-action topicset-d4445e5021-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_init_process.html" id="topicset-d4445e5021-link">关键流程设计</a></div></div><ul role="group" class="navbar-nav nav-list"><li role="treeitem"><div data-tocid="display_initialization_process-d4445e5022" class="topicref" data-id="display_initialization_process" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_init_process.html" id="display_initialization_process-d4445e5022-link">初始化流程</a></div></div></li><li role="treeitem" class="active"><div data-tocid="display_preserve_memory_managment_process-d4445e5036" class="topicref" data-id="display_preserve_memory_managment_process" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_mem_managment.html" id="display_preserve_memory_managment_process-d4445e5036-link">预留内存管理流程</a></div></div></li><li role="treeitem"><div data-tocid="display_backlight-d4445e5050" class="topicref" data-id="display_backlight" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_backlight.html" id="display_backlight-d4445e5050-link">背光设计</a></div></div></li></ul></li><li role="treeitem"><div data-tocid="display_data_structure-d4445e5064" class="topicref" data-id="display_data_structure" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_data_structure.html" id="display_data_structure-d4445e5064-link">数据结构设计</a></div></div></li><li role="treeitem"><div data-tocid="display_interface_design-d4445e5078" class="topicref" data-id="display_interface_design" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_interface.html" id="display_interface_design-d4445e5078-link">接口设计</a></div></div></li><li role="treeitem"><div data-tocid="display_demo-d4445e5092" class="topicref" data-id="display_demo" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_demo.html" id="display_demo-d4445e5092-link">Demo</a></div></div></li></ul></li><li role="treeitem" aria-expanded="false"><div data-tocid="display_screen_configuration-d4445e5106" class="topicref" data-id="display_screen_configuration" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action display_screen_configuration-d4445e5106-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_panel_port.html" id="display_screen_configuration-d4445e5106-link">屏适配指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="concept_xpy_32b_ybc-d4445e5134" class="topicref" data-id="concept_xpy_32b_ybc" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action concept_xpy_32b_ybc-d4445e5134-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_fb_rotation.html" id="concept_xpy_32b_ybc-d4445e5134-link">屏幕旋转</a></div></div></li><li role="treeitem"><div data-tocid="display_change_color-d4445e5162" class="topicref" data-id="display_change_color" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_color_property.html" id="display_change_color-d4445e5162-link">色彩调整</a></div></div></li><li role="treeitem"><div data-tocid="display_boot_logo-d4445e5176" class="topicref" data-id="display_boot_logo" data-state="leaf"><span role="button" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_boot_logo.html" id="display_boot_logo-d4445e5176-link">Boot Logo</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="display_common_issues-d4445e5190" class="topicref" data-id="display_common_issues" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action display_common_issues-d4445e5190-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/display/display_faqs.html" id="display_common_issues-d4445e5190-link">常见问题</a></div></div></li></ul></li><li role="treeitem" aria-expanded="false"><div data-tocid="concept_h4d_fwt_tzb-d4445e5218" class="topicref" data-id="concept_h4d_fwt_tzb" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action concept_h4d_fwt_tzb-d4445e5218-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/dvp/dvp_user_guide.html" id="concept_h4d_fwt_tzb-d4445e5218-link">DVP 使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="mpp-d4445e5358" class="topicref" data-id="mpp" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action mpp-d4445e5358-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/mpp/mpp_user_guide.html" id="mpp-d4445e5358-link">MPP 使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="mpp_0-d4445e5498" class="topicref" data-id="mpp_0" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action mpp_0-d4445e5498-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/mpp/mpp_player_user_guide.html" id="mpp_0-d4445e5498-link">MPP 播放器使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="gstreamer-d4445e5582" class="topicref" data-id="gstreamer" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action gstreamer-d4445e5582-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/gstreamer/gstreamer-user-guide.html" id="gstreamer-d4445e5582-link">Gstreamer 使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="i2s-d4445e5680" class="topicref" data-id="i2s" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action i2s-d4445e5680-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/i2s/i2s_user_guide.html" id="i2s-d4445e5680-link">I2S 使用指南</a></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="audio_codec_user_guide-d4445e5806" class="topicref" data-id="audio_codec_user_guide" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action audio_codec_user_guide-d4445e5806-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/sdk/audio_codec/audio-codec-user-guide.html" id="audio_codec_user_guide-d4445e5806-link">Audio Codec 使用指南</a></div></div></li></ul></li><li role="treeitem" aria-expanded="false"><div data-tocid="concept_nww_hzh_pzb-d4445e5947" class="topicref" data-id="concept_nww_hzh_pzb" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action concept_nww_hzh_pzb-d4445e5947-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/chapter-title/chapter-interface-sdk.html" id="concept_nww_hzh_pzb-d4445e5947-link">接口</a><div class="wh-tooltip"><p class="shortdesc">CAN、CIR、GPAI、GPIO、I2C、PSADC、PWM 等接口模块的介绍和使用说明。</p></div></div></div></li><li role="treeitem" aria-expanded="false"><div data-tocid="chapter-safety-d4445e7944" class="topicref" data-id="chapter-safety" data-state="not-ready"><span role="button" tabindex="0" aria-labelledby="button-expand-action chapter-safety-d4445e7944-link" class="wh-expand-btn"></span><div class="title"><a href="../../../topics/chapter-title/chapter-safety-sdk.html" id="chapter-safety-d4445e7944-link">安全</a><div class="wh-tooltip"><p class="shortdesc">SPI ENC、CE、eFuse 等安全模块的介绍和使用说明。</p></div></div></div></li></ul></li></ul></div>
</div>
</nav>
<div class="col-lg-7 col-md-9 col-sm-12" id="wh_topic_body">
<button id="wh_close_publication_toc_button" class="close-toc-button d-none" aria-label="Toggle publishing table of content" aria-controls="wh_publication_toc" aria-expanded="true">
<span class="close-toc-icon-container">
<span class="close-toc-icon"></span>
</span>
</button>
<button id="wh_close_topic_toc_button" class="close-toc-button d-none" aria-label="Toggle topic table of content" aria-controls="wh_topic_toc" aria-expanded="true">
<span class="close-toc-icon-container">
<span class="close-toc-icon"></span>
</span>
</button>
<div class=" wh_topic_content body "><main role="main"><article class="- topic/topic concept/concept topic concept" role="article" aria-labelledby="ariaid-title1">
<span class="edit-link" style="font-size:12px; opacity:0.6; text-align:right; vertical-align:middle"><a target="_blank" title="Edit this document" href="http://172.16.35.88/tasks/jdssno1uvvbf2mltu9kb9v3if05d5gopuakboe8hlud18rma/edit/F:/aicdita/aicdita-cn/topics/sdk/display/display_mem_managment.dita">Edit online</a></span><h1 class="- topic/title title topictitle1" id="ariaid-title1">预留内存管理流程</h1>
<div class="date inPage">15 Jan 2024</div><div style="color: gray;">
Read time: 4 minute(s)
</div>
<div class="- topic/body concept/conbody body conbody">
<section class="- topic/section section" id="display_preserve_memory_managment_process__section_w5d_21g_d1c" data-ofbid="display_preserve_memory_managment_process__section_w5d_21g_d1c"><h2 class="- topic/title title sectiontitle">CMA</h2><p class="- topic/p p" data-ofbid="d169287e36__20250123155218">Linux-3.5 引入了一套 Contiguous Memory
Allocator简称 CMA基于 DMA 映射框架为内核提供连续大块内存的申请和释放。CMA 主要思路是将预留内存纳入 DMA
映射管理,可以给系统内所有设备共享使用,这样就既解决了为
GPU、Camera、显示等图像处理类模块预留大块的连续内存又解决了预留内存被空置的问题提升内存使用率。</p><p class="- topic/p p" data-ofbid="d169287e38__20250123155218">CMA
本身不是一套分配内存的算法,它的底层仍然要依赖伙伴算法系统来支持,可以理解为 CMA 是介于 DMA mapping 和内存管理之间的中间层。</p><div class="- topic/p p" data-ofbid="d169287e40__20250123155218"><br/><div class="imagecenter"><img class="- topic/image image imagecenter" id="display_preserve_memory_managment_process__image_x5d_21g_d1c" src="../../../images/display/display_lb_cma.png" width="384" alt="cma"/></div><br/></div><p class="- topic/p p" data-ofbid="d169287e46__20250123155218">CMA 的具体功能有:</p><ol class="- topic/ol ol" id="display_preserve_memory_managment_process__ol_y5d_21g_d1c" data-ofbid="display_preserve_memory_managment_process__ol_y5d_21g_d1c">
<li class="- topic/li li" data-ofbid="d169287e50__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e52__20250123155218">在系统的启动过程中,根据内核编译配置、或者 DTS 配置将内存中某块区域用于 CMA然后内核中其他模块可以通过 DMA 的接口 API
申请连续内存,这块区域我们称之为 CMA area。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e56__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e58__20250123155218">提供 cma_alloc()和 cma_release()两个接口函数用于分配和释放 CMA pages。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e62__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e64__20250123155218">记录和跟踪 CMA area 中各个 pages 的状态。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e68__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e70__20250123155218">调用伙伴系统接口,进行真正的内存分配。</p>
</li>
</ol><p class="- topic/p p" data-ofbid="d169287e74__20250123155218"><strong class="+ topic/ph hi-d/b ph b">CMA 主要接口</strong></p><ol class="- topic/ol ol" id="display_preserve_memory_managment_process__ol_z5d_21g_d1c" data-ofbid="display_preserve_memory_managment_process__ol_z5d_21g_d1c">
<li class="- topic/li li" data-ofbid="d169287e79__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e81__20250123155218">CNA area 的声明</p>
<div class="- topic/p p" data-ofbid="d169287e84__20250123155218">setup_bootmem() -&gt; dma_contiguous_reserve(),定义在
<span class="+ topic/ph sw-d/filepath ph filepath">kernel/dma/contiguous.c</span>,其中有确定 CMA area size
的代码如下:<pre class="+ topic/pre pr-d/codeblock pre codeblock language-c" id="display_preserve_memory_managment_process__codeblock_yvp_g1g_d1c" data-ofbid="display_preserve_memory_managment_process__codeblock_yvp_g1g_d1c"><code>#ifdef CONFIG_CMA_SIZE_SEL_MBYTES
selected_size = size_bytes;
#elif defined(CONFIG_CMA_SIZE_SEL_PERCENTAGE)
selected_size = cma_early_percent_memory();
#elif defined(CONFIG_CMA_SIZE_SEL_MIN)
selected_size = min(size_bytes, cma_early_percent_memory());
#elif defined(CONFIG_CMA_SIZE_SEL_MAX)
selected_size = max(size_bytes, cma_early_percent_memory());
#endif</code></pre></div>
<p class="- topic/p p" data-ofbid="d169287e92__20250123155218">然后会调用 dma_contiguous_reserve_area() -&gt; cma_declare_contiguous() 去初始化 CMA
的配置参数。</p>
<div class="- topic/note note note note_note" id="display_preserve_memory_managment_process__note_xhx_g1g_d1c" data-ofbid="display_preserve_memory_managment_process__note_xhx_g1g_d1c"><span class="note__title">注:</span> <div class="note__body">
<p class="- topic/p p" data-ofbid="d169287e97__20250123155218">计算 CMA 内存大小的过程中size_bytes 来源于内核编译配置中 CONFIG_CMA_SIZE_MBYTES通过计算将 size
限定在 4 MB 对齐。<span class="- topic/ph ph"> 参考<a class="- topic/xref xref" href="display_menuconfig.html#display_menuconfig_configuration__ol_i2q_pvf_d1c">CMA 配置</a>
进行设置。</span></p>
</div></div>
</li>
<li class="- topic/li li" data-ofbid="d169287e108__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e110__20250123155218">CMA 初始化</p>
<p class="- topic/p p" data-ofbid="d169287e113__20250123155218"><span class="+ topic/ph sw-d/filepath ph filepath">mm/cma.c</span> 中的 cma_init_reserved_areas() -&gt;
init_cma_reserved_pageblock(),其中会设置 page 属性为 MIGRATE_CMA。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e120__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e122__20250123155218">申请 CMA</p>
<p class="- topic/p p" data-ofbid="d169287e125__20250123155218">使用 DMA 标准接口 dma_alloc_coherent() 和 dma_alloc_wc(),会间接调用
dma_alloc_from_contiguous()。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e129__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e131__20250123155218">释放 CMA</p>
<p class="- topic/p p" data-ofbid="d169287e134__20250123155218">使用 DMA 标准接口 dma_free_coherent()。</p>
</li>
</ol></section>
<section class="- topic/section section" id="display_preserve_memory_managment_process__section_gvd_21g_d1c" data-ofbid="display_preserve_memory_managment_process__section_gvd_21g_d1c"><h2 class="- topic/title title sectiontitle">DMA-BUF</h2><p class="- topic/p p" data-ofbid="d169287e142__20250123155218">CMA
解决的是预留内存空闲期间如何给其他设备共享的问题DMA-BUF 解决的是使用期间多个设备共享的问题、以及内核态和用户态如何共享内存的问题。DMA-BUF
可减少多余的拷贝,提升系统运行效率。</p><p class="- topic/p p" data-ofbid="d169287e144__20250123155218">DMA-BUF 最初原型是 hrbuf于 2011 年首次提出,实现了 “Buffer Sharing”
的概念验证。shrbuf 被社区重构变身为 DMA-BUF2012 年合入 Linux-3.3 主线版本。</p><p class="- topic/p p" data-ofbid="d169287e146__20250123155218">DMA-BUF 被广泛用在多媒体驱动中,尤其在
V4L2、DRM 子系统中经常用到。</p><p class="- topic/p p" data-ofbid="d169287e148__20250123155218"><strong class="+ topic/ph hi-d/b ph b">DMA-BUF vs ION</strong></p><p class="- topic/p p" data-ofbid="d169287e151__20250123155218">从 Linux-5.6 开始DMA-BUF 正式合入了原来 ION 的 heap 管理功能,社区的主分支是打算抛弃 ION 了。在 Linux-5.11,主分支已经删除了
<span class="+ topic/ph sw-d/filepath ph filepath">drivers/staging/android/ion</span> 代码,原因是“原厂对 ION
的支持在社区中不太活跃,很难持续更新 ION”而且 ION 还带来了几个 break。</p><ol class="- topic/ol ol" id="display_preserve_memory_managment_process__ol_hvd_21g_d1c" data-ofbid="display_preserve_memory_managment_process__ol_hvd_21g_d1c">
<li class="- topic/li li" data-ofbid="d169287e158__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e160__20250123155218">ION 有大量的 heap 逻辑管理,而 DMA-BUF 的 heap 更多是分配接口上的管理(社区更容易接受)。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e164__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e166__20250123155218">ION 是生产一个字符设备 /dev/ion而 DMA-BUF 为每个 heap 生成一个字符设备,便于用户态的 heap 区分和权限管理。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e170__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e172__20250123155218">ION 限制最多 32 个 heapDMA-BUF 没有这个限制。</p>
</li>
<li class="- topic/li li" data-ofbid="d169287e176__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e178__20250123155218">DMA-BUF 中实现了两个初始的 heapsystem heap 和 cma heap与原 ION 中的功能类似,但做了很大简化(为了方便社区
review删掉原来 ION 中针对 system、cma 做过的一些优化,涉及 uncached buffers、large page
allocation、page pooling 和 freeing。 DMA-BUF 中的 CMA只添加了 CMA
区域。原 ION 中的 CMA 是添加了所有 DMA 区域。</p>
</li>
</ol><p class="- topic/p p" data-ofbid="d169287e182__20250123155218"><strong class="+ topic/ph hi-d/b ph b">工作机制</strong></p><p class="- topic/p p" data-ofbid="d169287e185__20250123155218">为了解决各个驱动之间的 buffer 共享问题DMA-BUF 将 buffer 与 file 结合使用,让 DMA-BUF
既是一块物理 buffer同时也是个 Linux 标准 file。典型的应用框图如下</p><div class="- topic/p p" data-ofbid="d169287e187__20250123155218"><br/><div class="imagecenter"><img class="- topic/image image imagecenter" id="display_preserve_memory_managment_process__image_ivd_21g_d1c" src="../../../images/display/dma_buf.png" width="384" alt="dma_buf1"/></div><br/></div><p class="- topic/p p" data-ofbid="d169287e193__20250123155218">分配 buffer 的模块为 exporter使用该 buffer 的模块为 importer。</p><p class="- topic/p p" data-ofbid="d169287e196__20250123155218">DMA-BUF
支持连续物理内存、散列物理内存的 buffer 管理。ArtInChip 平台目前只支持连续物理内存的 DMA-BUF。</p><div class="- topic/p p" data-ofbid="d169287e198__20250123155218"><strong class="+ topic/ph hi-d/b ph b">主要接口</strong><ul class="- topic/ul ul" id="display_preserve_memory_managment_process__ul_pln_41g_d1c" data-ofbid="display_preserve_memory_managment_process__ul_pln_41g_d1c">
<li class="- topic/li li" data-ofbid="d169287e203__20250123155218">内核空间<ul class="- topic/ul ul" id="display_preserve_memory_managment_process__ul_qxn_n1g_d1c" data-ofbid="display_preserve_memory_managment_process__ul_qxn_n1g_d1c">
<li class="- topic/li li" data-ofbid="d169287e207__20250123155218">作为 exporter<p class="- topic/p p" data-ofbid="d169287e209__20250123155218">注册接口 <span class="+ topic/keyword pr-d/apiname keyword apiname">dma_buf_export()</span></p></li>
<li class="- topic/li li" data-ofbid="d169287e214__20250123155218">作为
importer<p class="- topic/p p" data-ofbid="d169287e216__20250123155218">获取 buf 的接口:<span class="+ topic/keyword pr-d/apiname keyword apiname">dma_buf_get</span>,``dma_buf_attach()``,``dma_buf_map_attachment``。</p></li>
</ul></li>
<li class="- topic/li li" data-ofbid="d169287e223__20250123155218">
<p class="- topic/p p" data-ofbid="d169287e225__20250123155218">用户空间</p>
<p class="- topic/p p" data-ofbid="d169287e228__20250123155218">通过 ioctl 来管理 DMA-BUF。</p>
</li>
</ul></div><p class="- topic/p p" data-ofbid="d169287e232__20250123155218"><strong class="+ topic/ph hi-d/b ph b">基于 DMA-BUF 的 Video Layer buffer 管理</strong></p><p class="- topic/p p" data-ofbid="d169287e235__20250123155218">UI Layer 的 buffer
driver 申请,通过 /dev/fb0 透传到用户态,用户态使用 mmap() 实现 buffer 共享。</p><p class="- topic/p p" data-ofbid="d169287e237__20250123155218">但对于 Video Layer 的
buffer情况有所不同申请多大 buffer、多少个 buffer 都是由应用场景确定,所以应该是用户态发起申请。同时这个 buffer
还要满足物理连续的特性DE 硬件才能用来做图层叠加处理。</p><div class="- topic/p p" data-ofbid="d169287e239__20250123155218">
<br/><div class="imagecenter"><img class="- topic/image image imagecenter" id="display_preserve_memory_managment_process__image_mvd_21g_d1c" src="../../../images/display/dma_buf_heap.png" width="288" alt="dma_buf_heap"/></div><br/>
</div><p class="- topic/p p" data-ofbid="d169287e247__20250123155218">左图,是 ION 时代的使用方法,新版 LinuxLinux-5.6 以后)的 DMA-BUF 已经支持了 heap 功能,从功能上完全可以替代
ION。对用户态来说看到的差别不再是单一的 /dev/ion 设备节点,而是有多个 /dev/* 设备节点,比如 CMA heap 会生成
/dev/dma_heap/reservedSystem heap 会生成 /dev/dma_heap/system。</p><p class="- topic/p p" data-ofbid="d169287e249__20250123155218">使用 DMA-BUF
的情况下APP 和 fb 驱动共享 buffer 的初始化流程如下图所示:</p><div class="- topic/p p" data-ofbid="d169287e251__20250123155218"><br/><div class="imagecenter"><img class="- topic/image image imagecenter" id="display_preserve_memory_managment_process__image_nvd_21g_d1c" src="../../../images/display/dma_buf_app.png" width="288" alt="dma_buf_app"/></div><br/></div><p class="- topic/p p" data-ofbid="d169287e257__20250123155218">其中第 3 步的操作比较啰嗦fb 驱动根据 APP 传来的一组 fd[],逐个去向 DMA-BUF 模块申请以下资源dma_buf -&gt; attatch
-&gt; sg_table -&gt; dma_addr_t并将这组资源保存在本地struct aic_de_dmabuf用于释放
DMA-BUF。</p><p class="- topic/p p" data-ofbid="d169287e259__20250123155218">这里面有一个假设sg_table 中只有一个 sg。也就是说单个 DMA-BUF 必须是物理连续的,不能是多块 buf
拼起来的,否则物理地址 dma_addr_t 就不能代表多块 buf
的起始地址。</p><p class="- topic/p p" data-ofbid="d169287e262__20250123155218">对于释放过程APP 需要先通知 FB 驱动要释放的 fb[],然后再使用用户态文件接口 close()逐个关闭 fb[]。</p><div class="- topic/note note note note_note" id="display_preserve_memory_managment_process__note_pc3_q1g_d1c" data-ofbid="display_preserve_memory_managment_process__note_pc3_q1g_d1c"><span class="note__title">注:</span> <div class="note__body">
<p class="- topic/p p" data-ofbid="d169287e266__20250123155218">之所以申请“一组 fd[]”,是因为 video 播放过程中为了边显示边解码,至少需要两套 Buffer 来实现乒乓效果(实际应用中为了更流畅,可能还需要申请多套
Buffer 构成循环
Buffer。这里说的“一套 Buffer”对应视频的一帧数据而一帧视频数据往往分成 YUV 三个分量,每个分量在解码过程中是需要分别处理(对应 DE 寄存器中 addr0、addr1、addr2所以“一套 Buffer”应该是
Y、U、V 共 3 个 Buffer。对于乒乓结构的 Buffer就需要申请 3*2=6 个 BUF 的 fd。</p>
</div></div><p class="- topic/p p" data-ofbid="d169287e269__20250123155218">UI Layer 的 buffer 申请,是直接调用通用 DMA 接口 <span class="+ topic/keyword pr-d/apiname keyword apiname">dma_alloc_coherent()</span>,最终在
CMA 内存中分配。这样并不影响 Video Layer 的 buffer 走 DMA-BUF 申请CMA 模块内部会处理好来自各种接口的 Buffer
申请。</p></section>
</div>
</article></main></div>
</div>
<nav role="navigation" id="wh_topic_toc" aria-label="On this page" class="col-lg-2 d-none d-lg-block navbar d-print-none">
<div id="wh_topic_toc_content">
<div class=" wh_topic_toc "><div class="wh_topic_label">在本页上</div><ul><li class="section-item"><div class="section-title"><a href="#display_preserve_memory_managment_process__section_w5d_21g_d1c" data-tocid="display_preserve_memory_managment_process__section_w5d_21g_d1c">CMA</a></div></li><li class="section-item"><div class="section-title"><a href="#display_preserve_memory_managment_process__section_gvd_21g_d1c" data-tocid="display_preserve_memory_managment_process__section_gvd_21g_d1c">DMA-BUF</a></div></li></ul></div>
</div>
</nav>
</div>
</div>
</div>
<footer class="navbar navbar-default wh_footer">
<div class=" footer-container mx-auto ">
<title>footer def</title>
<style><!--
.p1 {
font-family: FangZhengShuSong, Times, serif;
}
.p2 {
font-family: Arial, Helvetica, sans-serif;
}
.p3 {
font-family: "Lucida Console", "Courier New", monospace;
}
--></style>
<div class="webhelp.fragment.footer">
<p class="p1">Copyright © 2019-2024 广东匠芯创科技有限公司. All rights reserved.</p>
</div><div>
<div class="generation_time">
Update Time: 2025-01-23
</div>
</div>
</div>
</footer>
<button id="go2top" class="d-print-none" title="返回顶部">
<span class="oxy-icon oxy-icon-up"></span>
</button>
<div id="modal_img_large" class="modal">
<span class="close oxy-icon oxy-icon-remove"></span>
<div id="modal_img_container"></div>
<div id="caption"></div>
</div>
<script src="${pd}/publishing/publishing-styles-AIC-template/js/custom.js" defer="defer"></script>
</body>
</html>