# 地址空间映射

## 概述

地址空间是一个逻辑概念，用于统一编址处理器可以访问的所有存储单元和外设控制器，例如：

- Boot ROM：存储初始启动代码的固化存储器。
- SRAM：芯片内部的高速存储器，用于存储关键代码或临时数据。
- DDR：外部的动态随机存储器，提供大容量存储空间，用于操作系统、应用程序及大规模数据处理。
- 外设控制器的寄存器：控制和操作芯片中外设模块的硬件寄存器。
- 保留区域：未分配实际用途的地址空间，预留供未来扩展或升级

通过统一的地址空间设计，处理器可以高效地访问和管理系统中的各类资源。<br>
X5 地址空间如下表<a id="address_space_table"></a>：

| 起始地址 | 解释地址 | 域 | 大小 | 描述 |
|:-------------|:---------- |:------|:--------|:--------------|
|0x0_0000_0000	|0x0_0001_FFFF	|Boot ROM	|128KB			|**Boot ROM**|
|0x0_0002_0000	|0x0_1FE7_FFFF	|Reserved	|510.375MB		|Reserved|
|0x0_1FE8_0000	|0x0_1FEF_FFFF	|SRAM 0		|512KB			|**SRAM 0**|
|0x0_1FF0_0000 	|0x0_1FFF_FFFF 	|SRAM 1    	|1024KB  		|**SRAM 1** |
|0x0_2000_0000 	|0x0_2001_FFFF 	|AON SRAM  	|128KB   		|**AON-SRAM**|
|0x0_2020_0000	|0x0_2022_FFFF	|HIFI5 SRAM |192KB			|**HIFI5 internal RAM**|
|0x0_2023_0000	|0x0_202F_FFFF	|Reserved	|832KB			|Reserved|
|0x0_2030_0000	|0x0_203F_FFFF	|secure		|1MB			|secure-IP|
|0x0_2040_0000	|0x0_2040_FFFF	|N/A		|64KB			|reserved|
|0x0_2041_0000	|0x0_204F_FFFF	|Reserved	|960KB			|Reserved|
|0x0_2050_0000	|0x0_2050_FFFF	|CPU_NOC	|64KB			|CPU_NOC|
|0x0_2051_0000	|0x0_2051_FFFF	|NOC_APB	|64KB			|VIN_NOC|
|0x0_2052_0000	|0x0_2052_FFFF	|			|64KB			|BPU_NOC|
|0x0_2053_0000	|0x0_2053_FFFF	|			|64KB			|Codec_NOC|
|0x0_2054_0000	|0x0_2054_FFFF	|			|64KB			|GPU_NOC|
|0x0_2055_0000	|0x0_2055_FFFF	|			|64KB			|HSIO_NOC|
|0x0_2056_0000	|0x0_2056_FFFF	|			|64KB			|HIFI5_NOC|
|0x0_2057_0000	|0x0_2057_FFFF	|			|64KB			|AXIS_NOC|
|0x0_2058_0000	|0x0_2BFF_FFFF	|Reserved	|186.5MB		|	Reserved	|
|0x0_2c00_0000	|0x0_2c01_3FFF	|CoreSight	|80KB			|a55 System debug component|
|0x0_2C00_A000	|0x0_2CFF_FFFF	|Reserved	|15.9609375MB	|Reserved	|
|0x0_2D00_0000	|0x0_2DFF_FFFF	|CoreSight	|16MB			|CoreSight cluster debug	|
|0x0_2E00_0000	|0x0_2FFF_FFFF	|CoreSight	|32MB			|Reserved	|
|0x0_3000_0000	|0x0_300F_FFFF	|reserved	|1MB			|	Reserved	|
|0x0_3010_0000	|0x0_3024_FFFF	|GIC		|1.3125MB		|GPU_GIC	|
|0x0_3025_0000	|0x0_30FF_FFFF	|Reserved	|13.6875MB		|Reserved|
|0x0_3100_0000	|0x0_3100_FFFF	|AON-APB	|64KB			|GPIO	|
|0x0_3101_0000	|0x0_3101_FFFF	|			|64KB			|RTC	|
|0x0_3102_0000	|0x0_3102_FFFF	|			|64KB			|AON_CRM	|
|0x0_3103_0000	|0x0_3103_FFFF	|			|64KB			|PMU	|
|0x0_3104_0000	|0x0_3104_7FFF	|			|32KB			|NON_SEC_SLCR	|
|0x0_3104_8000	|0x0_3104_FFFF	|			|32KB			|SEC_SLCR	|
|0x0_3105_0000	|0x0_3105_FFFF	|			|64KB			|Function TS 	|
|0x0_3106_0000 	|0x0_3106_FFFF 	|			|64KB 			|mpu	|
|0x0_3107_0000	|0x0_3107_FFFF	|			|64KB			|Function TS read only|
|0x0_3108_0000	|0x0_3207_FFFF	|Reserved	|16MB			|Reserved|
|0x0_3208_0000	|0x0_3208_FFFF	|DSP-APB	|64KB			|AXI-DMA|
|0x0_3209_0000	|0x0_3209_FFFF	|			|64KB			|Timer	|
|0x0_320A_0000	|0x0_320A_FFFF	|			|64KB			|I2C	|
|0x0_320B_0000	|0x0_320B_FFFF	|			|64KB			|I2S0	|
|0x0_320C_0000	|0x0_320C_FFFF	|			|64KB			|I2S1	|
|0x0_320D_0000	|0x0_320D_FFFF	|			|64KB			|PDM	|
|0x0_320E_0000	|0x0_320E_FFFF	|			|64KB			|reserved	|
|0x0_320F_0000	|0x0_320F_FFFF	|			|64KB			|reserved	|
|0x0_3210_0000	|0x0_3210_FFFF	|			|64KB			|reserved	|
|0x0_3211_0000	|0x0_3211_FFFF	|			|64KB			|SPI	|
|0x0_3212_0000	|0x0_3212_FFFF	|			|64KB			|UART	|
|0x0_3213_0000	|0x0_3213_FFFF	|			|64KB			|SLCR	|
|0x0_3214_0000	|0x0_3214_FFFF	|			|64KB			|CRM	|
|0x0_3215_0000	|0x0_3215_FFFF	|			|64KB			|GPIO	|
|0x0_3216_0000	|0x0_3216_FFFF	|			|64KB			|MPU_0	|
|0x0_3217_0000	|0x0_3217_FFFF	|			|64KB			|MPU_1|
|0x0_3218_0000	|0x0_3218_FFFF	|Reserved	|64KB			|reserved	|
|0x0_3219_0000	|0x0_3219_FFFF	|Reserved	|64KB			|reserved	|
|0x0_321a_0000	|0x0_321F_FFFF	|Reserved	|384KB			|Reserved	|
|0x0_3300_0000	|0x0_3300_FFFF	|DSP-SUB	|64KB			|mailbox	|
|0x0_3301_0000	|0x0_33FF_FFFF	|Reserved	|15.9375MB		|Reserved|
|0x0_3400_0000	|0x0_3400_FFFF	|LSIO_SUB	|64KB			|SPI0	|
|0x0_3401_0000	|0x0_3401_FFFF	|			|64KB			|SPI1	|
|0x0_3402_0000	|0x0_3402_FFFF	|			|64KB			|SPI2	|
|0x0_3403_0000	|0x0_3403_FFFF	|			|64KB			|SPI3	|
|0x0_3404_0000	|0x0_3404_FFFF	|			|64KB			|SPI4	|
|0x0_3405_0000	|0x0_3405_FFFF	|			|64KB			|SPI5	|
|0x0_3406_0000	|0x0_3406_FFFF	|			|64KB			|UART0_4-wire	|
|0x0_3407_0000	|0x0_3407_FFFF	|			|64KB			|UART1_2-wire	|
|0x0_3408_0000	|0x0_3408_FFFF	|			|64KB			|UART2_2-wire	|
|0x0_3409_0000	|0x0_3409_FFFF	|			|64KB			|UART3_2-wire	|
|0x0_340A_0000	|0x0_340A_FFFF	|			|64KB			|UART4_2-wire	|
|0x0_340B_0000	|0x0_340B_FFFF	|			|64KB			|I2C0|
|0x0_340C_0000	|0x0_340C_FFFF	|			|64KB			|I2C1	|
|0x0_340D_0000	|0x0_340D_FFFF	|			|64KB			|I2C2	|
|0x0_340E_0000	|0x0_340E_FFFF	|			|64KB			|I2C3	|
|0x0_340F_0000	|0x0_340F_FFFF	|			|64KB			|I2C4	|
|0x0_3410_0000	|0x0_3410_FFFF	|			|64KB			|LPWM0	|
|0x0_3411_0000	|0x0_3411_FFFF	|			|64KB			|LPWM1	|
|0x0_3412_0000	|0x0_3412_FFFF	|			|64KB			|GPIO0	|
|0x0_3413_0000	|0x0_3413_FFFF	|			|64KB			|GPIO1	|
|0x0_3414_0000	|0x0_3414_FFFF	|			|64KB			|PWM0	|
|0x0_3415_0000	|0x0_3415_FFFF	|			|64KB			|PWM1	|
|0x0_3416_0000	|0x0_3416_FFFF	|			|64KB			|PWM2	|
|0x0_3417_0000	|0x0_3417_FFFF	|			|64KB			|PWM3	|
|0x0_3418_0000	|0x0_3418_FFFF	|			|64KB			|LSIO_SLCR	|
|0x0_3419_0000	|0x0_3419_FFFF	|			|64KB			|ADC	|
|0x0_341A_0000	|0x0_341A_FFFF	|			|64KB			|UART5_2-wire	|
|0x0_341B_0000	|0x0_341B_FFFF	|			|64KB			|UART6_2-wire	|
|0x0_341C_0000	|0x0_341C_FFFF	|			|64KB			|I2C5	|
|0x0_341D_0000	|0x0_341D_FFFF	|			|64KB			|I2C6	|
|0x0_341E_0000	|0x0_341F_FFFF	|N/A		|128KB			|reserved	|
|0x0_3420_0000	|0x0_3420_FFFF	|A55-APB0	|64KB			|DMA|
|0x0_3421_0000	|0x0_3421_FFFF	|			|64KB			|TOP_CRM	|
|0x0_3422_0000	|0x0_3422_FFFF	|			|64KB			|reserved|
|0x0_3423_0000	|0x0_3423_7FFF	|			|32KB			|NON_SEC_SYS_CTL	|
|0x0_3423_8000	|0x0_3423_FFFF	|			|32KB			|SEC_SYS_CTL	|
|0x0_3424_0000	|0x0_3424_FFFF	|			|64KB			|PVT	|
|0x0_3425_0000	|0x0_3425_FFFF	|			|64KB			|WDT	|
|0x0_3426_0000	|0x0_3426_FFFF	|			|64KB			|timer0	|
|0x0_3427_0000	|0x0_3427_FFFF	|			|64KB			|timer1	|
|0x0_3428_0000	|0x0_34FF_FFFF	|Reserved	|13.5MB			|Reserved	|
|0x0_3500_0000	|0x0_3500_FFFF	|QSPI-AHB	|64KB			|QSPI	|
|0x0_3501_0000	|0x0_3501_FFFF	|HSIO-APB	|64KB			|GMAC	|
|0x0_3502_0000	|0x0_3502_FFFF	|			|64KB			|SDIO0	|
|0x0_3503_0000	|0x0_3503_FFFF	|			|64KB			|SDIO1	|
|0x0_3504_0000	|0x0_3504_FFFF	|			|64KB			|EMMC	|
|0x0_3505_0000	|0x0_3505_FFFF	|			|64KB			|HSIO_SLCR	|
|0x0_3506_0000	|0x0_3506_FFFF	|			|64KB			|HSIO_GPIO0	|
|0x0_3507_0000	|0x0_3507_FFFF	|			|64KB			|HSIO_GPIO1	|
|0x0_3508_0000	|0x0_350F_FFFF	|			|512KB			|reserved	|
|0x0_3510_0000	|0x0_352F_FFFF	|			|2048KB			|USB3.0	|
|0x0_3530_0000	|0x0_354F_FFFF	|			|2048KB			|USB2.0	|
|0x0_3550_0000	|0x0_3551_FFFF	|QSPI-AHB	|128KB			|QSPI XIP flash address	|
|0x0_3580_0000	|0x0_35FF_FFFF	|Reserved	|8MB			|	Reserved	|
|0x0_3600_0000	|0x0_39FF_FFFF	|DDR-CFG	|64MB			|DDR-CFG	|
|0x0_3A00_0000	|0x0_3A00_FFFF	|BPU		|64KB			|BPU		|
|0x0_3A01_0000	|0x0_3A01_FFFF	|			|64KB			|BPU_SCLR	|
|0x0_3A02_0000	|0x0_3AFF_FFFF	|Reserved	|15.875MB		|Reserved	|
|0x0_3B00_0000	|0x0_3B00_FFFF	|video-APB	|64KB			|video codec	|
|0x0_3B01_0000	|0x0_3B01_FFFF	|			|64KB			|MJPEG	|
|0x0_3B02_0000	|0x0_3B02_FFFF	|			|64KB			|CODEC_SLCR	|
|0x0_3B03_0000	|0x0_3BFF_FFFF	|Reserved	|15.8125MB		|Reserved	|
|0x0_3C00_0000	|0x0_3C00_FFFF	|GPU-APB	|64KB			|GC8000L	|
|0x0_3C01_0000	|0x0_3C01_FFFF	|			|64KB			|GC820	|
|0x0_3C02_0000	|0x0_3C02_FFFF	|			|64KB			|GPU_SLCR	|
|0x0_3C03_0000	|0x0_3CFF_FFFF	|Reserved	|15.8125MB		|Reserved	|
|0x0_3D00_0000	|0x0_3D00_FFFF	|Camera-APB	|64KB			|ISP8000	|
|0x0_3D01_0000	|0x0_3D01_FFFF	|			|64KB			|DW230	|
|0x0_3D02_0000	|0x0_3D02_FFFF	|			|64KB			|SIF0	|
|0x0_3D03_0000	|0x0_3D03_FFFF	|			|64KB			|SIF1	|
|0x0_3D04_0000	|0x0_3D04_FFFF	|			|64KB			|SIF2	|
|0x0_3D05_0000	|0x0_3D05_FFFF	|			|64KB			|SIF3	|
|0x0_3D06_0000	|0x0_3D06_FFFF	|			|64KB			|MIPI-CSI0	|
|0x0_3D07_0000	|0x0_3D07_FFFF	|			|64KB			|MIPI-CSI1	|
|0x0_3D08_0000	|0x0_3D08_FFFF	|			|64KB			|MIPI-CSI2	|
|0x0_3D09_0000	|0x0_3D09_FFFF	|			|64KB			|MIPI-CSI3	|
|0x0_3D0A_0000	|0x0_3D0A_FFFF	|			|64KB			|csi_wrapper_gpr	|
|0x0_3D0B_0000	|0x0_3D0B_FFFF	|			|64KB			|Camera-SLCR|
|0x0_3D0C_0000	|0x0_3D0C_FFFF	|			|64KB			|GDC	|
|0x0_3D0D_0000	|0x0_3DFF_FFFF	|Reserved	|15.1875MB		|Reserved	|
|0x0_3E00_0000	|0x0_3E00_FFFF	|DIS-APB	|64KB			|DC8000Nano	|
|0x0_3E01_0000	|0x0_3E01_FFFF	|			|64KB			|BT1120	|
|0x0_3E02_0000	|0x0_3E03_FFFF	|			|128KB			|MIPI-CSI TX	|
|0x0_3E04_0000	|0x0_3E05_FFFF	|			|128KB			|DIS_GPIO	|
|0x0_3E06_0000	|0x0_3E07_FFFF	|			|128KB			|MIPI-DSI TX	|
|0x0_3E08_0000	|0x0_3E09_FFFF	|			|128KB			|SIF	|
|0x0_3E0A_0000	|0x0_3E0A_FFFF	|			|64KB			|DIS-SLCR	|
|0x0_3E0B_0000	|0x0_3FFF_FFFF	|Reserved	|31.3125MB		|Reserved	|
|0x0_8000_0000	|0x2_7FFF_FFFF	|LPDDR4/4X	|8GB			|**DDR memory**|

## 内存地址空间

X5 地址空间映射表中展示了 3 种内存的地址空间：

1. Boot ROM：只读存储器（ Read-Only Memory），用于存储芯片启动时的固件代码
2. SRAM：集成在芯片内部，具有高速存取性能，但是容量有限 , 整体大小是 1856KB，详细见 [SRAM 地址空间 ](#sram)
3. SDRAM（ DDR）：外接 LPDDR4/4X，用作系统的主存 , 最大支持 8GB，详细见 [DDR 地址空间 ](#ddr)

后续对 `SRAM 地址空间` 和 `DDR 地址空间` 分别进行详细描述。

### SRAM 和 DDR 地址空间

#### SRAM 地址空间

| 区域 | 起始地址 | 结束地址 |SIZE|
|:---:|:---:|:---:|:---:|
|SRAM0|0x0_1FE8_0000|0x0_1FEF_FFFF|512KB|
|SRAM1|0x0_1FF0_0000|0x0_1FFF_FFFF|1024KB|
|AON SRAM|0x0_2000_0000|0x0_2001_FFFF|128KB|
|HIFI5 SRAM|0x0_2020_0000|0x0_2022_FFFF|128KB|

**注意**：`HIFI5 SRAM` 只能被 ADSP 使用

#### DDR 地址空间

| 区域 | 起始地址 | 结束地址 |SIZE|
|:---:|:---:|:---:|:---:|
|DDR |0x0_8000_0000|0x2_7FFF_FFFF|8GB|


### SRAM 和 DDR 地址空间使用情况

SRAM 和 DDR 被以下组件使用：

- 启动代码：如 BL2 和 BL31 ，用于引导和初始化系统。
- 安全相关代码：包括 OPTEE OS 和 OPTEE 共享内存，用于实现系统的安全功能。
- Linux 系统：作为操作系统运行时的主要内存资源。

| 功能 | 起始地址 | 结束地址 |SIZE| 内存类型 | 是否常驻 | 地址空间是否 Secure|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|BL2|0x1FEA_0000|0x1FEF_C000|368K|**SRAM**| 非常驻 |Non-Secure|
|BL31|0x2000_0000|0x2002_0000|128K|**SRAM**| 常驻 |Secure|
|OPTEE OS|0x8000_0000|0x8200_0000|32M|**DDR**| 常驻 |Secure|
|OPTEE 共享内存 |0x8200_0000|0x8400_0000|32M|**DDR**| 常驻 |Non-Secure|
|UBOOT|0x8800_0000|0x9000_0000|128M|**DDR**| 非常驻 |Non-Secure|
|Linux 系统 |0x8400_0000| 0x8000_0000 + DDR 容量 |DDR 容量 - 64MB|**DDR**| 常驻 |Non-Secure|

- 上述表格中 **是否常驻** 存在两种情况：非常驻和常驻
  - 非常驻：在对应的阶段启动过程结束后，就不再使用，后续代码可以使用
  - 常驻：在对应的阶段启动过程结束后，会一直使用
- 上述表格中 **地址空间是否 Secure** 存在两种选型： Non-Secure 和 Secure
  - Secure
    - 用于存储和执行高安全性要求的代码和数据。
    - 只有在安全世界（ Secure World）运行的代码可以访问。
    - 常用于运行信任固件（如 ARM TrustZone 中的 BL31 或 OPTEE OS），以保护敏感数据（例如密码、密钥）和功能。
  - Non-Secure
    - 用于存储和执行一般用途的代码和数据。
    - 可以被非安全世界（ Non-Secure World）访问。
- UBOOT 的内存空间说明如下：
  - UBOOT 的起始地址为 0x8800_0000，结束地址为 0x9000_0000。这与 Linux 系统的内存空间（0x8400_0000 - 0x8000_0000 + DDR 容量）存在重叠。
  这是因为 UBOOT 的内存是非常驻的。UBOOT 启动完成后，内存会被释放，之后内核可以重新使用从 0x8800_0000 到 0x9000_0000 这一段区域。
- Linux 系统的起始地址、结束地址、 Size 大小解释如下：
  - 起始地址是 0x8400_0000 ，原因如下：
    - DDR 地址空间的起始地址是 0x8000_0000
    - OPTEE OS 和 OPTEE 共享内存共占用了 64MB 的空间
  - 结束地址是 0x8000_0000 + DDR 容量 ，原因如下：
    - DDR 地址空间的起始地址是 0x8000_0000
    - DDR 地址空间最大是 8G，结束地址由实际接入的 DDR 容量决定
  - Size 是 DDR 容量 - 64MB， 原因如下：
    - OPTEE OS 和 OPTEE 共享内存共占用了 64MB 的空间

#### Linux 系统内存使用情况

从 [ DDR 地址空间 ](#id2) 中的描述可以知道，默认情况下 Linux 系统可以访问的 DDR 范围是：

- 起始地址： 0x8400_0000
- 终止地址： 0x8000_0000 + DDR 容量

Linux Kernel 的设备树中会保留部分内存，作为某些模块的专用内存，下表列出设备树保留的所有内存：

| 内存划分 | 内存作用 | 内存区域 | 内存大小 |
| ---- | ---- | ---- | ---- |
| uboot_log_reserved | 用于在内核获取启动日志 | 0x87FFC000..0x87FFFFFF | 16KB(0x4000) |
| cma | 内核 CMA 内存区域 | 0x88000000..0x9FDFFFFF | 382MB(0x17E00000) |
| firewall_ddr_default | 当发生违反 firewall 访问时被自动导向的地址 | 0x9FE7F000..0x9FE7FFFF | 4KB(0x1000) |
| adsp_ddr | ADSP 固件在内存使用的空间 | 0x9FE80000..0xA207FFFF | 34MB(0x2200000) |
| ramoops | 内核 ramoops 使用的临时内存 | 0xA4080000..A40BFFFF | 256KB(0x40000) |
| ion |ION 区域 | 0xA4100000..(ION 截止地址 ) | 根据用户配置变化 |

- ION 区域请参考 [X5 默认的 ION 预留内存 ](./memory_layout.html#span-id-default-ion-ion)
- 保留的地址空间定义在 BSP 源码包的 kernel 文件夹下的 `arch/arm64/boot/dts/hobot/x5-memory.dtsi` 文件

可以通过 `cat /proc/iomem` 命令获取系统内存的分配情况（4GB 内存的板端系统为例）：

```bash
分析系统内存：
# cat /proc/iomem
20500000-205000ff : 20500000.cpu_ace_qos cpu_ace_qos@20500000
20500100-2050017f : 20500100.cpu_perif_qos cpu_perif_qos@20500100
20510000-2051007f : 20510000.bt1120_qos bt1120_qos@20510000
20510080-205100ff : 20510080.dc8000_qos dc8000_qos@20510080
20510100-2051017f : 20510100.dw230_gdc_qos dw230_gdc_qos@20510100
20510180-205101ff : 20510180.dw230_scalar2_qos dw230_scalar2_qos@20510180
20510200-2051027f : 20510200.dw230_scalar3_qos dw230_scalar3_qos@0x20510200
20510280-205102ff : 20510280.isp_axi5_hdr_qos isp_axi5_hdr_qos@20510280
20510300-2051037f : 20510300.isp_axi4_mcm_qos isp_axi4_mcm_qos@20510300
20510380-205103ff : 20510380.isp_axi3_sp2_qos isp_axi3_sp2_qos@20510380
20510480-205104ff : 20510480.isp_axi1_mp_qos isp_axi1_mp_qos@20510480
20510500-2051057f : 20510500.sif0_qos sif0_qos@20510500
20510580-205105ff : 20510580.sif1_qos sif1_qos@20510580
20510600-2051067f : 20510600.sif2_qos sif2_qos@20510600
20510680-205106ff : 20510680.sif3_qos sif3_qos@20510680
20510700-2051077f : 20510700.sif_disp_qos sif_disp_qos@20510700
20520000-2052007f : 20520000.bpu_qos bpu_qos@20520000
20530000-2053007f : 20530000.video_qos video_qos@20530000
20530080-205300ff : 20530080.jpeg_qos jpeg_qos@20530080
20540000-2054007f : 20540000.gpu2d_qos gpu2d_qos@20540000
20540080-2054017f : 20540080.gpu3d_qos gpu3d_qos@20540080
20550000-2055007f : 20550000.dma0_qos dma0_qos@20550000
20550080-205500ff : 20550080.emmc_qos emmc_qos@20550080
20550100-2055017f : 20550100.gmac_qos gmac_qos@20550100
20550180-205501ff : 20550180.sd_qos sd_qos@20550180
20550200-2055027f : 20550200.sdio_qos sdio_qos@20550200
20550280-205502ff : 20550280.security_qos security_qos@20550280
20550300-2055037f : 20550300.usb2_qos usb2_qos@20550300
20550380-205503ff : 20550380.usb3_qos usb3_qos@20550380
20550400-2055047f : 20550400.etr_qos etr_qos@20550400
20560000-2056007f : 20560000.hifi5_qos hifi5_qos@20560000
2c001000-2c001fff : funnel@2c001000
  2c001000-2c001fff : 2c001000.funnel funnel@2c001000
2c002000-2c002fff : etf@2c002000
  2c002000-2c002fff : 2c002000.etf etf@2c002000
2c003000-2c003fff : etr@2c003000
  2c003000-2c003fff : 2c003000.etr etr@2c003000
2c004000-2c004fff : replicator@2c004000
  2c004000-2c004fff : 2c004000.replicator replicator@2c004000
2c005000-2c005fff : tpiu@2c005000
  2c005000-2c005fff : 2c005000.tpiu tpiu@2c005000
2c006000-2c006fff : cti@2c006000
  2c006000-2c006fff : 2c006000.cti cti@2c006000
2d020000-2d020fff : cti@2d020000
  2d020000-2d020fff : 2d020000.cti cti@2d020000
2d040000-2d040fff : etm@2d040000
  2d040000-2d040fff : 2d040000.etm etm@2d040000
2d120000-2d120fff : cti@2d120000
  2d120000-2d120fff : 2d120000.cti cti@2d120000
2d140000-2d140fff : etm@2d140000
  2d140000-2d140fff : 2d140000.etm etm@2d140000
2d220000-2d220fff : cti@2d220000
  2d220000-2d220fff : 2d220000.cti cti@2d220000
2d240000-2d240fff : etm@2d240000
  2d240000-2d240fff : 2d240000.etm etm@2d240000
2d320000-2d320fff : cti@2d320000
  2d320000-2d320fff : 2d320000.cti cti@2d320000
2d340000-2d340fff : etm@2d340000
  2d340000-2d340fff : 2d340000.etm etm@2d340000
2d420000-2d420fff : cti@2d420000
  2d420000-2d420fff : 2d420000.cti cti@2d420000
2d440000-2d440fff : etm@2d440000
  2d440000-2d440fff : 2d440000.etm etm@2d440000
2d520000-2d520fff : cti@2d520000
  2d520000-2d520fff : 2d520000.cti cti@2d520000
2d540000-2d540fff : etm@2d540000
  2d540000-2d540fff : 2d540000.etm etm@2d540000
2d620000-2d620fff : cti@2d620000
  2d620000-2d620fff : 2d620000.cti cti@2d620000
2d640000-2d640fff : etm@2d640000
  2d640000-2d640fff : 2d640000.etm etm@2d640000
2d720000-2d720fff : cti@2d720000
  2d720000-2d720fff : 2d720000.cti cti@2d720000
2d740000-2d740fff : etm@2d740000
  2d740000-2d740fff : 2d740000.etm etm@2d740000
30100000-3010ffff : GICD
30140000-3023ffff : GICR
31000000-3100ffff : 31000000.gpio gpio@31000000
31010000-3101ffff : 31010000.rtc rtc@31010000
31020000-31020fff : 31020000.aon-clock-controller aon-clock-controller@31020000
31021008-3102100b : 31021008.socinfo socinfo
31030000-310310ff : 31030000.power-controller power-controller@31030000
31032000-310330ff : 31032000.idle-controller idle-controller@31032000
31040000-31040013 : 31040000.aon_iomuxc aon_iomuxc@31040000
31040014-31040113 : 31040014.dsp_iomuxc dsp_iomuxc@31040014
32080000-320803ff : 32080000.dma-controller dma-controller@32080000
320a0000-320affff : 320a0000.i2c i2c@320a0000
320d0000-320dffff : 320d0000.archband_pdm archband_pdm@320d0000
32120000-3212001f : serial
32140000-321410ff : 32140000.dsp-clock-controller dsp-clock-controller@32140000
32150000-3215ffff : 32150000.gpio gpio@32150000
33000000-33000fff : 33000000.mailbox0 mailbox0@33000000
34020000-3402ffff : 34020000.spi spi@34020000
34080000-3408001f : serial
340c0000-340cffff : 340c0000.i2c i2c@340c0000
340d0000-340dffff : 340d0000.i2c i2c@340d0000
340f0000-340fffff : 340f0000.i2c i2c@340f0000
34100000-3410ffff : 34100000.lpwm lpwm@34100000
34110000-3411ffff : 34110000.lpwm lpwm@34110000
34120000-3412ffff : 34120000.gpio gpio@34120000
34130000-3413ffff : 34130000.gpio gpio@34130000
34160000-3416ffff : 34160000.pwm pwm@34160000
34180000-341801ff : 34180000.lsio_iomuxc lsio_iomuxc@34180000
34190000-3419ffff : 34190000.adc adc@34190000
341a0000-341a001f : serial
341c0000-341cffff : 341c0000.i2c i2c@341c0000
34200000-342003ff : 34200000.dma-controller dma-controller@34200000
34210000-342123ff : 34210000.hps-clock-controller hps-clock-controller@34210000
34240000-3424007f : 34240000.pvt common
34240080-3424017f : 34240000.pvt ts
34240180-342401ff : 34240000.pvt pd
34240400-34240bff : 34240000.pvt vm
34250000-3425ffff : 34250000.watchdog watchdog@34250000
35000000-35000fff : 35000000.spi spi@35000000
35010000-3501ffff : 35010000.horizon_tsn horizon_tsn@35010000
35020000-3502ffff : 35020000.sdhci sdhci@35020000
35030000-3503ffff : 35030000.sdhci sdhci@35030000
35040000-3504ffff : 35040000.sdhci sdhci@35040000
35050000-350501ff : 35050000.hsio_iomuxc hsio_iomuxc@35050000
35060000-3506ffff : 35060000.gpio gpio@35060000
35070000-3507ffff : 35070000.gpio gpio@35070000
35100000-35107fff : usb@35100000
  35100000-35107fff : xhci-hcd.3.auto usb@35100000
3510c100-3510ffff : 35100000.usb usb@35100000
3530c100-3537ffff : 35300000.usb usb@35300000
38100000-3810ffff : 38100000.axi-mon axi-mon@38100000
38200000-382000ff : 38200000.dfi-monitor dfi-monitor
38300000-38300fff : 38200000.dfi-monitor dfi-monitor
3a000000-3a00ffff : 3a000000.bpu reg
3a010030-3a010043 : 3a010030.bpu_iommu bpu_iommu@3a010030
3b000000-3b00ffff : 3b000000.vpu
3b010000-3b01ffff : 3b010000.jpu
3b020004-3b020017 : 3b020004.vpu_iommu vpu_iommu@3b020004
3b020018-3b02002b : 3b020018.jpu_iommu jpu_iommu@3b020018
3c000000-3c00ffff : galcore register region
3c010000-3c01ffff : nano2d register region
3c020040-3c020053 : 3c020040.gc820_iommu gc820_iommu@3c020040
3d000000-3d00ffff : 3d000000.isp reg
3d010000-3d01ffff : 3d010000.vse reg
3d020000-3d02ffff : 3d020000.sif reg
3d030000-3d03ffff : 3d030000.sif reg
3d040000-3d04ffff : 3d040000.sif reg
3d050000-3d05ffff : 3d050000.sif reg
3d060000-3d06ffff : 3d060000.mipi_host reg
3d070000-3d07ffff : 3d070000.mipi_host reg
3d080000-3d08ffff : 3d080000.mipi_host reg
3d090000-3d09ffff : 3d090000.mipi_host reg
3d0a0000-3d0affff : 3d0a0000.csi_wrapper reg
3d0b0000-3d0b000f : 3d0b0000.cam_ctrl reg
3d0b0010-3d0b0023 : 3d0b0010.vse_iommu vse_iommu@3d0b0010
3d0b0024-3d0b0037 : 3d0b0024.cam_sif_iommu cam_sif_iommu@3d0b0024
3d0b0038-3d0b004b : 3d0b0038.isp_iommu isp_iommu@3d0b0038
3d0b004c-3d0b005f : 3d0b004c.gdc_iommu gdc_iommu@3d0b004c
3d0b008c-3d0b00a3 : 3d0b008c.cam_pulse reg
3e0a0028-3e0a0053 : 3e0a0028.phy phy@3e0a0028
3e0a0054-3e0a009f : 3e0a0054.disp_iomuxc disp_iomuxc@3e0a0054
3e0a0130-3e0a0143 : 3e0a0130.dc_iommu dc_iommu@3e0a0130
3e0a0144-3e0a0157 : 3e0a0144.bt1120_iommu bt1120_iommu@3e0a0144
3e0a0158-3e0a016b : 3e0a0158.sif_iommu sif_iommu@3e0a0158
84000000-9fe7efff : System RAM
  84010000-84e5ffff : Kernel code
  84e60000-8507ffff : reserved
  85080000-854cffff : Kernel data
  87fd3000-87ff8fff : reserved
  87ffc000-9fdfffff : reserved
9fe7f000-a207ffff : reserved
a2080000-17fffffff : System RAM
  a2080000-a40bffff : reserved
  a4100000-1440fffff : reserved
  17b000000-17f5fffff : reserved
  17f664000-17f6c3fff : reserved
  17f6c4000-17f6c4fff : reserved
  17f6c5000-17f754fff : reserved
  17f756000-17f758fff : reserved
  17f759000-17f759fff : reserved
  17f75a000-17f76bfff : reserved
  17f76c000-17fffffff : reserved
```

上述日志输出内容与[地址空间表](#address_space_table)是能够对应的，同时可以看出，内存区域可以主要分为以下几个部分：

1. **QOS（Quality of Service）区域**：
    日志中有多个以 `20500000` 开头的内存段，这些区域通常与硬件模块的带宽和资源管理相关。每个区域的名字后面是该硬件模块的标识，例如：
     - `20500000-205000ff : 20500000.cpu_ace_qos cpu_ace_qos@20500000` 表示 CPU ACE（Accelerator Coherence Engine）模块的 QOS 区域。
     - 其他类似的区域包括 `bt1120_qos`, `dc8000_qos`, `video_qos` 等，这些模块涉及视频、GPU、DMA（直接存储器访问）等功能。
    这些 QOS 区域通常用于保证不同硬件模块之间的带宽和时序需求，确保数据传输的优先级和质量。

2. **外设控制器和驱动区域**：
    接下来是控制器和外设的内存区域。例如：
    - `31000000-3100ffff : 31000000.gpio gpio@31000000` 表示 GPIO 控制器的内存区域。
    - `34020000-3402ffff : 34020000.spi spi@34020000` 表示 SPI（串行外设接口）的内存区域。
    这些区域对应于设备驱动所使用的内存区域，用于访问外部硬件或控制外部设备。

3. **调试和监控区域**：
    用于硬件调试和监控的区域，如：
    - `38100000-3810ffff : 38100000.axi-mon axi-mon@38100000` 表示 AXI 总线监控的内存区域。
    - `3a000000-3a00ffff : 3a000000.bpu reg` 表示 BPU（带宽处理单元）寄存器区域。
    这些区域主要用于实时跟踪和分析硬件的状态和性能。

4. **内存保留区域**：
    日志中有一大段区域被标记为 "reserved"（保留），如：
    - `84010000-84e5ffff : Kernel code`
    - `a2080000-17fffffff : System RAM`
    这些区域大多数用于系统的内核代码、内核数据以及一些保留给特定目的（例如固件或内存映射IO）的内存区域。保留区域通常是由固件或内核使用的内存，不能直接访问。

5. **系统 RAM 区域**
    系统 RAM 是计算机的主内存，通常用于存储操作系统、应用程序和其他数据。日志中显示了多个内存区域：
    - `84000000-9fe7efff : System RAM` 这表示主要的内存区域，包含了内核代码、数据和其他保留区域。其中进一步的内存划分显示了内存中不同用途的区域。下面详细分析每个部分：

   1. **84000000-9fe7efff : System RAM**
      - **范围**：`84000000` 到 `9fe7efff`，这表示系统的物理内存的总区域，从 `84000000` 地址开始，到 `9fe7efff` 地址结束。系统的所有应用程序、内核以及其他进程会使用这部分内存。

   2. **84010000-84e5ffff : Kernel code**
      - **范围**：`84010000` 到 `84e5ffff`，这一部分内存专门用于存储 **内核代码**。内核代码是操作系统的核心部分，负责管理硬件、资源调度、进程管理等。
        - **内存用途**：内核代码部分通常是只读的，因为它在**运行时不允许修改**。操作系统的启动、系统调用等都需要在这部分内存中运行。
        - **加载方式**：当操作系统启动时，内核代码会被加载到这部分内存区域，供系统运行。

   3. **84e60000-8507ffff : reserved**
      - **范围**：`84e60000` 到 `8507ffff`，这一部分被标记为 **保留区域**，即它不被内核代码或数据使用，通常是系统预留的空间，可能为将来升级、硬件的内存映射，或是与其他硬件模块的交互（例如固件、I/O控制、内存映射设备）预留的区域。
        - **用途**：保留区域的具体用途取决于硬件和系统的设计。它们不直接分配给操作系统或应用程序，但可能由固件或硬件设备使用。
        - **保护**：这些区域可能被系统保护，不允许常规程序访问，以防止干扰系统稳定性。

   4. **85080000-854cffff : Kernel data**
      - **范围**：`85080000` 到 `854cffff`，这一部分内存用于存储 **内核数据**。内核数据是内核在运行时所需要的变量、结构和其他动态数据。
        - **内存用途**：这部分内存存储着与内核相关的动态数据，比如任务调度信息、文件系统缓存、网络缓冲区等。与内核代码不同，这部分内存内容在运行过程中是可读写的。
        - **加载方式**：当操作系统加载时，这部分内存被内核用来存储运行时的状态、内核模块等。

#### <span id="Default_ION"/>默认的 ION 预留内存

- 各个 ION 区域的使用请参考：[ION 系统调试指南 ](../system_component_development/39-ION_Debug_Guide.html)
- 表头中 `xg`: 表示 Linux Kernel 设备树中关于 ion 保留空间节点名后缀，由于针对不同 DDR 容量，进行了不同的默认定义，所以使用 `xg` 来表示容量
  - 比如 `ion_reserved_xg` 表示的设备树节点： ion_reserved_1g、 ion_reserved_2g、 ion_reserved_ge4g

| 内存大小 | DDR 整体 地址空间 | ion_reserved_xg 地址空间 | ion_carveout_xg 地址空间 | ion_cma_xg 地址空间 |
| ---- | ------------------------------------- | --------------------------------------------- | --------------------------------------------- | ---------------------------------------------- |
| 1G   | 起始： 0x0_8000_0000 <br> 终止： 0x0_BFFF_FFFF | 起始： 0x0_A410_0000 <br> 终止： 0x0_AB0F_FFFF (112M) | 起始： 0x0_0AB10_0000 <br> 终止： 0x0_0B20F_FFFF (112M)  | 起始： 0x0B_210_0000 <br> 终止： 0x0_B24F_FFFF (64M) |
| 2G   | 起始： 0x0_8000_0000 <br> 终止： 0x0_FFFF_FFFF | 起始： 0x0_A410_0000 <br> 终止： 0x0_C40F_FFFF (512M) | 起始： 0x0_0C410_0000 <br> 终止： 0x0_0C40F_FFFF (512M)  | 起始： 0x0E_410_0000 <br> 终止： 0x0_F00F_FFFF (192M) |
| 大于等于 4G   | 起始： 0x0_8000_0000 <br> 终止： 0x1_7FFF_FFFF | 起始： 0x0_A410_0000 <br> 终止： 0x0_E40F_FFFF (1G)   | 起始： 0x0_0E410_0000 <br> 终止： 0x0_1240F_FFFF (1G)    | 起始： 0x12_410_0000 <br> 终止： 0x1_440F_FFFF (512M) |

根据前面 `cat /proc/iomem` 命令输出的日志，可以看到在 4GB DDR 的板端系统中，ION 预留的内存大小为：

```bash
a4100000-1440fffff : reserved
```

其中，`a4100000-1440fffff` 这一段内存范围的大小为 2.5 GB ，与上述表格中一致。
