# 功能

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

Qualcomm Linux 内核包括 CPU 调度器、CPU 频率调节器、动态电压和频率调节 (DVFS) 以及内存管理等功能。本指南对每个功能都进行了介绍并且提供了相关的参考资料链接。此外，Qualcomm 还新增了一个名为 PerfHAL 的功能来提高性能。

## CPU 调度器

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

CPU 调度器管理 CPU 时间在 Linux 系统中运行的进程之间的分配方式。

它使用 EEVDF（最早符合条件的虚拟截止时间优先）调度器，这是 Linux 内核提供的一种功能。EEVDF CPU 调度器使用“每实体负载跟踪”(PELT) 来监测任务的负载。

如需了解更多信息，请访问：

- [适用于 Linux 的 EEVDF CPU 调度器](https://lwn.net/Articles/925371/)
- [每实体负载跟踪 \[LWN.net\]](https://lwn.net/Articles/531853/)

利用率钳位（UCLAMP 或 util clamp）是一种有助于管理任务性能需求的调度器功能。

如需了解更多信息，请访问：

- [https://docs.kernel.org/scheduler/sched-util-clamp.html](https://docs.kernel.org/scheduler/sched-util-clamp.html)
- [定制 CPU 调度器](https://docs.qualcomm.com/doc/80-70015-10SC/topic/18-customize.html#customize-scheduler)

## CPU 频率调节器

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

CPU 频率调节器根据任务负载调整 CPU 频率。CPU 调度器为该进程提供必要的输入。

Qualcomm Linux 使用 Linux 内核提供的 `schedutil` 调节器功能。

该调节器可在系统承受高负载时提高频率，在负载减少时降低频率，从而确保达到功耗与性能之间的最佳平衡。

如需了解更多信息，请访问：
- [https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)
- [配置 CPU](https://docs.qualcomm.com/doc/80-70015-10SC/topic/14-configure.html#cpu)
- [定制 CPU 频率调节器](https://docs.qualcomm.com/doc/80-70015-10SC/topic/18-customize.html#cpu-frequency-governer)

## DVFS 调节器

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

DVFS 调节器根据系统工作负载控制 CPU 缓存 (L3)、最后一级缓存控制器 (LLCC) 和 DDR 的频率。

这些调节器可在高工作负载时增加频率，在低工作负载时降低频率，从而确保在功耗与性能之间达到最佳平衡。

Qualcomm Linux 支持两种用于 L3 缓存、LLCC 和 DDR 的 DVFS 调节器。

### 静态映射 DVFS 调节器

这种调节器将 CPU L3 缓存和 DDR 的频率调整为与当前 CPU 的频率一致，以平衡功耗与性能要求。

例如，如果 CPU 频率达到其最大频率，则 L3 缓存和 DDR 的频率也必须达到最大值。

静态映射在 arch/arm64/boot/dts/qcom/&lt;target&gt;.dtsi 的源代码中提供。

有关定制选项，参见[定制静态映射 DVFS 调节器](https://docs.qualcomm.com/doc/80-70015-10SC/topic/18-customize.html#dvfs_0__section_u1x_jps_51c_caharris_03-20-24-2005-37-832)。

### BWMON 调节器

带宽监测 (BWMON) 调节器根据测得的从 CPU 流向 LLCC 再流向 DDR 的流量，动态调整 LLCC 和 DDR 的频率。

BWMON 硬件模块测量此流量。该模块在指定采样窗口内监测内存与其他子系统之间的数据吞吐量，并利用这一信息来调整 LLCC 和 DDR 频率，以满足所需带宽。

BWMON 调节器驱动程序在 drivers/soc/qcom/icc-bwmon.c 的源代码中提供。

如需了解更多信息，请访问：

- [\[PATCH v3 0/4\] soc/arm64: qcom: Add initial version of bwmon](https://lwn.net/ml/linux-kernel/20220531105137.110050-1-krzysztof.kozlowski@linaro.org/)
- [定制 BWMON 调节器](https://docs.qualcomm.com/doc/80-70015-10SC/topic/18-customize.html#dvfs_0__section_qxs_4ps_51c_caharris_03-20-24-2007-2-926)

## PerfHAL

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

PerfHAL 是 Qualcomm 专有的一项服务，该服务使 perflock API 可访问，从而提供附加功能。如需在短期内提高性能或降低功耗，可以使用该服务。

Perflock 可帮助修改系统行为，以管理间歇性工作负载。例如，如果特定的代码段必须在较高的 CPU 频率下运行一段时间，则可以在该代码中使用 perflock 来提高 CPU 频率。

PerfHAL 高效处理来自多个客户端的并行 perflock 请求。当有多个目标为同一个资源的请求时，PerfHAL 将这些请求聚合在一起，以达到设备所需的最佳性能水平。

当客户端的 perflock 不再处于活动状态时，PerfHAL 会释放与该客户端相关的所有 perflock。

### Perflock API

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

应用程序可以通过 Perflock API 基于具体用例调整系统参数，使之达到性能和功耗目标。

用户空间应用程序使用 perf\_lock\_acq() 和 perf\_lock\_rel() API 请求系统可调参数在设定时段或不确定时段内的具体值。

### 获取 perflock

perf\_lock\_acq() 函数用于获取 perflock 及必要优化。

此函数的语法如下：

`int perf_lock_acq(int handle, int duration, int list[], int numArgs)`

Table : perf_lock_acq API 参数

| 参数 | 说明 |
| --- | --- |
| `handle` | 标识客户端请求。 |
| `duration` | <ul class="ul" id="perflockapi__ul_fhn_fmz_q1c"><br>                                        <li class="li">表示需要拥有 perflock 的最长超时时间（单位为毫秒）。</li><br><br>                                        <li class="li"><code class="ph codeph">duration</code> 参数可设为确定时间或不确定时间 <code class="ph codeph">(0)</code><ul class="ul" id="perflockapi__ul_htm_rps_s1c"><br>                                                <li class="li">确定型 perflock 需要通过一个正整数值来指定最大超时时间。将创建一个定时器，定时器达到定时值时便会释放 perflock</li><br><br>                                                <li class="li">不确定型 perflock 将保留到客户端调用释放函数为止。要手动释放设为不确定时段的 perflock，可使用 <span class="keyword apiname">perf_lock_rel()</span> 函数。</li><br><br>                                            </ul><br></li><br><br>                                    </ul> |
| `list` | 资源操作码和值对的数组。操作码指示系统参数（资源）和设置值（级别）。 |
| `numArgs` | 列表数组中的元素数。 |

Table : perf_lock_acq API 返回值和结果

| 返回值 | 结果 |
| --- | --- |
| 非零整数 | 成功 |
| -1 | 失败 |

### Perflock 释放

perf\_lock\_rel() 函数用于释放 perf\_lock\_acq() API 持有的 perflock。此函数仅用于设置为不确定持续时间的 perflock。此函数的语法如下：

`int perf_lock_rel(int handle)`

Table : perf_lock_rel API 参数

| 参数 | 说明 |
| --- | --- |
| `handle` | <ul class="ul" id="perflockapi__ul_vhd_bxz_q1c"><br>                                        <li class="li">跟踪唯一请求</li><br><br>                                        <li class="li">传递 <code class="ph codeph">perf_lock_acq</code> 返回的同一句柄以释放锁</li><br><br>                                    </ul> |

Table : perf_lock_rel API 返回值和结果

| 返回值 | 结果 |
| --- | --- |
| 非零整数 | 成功 |
| -1 | 失败 |

### 资源操作码

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

Perflock 使用操作码及其相应值的组合对 perflock 资源执行特定操作。

下表列出了支持的操作码：

Note: QCS9075 不支持操作码 0x44008200 和 0x4400C200 以及包含 `policy7` 的命令。

Table : 支持的操作码

| 操作码 | 用途 | 设备上的 Sysnode |
| --- | --- | --- |
| 0x44000000 | 设置单个任务和任务组可接受的最低性能级别。 | /proc/sys/kernel/sched\_util\_clamp\_min |
| 0x44004000 | 设置单个任务和任务组可接受的最高性能级别。 | /proc/sys/kernel/sched\_util\_clamp\_max |
| 0x44008100 | 设置小核群集的最小频率。 | /sys/devices/system/cpu/cpufreq/policy0/scaling\_min\_freq |
| 0x44008000 | 设置大核群集的最小频率。 | /sys/devices/system/cpu/cpufreq/policy4/scaling\_min\_freq |
| 0x44008200 | 设置超大核群集的最小频率。 | /sys/devices/system/cpu/cpufreq/policy7/scaling\_min\_freq |
| 0x4400C100 | 设置小核群集的最大频率。 | /sys/devices/system/cpu/cpufreq/policy0/scaling\_max\_freq |
| 0x4400C000 | 设置大核群集的最大频率。 | /sys/devices/system/cpu/cpufreq/policy4/scaling\_max\_freq |
| 0x4400C200 | 设置超大核群集的最大频率。 | /sys/devices/system/cpu/cpufreq/policy7/scaling\_max\_freq |

以下是资源操作码的一些示例：

- 0x44004100, 1958400：这一对操作码和值表示小核群集的最小频率必须设置为 1958400 KHz。
- 0x44004100, 1958400, 0x44008100, 2100000：这一对操作码和值表示小核群集的最小频率必须设置为 1958400 KHz。小核群集的最大频率必须设置为 2100000 KHz。

有关如何使用和调试 perflock 的更多信息，参见[定制 perflock](https://docs.qualcomm.com/doc/80-70015-10SC/topic/18-customize.html#customize-perlocks)。

## 内存

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

Qualcomm Linux 软件分配内存时使用 RAM。有效管理 RAM 对满足性能要求及确保应用程序运行顺畅至关重要。

Figure : 内存分区
            ![](data:image/png;base64,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)

RAM 的某些部分独立于 Linux 系统进行管理。例如，从这些特定 RAM 分区运行的 Modem、视频和音频等固件。Linux 内核管理所有其他 RAM 分区。

Linux 内核自带内存管理子系统，其中包含：

- 实现虚拟内存和按需分页
- 内核内部结构与用户空间程序的内存分配
- 文件映射到进程的地址空间
- 其他内存管理操作

### RAM 内存分区

下表描述了各种类型的内存分配。
Note: 应在设备上运行下表列出的命令。

| RAM 分类 | 内存段 | 分配类型 | 说明 |
| --- | --- | --- | --- |
| 非 Linux | – | – | <ul class="ul" id="memory__ul_p5v_h2m_41c"><br>                                        <li class="li">除 Linux 外，各种子系统也通过划分的形式保留内存。</li><br><br>                                        <li class="li">这些划分形式在相应 DTSI 文件中指定。</li><br><br>                                    </ul> |
| Linux（系统 RAM） | 静态内核 | Vmlinux + 内核页结构 | <ul class="ul" id="memory__ul_gzq_52m_41c"><br>                                        <li class="li">内核在启动时保留此内存供自己使用。</li><br><br>                                        <li class="li">Vmlinux 内存用于存储 vmlinux 镜像。</li><br><br>                                        <li class="li">Vmlinux 镜像的大小和细分情况，可以从启动时的 <code class="ph codeph">dmesg</code>日志中获取：<ul class="ul" id="memory__ul_e2b_bfx_3bc_sshewale_05-10-24-1237-20-424"><br>                                                <li class="li"><br>                                                  <pre class="pre screen" id="memory__screen_vx1_t1x_pcc">内存大小： 3061872K/4134912K available (28800K kernel code, 2090K rwdata, 10688K rodata, 3072K init, 969K bss, 679824K reserved, 393216K cma-reserved)<span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre><br><br>                                                </li><br><br>                                                <li class="li"><br>                                                  <pre class="pre screen" id="memory__screen_b14_51x_pcc">Kernel code + rwdata + rodata+init +bss indicates vmlinux kernel image size (28800k+2090k+10688k+3072k+969k)<span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre><br><br>                                                </li><br><br>                                            </ul><br></li><br><br>                                        <li class="li">内核页结构是内核在维护每一个 RAM 页的结构时所使用的内存。其计算方法为每 GB RAM 为 16 MB。</li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | Slab | <ul class="ul" id="memory__ul_mlr_t1r_51c_caharris_03-20-24-1456-13-798"><br>                                        <li class="li">Slab 由内核使用，旨在提高常用数据结构使用内存的速度和效率。</li><br><br>                                        <li class="li">要查看 slab 的内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_xng_v1r_51c_caharris_03-20-24-1456-41-577"><code>cat /proc/meminfo | grep -i slab</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                        <li class="li">要了解各种 slab 的分解及用法，可在内核配置中启用 <code class="ph codeph">CONFIG_SLUB_DEBUG</code>，然后运行以下命令：<pre class="pre codeblock" id="memory__codeblock_jfy_bbr_51c_caharris_03-20-24-1458-38-979"><code>cat /proc/slabinfo</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | 内核堆栈 | <ul class="ul" id="memory__ul_dpy_vbx_t1c_caharris_03-17-24-2104-3-233"><br>                                        <li class="li">内核堆栈存储每个进程的调用堆栈。</li><br><br>                                        <li class="li">要查看内核栈的内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_ypc_hbr_51c_caharris_03-20-24-1500-9-838"><code>cat /proc/meminfo | grep -i kernelstack</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | PageTables | <ul class="ul" id="memory__ul_omh_jbr_51c_caharris_03-20-24-1500-48-282"><br>                                        <li class="li">内核使用内存来存储将虚拟地址映射到物理地址的 PageTables</li><br><br>                                        <li class="li">要查看 PageTables 的内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_cjx_4br_51c_caharris_03-20-24-1502-26-888"><code>cat /proc/meminfo | grep -i PageTables</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | 模块 | <ul class="ul" id="memory__ul_lk4_qbr_51c_caharris_03-20-24-1502-55-991"><br>                                        <li class="li">以内核模块的形式表示动态加载到内核中的内核实体。</li><br><br>                                        <li class="li">要显示已加载内核模块的列表及其内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_cch_tbr_51c_caharris_03-20-24-1503-43-770"><code>cat /proc/modules</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | Vmalloc | <ul class="ul" id="memory__ul_t4t_vbr_51c_caharris_03-20-24-1504-27-363"><br>                                        <li class="li">用于分配连续内存。</li><br><br>                                        <li class="li">要查看 vmalloc 内存分解情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_lnx_xbr_51c_caharris_03-20-24-1505-5-185"><code>cat /proc/vmallocinfo</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | 缓存（内核 + 用户空间） | <ul class="ul" id="memory__ul_gys_zbr_51c_caharris_03-20-24-1505-37-238"><br>                                        <li class="li">驻留在 RAM 中的由文件支持的内存量。</li><br><br>                                        <li class="li">要查看缓存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_jd3_dcr_51c_caharris_03-20-24-1506-40-239"><code>cat /proc/meminfo | grep -i cached</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | 缓冲区 | <ul class="ul" id="memory__ul_g3t_vv2_4bc_sshewale_05-29-24-1054-24-346"><br>                                        <li class="li">缓冲区的大小固定，包含从磁盘读取或写入磁盘的信息块。</li><br><br>                                        <li class="li">要查看缓冲区内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_p22_3cr_51c_caharris_03-20-24-1508-5-447"><code>cat /proc/meminfo | grep -i Buffers</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 动态内核 | Shmem | <ul class="ul" id="memory__ul_lkb_1w2_4bc_sshewale_05-29-24-1055-40-115"><br>                                        <li class="li">共享内存是映射到两个或更多进程的地址空间的公共内存块。</li><br><br>                                        <li class="li">要查看共享内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_rtk_ncr_51c_caharris_03-20-24-1509-37-775"><code>cat /proc/meminfo | grep -i shmem</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 用户空间 | ZUSED (ZRAM) | 由 ZRAM 进行后压缩的匿名内存。 |
| Linux（系统 RAM） | 用户空间 | CMA | <ul class="ul" id="memory__ul_khp_pcr_51c_caharris_03-20-24-1510-15-988"><br>                                        <li class="li">物理连续内存通常映射到其他 IP（如视频和显示），但分配到 runtime。</li><br><br>                                        <li class="li">系统可以使用的可用内存会随着更多 CMA 预留内存的使用而减少。只有可移动分配（例如用户空间进程分配）才能使用 CMA 预留的可用内存。但不能用于内核分配。</li><br><br>                                    </ul> |
| Linux（系统 RAM） | 用户空间 | ANON | <ul class="ul" id="memory__ul_mss_bw2_4bc_sshewale_05-29-24-1056-9-392"><br>                                        <li class="li">用户空间应用程序使用 <span class="keyword apiname">malloc()</span> 或 <span class="keyword apiname">new()</span> 函数调用分配的内存。</li><br><br>                                        <li class="li">要获取进程的 ANON 内存分解，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_jr1_zcr_51c_caharris_03-20-24-1513-1-867"><code>cat /proc/&lt;pid&gt;/smaps</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 用户空间 | ION | <ul class="ul" id="memory__ul_km4_1dr_51c_caharris_03-20-24-1513-28-778"><br>                                        <li class="li">ION 内存允许在硬件 IP（如视频、摄像头和 Qualcomm Linux 软件）之间共享缓冲区。</li><br><br>                                        <li class="li">ION 管理一个或多个内存池，这些内存池在启动时可以预留出来以防止碎片化。</li><br><br>                                        <li class="li">要查看 ION 内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_zmc_vlg_v1c_caharris_03-22-24-1750-46-225"><code>mount -t debugfs none /sys/kernel/debug</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre><pre class="pre codeblock" id="memory__codeblock_rcx_ddr_51c_caharris_03-20-24-1514-27-337"><code>cat /sys/kernel/debug/dma_buf/bufinfo | grep bytes</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre><br>                                        </li><br><br>                                    </ul> |
| Linux（系统 RAM） | 用户空间 | KGSL | <ul class="ul" id="memory__ul_onb_3dr_51c_caharris_03-20-24-1515-40-628"><br>                                        <li class="li">图形驱动程序分配的内存。</li><br><br>                                        <li class="li">要查看内核图形支持层 (KGSL) 整体内存使用情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_pnf_kdr_51c_caharris_03-20-24-1516-18-485"><code>cat /sys/class/kgsl/kgsl/page_alloc</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                        <li class="li">要查看进程级别分解情况，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_g4k_mdr_51c_caharris_03-20-24-1516-57-34"><code>cat /sys/class/kgsl/kgsl/proc/&lt;pid&gt;/kernel</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
| Linux（系统 RAM） | 空闲内存 | – | <ul class="ul" id="memory__ul_vrz_d2s_51c_caharris_03-20-24-1840-7-435"><br>                                        <li class="li">空闲内存是指尚未使用并可用于任何分配的内存。</li><br><br>                                        <li class="li">要查看空闲内存，可运行以下命令：<pre class="pre codeblock" id="memory__codeblock_u1g_qdr_51c_caharris_03-20-24-1518-4-285"><code>cat /proc/meminfo | grep -i MemFree</code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></li><br><br>                                    </ul> |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |

## 实时内核

Source: [https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70015-10SC/topic/2-performance-features.html)

实时 (RT) Linux 是一个可选功能，默认情况下在 Qualcomm Linux 上不启用。可以根据产品要求启用该功能。

RT Linux 旨在为时间敏感型应用提供确切并且可预测的行为。

### 设置工作区

在 Qualcomm Linux 中，RT Linux 内核配方称为 `linux-qcom-base-rt`（标准版 BSP）和
                    `linux-qcom-custom-rt`（定制版 BSP）。

Qualcomm Linux 内核支持长期支持 (LTS) RT 内核 v6.6，该内核通过源代码中 `meta-qcom-realtime` 层中以下路径的 Yocto recipe 进行维护：

- 标准版 BSP：recipes-kernel/linux/linux-kernel-base-rt\_6.6.bb
- 定制版 BSP：`recipes-kernel/linux/linux-kernel-custom-rt_6.6.bb`。

有关如何克隆工作区以及获取使用 Qualcom RT Linux 内核所需的所有元数据层的更多信息，参见[与实时 Linux 同步并进行编译](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#sync-and-build-with-real-time-linux)。

### 启用 RT 内核

RT 内核是使用 Linux RT 内核 recipe 启用的。该 recipe 获取内核，下载抢占 RT 补丁，并将这些补丁应用于内核。它还可以通过以下配置启用可完全抢占的内核：

`CONFIG_PREEMPT_RT=y`

有关详细信息，参见 [Qualcomm Linux 内核指南](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/overview.html)。

### 验证内核类型

启动后，可通过在设备上运行以下命令验证内核类型：

    uname -vCopy to clipboard

以下是命令的输出：

    SMP PREMPT_RTCopy to clipboard

Last Published: Nov 28, 2024

[Previous Topic
入门指南](https://docs.qualcomm.com/bundle/publicresource/80-70015-10SC/topics/get-started.md) [Next Topic
分析工具](https://docs.qualcomm.com/bundle/publicresource/80-70015-10SC/topics/13-performance_tools.md)