4.3.1. 地址空间映射
4.3.1.1. 概述
地址空间是一个逻辑概念,用于统一编址处理器可以访问的所有存储单元和外设控制器,例如:
Boot ROM:存储初始启动代码的固化存储器。
SRAM:芯片内部的高速存储器,用于存储关键代码或临时数据。
DDR:外部的动态随机存储器,提供大容量存储空间,用于操作系统、应用程序及大规模数据处理。
外设控制器的寄存器:控制和操作芯片中外设模块的硬件寄存器。
保留区域:未分配实际用途的地址空间,预留供未来扩展或升级
通过统一的地址空间设计,处理器可以高效地访问和管理系统中的各类资源。
X5 地址空间如下表:
| 起始地址 | 解释地址 | 域 | 大小 | 描述 |
|---|---|---|---|---|
| 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 |
4.3.1.2. 内存地址空间
X5 地址空间映射表中展示了 3 种内存的地址空间:
Boot ROM:只读存储器( Read-Only Memory),用于存储芯片启动时的固件代码
SRAM:集成在芯片内部,具有高速存取性能,但是容量有限 , 整体大小是 1856KB,详细见 SRAM 地址空间
SDRAM( DDR):外接 LPDDR4/4X,用作系统的主存 , 最大支持 8GB,详细见 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 地址空间 中的描述可以知道,默认情况下 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 预留内存
保留的地址空间定义在 BSP 源码包的 kernel 文件夹下的
arch/arm64/boot/dts/hobot/x5-memory.dtsi文件
可以通过 cat /proc/iomem 命令获取系统内存的分配情况(4GB 内存的板端系统为例):
分析系统内存:
# 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
上述日志输出内容与地址空间表是能够对应的,同时可以看出,内存区域可以主要分为以下几个部分:
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 区域通常用于保证不同硬件模块之间的带宽和时序需求,确保数据传输的优先级和质量。
外设控制器和驱动区域: 接下来是控制器和外设的内存区域。例如:
31000000-3100ffff : 31000000.gpio gpio@31000000表示 GPIO 控制器的内存区域。34020000-3402ffff : 34020000.spi spi@34020000表示 SPI(串行外设接口)的内存区域。 这些区域对应于设备驱动所使用的内存区域,用于访问外部硬件或控制外部设备。
调试和监控区域: 用于硬件调试和监控的区域,如:
38100000-3810ffff : 38100000.axi-mon axi-mon@38100000表示 AXI 总线监控的内存区域。3a000000-3a00ffff : 3a000000.bpu reg表示 BPU(带宽处理单元)寄存器区域。 这些区域主要用于实时跟踪和分析硬件的状态和性能。
内存保留区域: 日志中有一大段区域被标记为 “reserved”(保留),如:
84010000-84e5ffff : Kernel codea2080000-17fffffff : System RAM这些区域大多数用于系统的内核代码、内核数据以及一些保留给特定目的(例如固件或内存映射IO)的内存区域。保留区域通常是由固件或内核使用的内存,不能直接访问。
系统 RAM 区域 系统 RAM 是计算机的主内存,通常用于存储操作系统、应用程序和其他数据。日志中显示了多个内存区域:
84000000-9fe7efff : System RAM这表示主要的内存区域,包含了内核代码、数据和其他保留区域。其中进一步的内存划分显示了内存中不同用途的区域。下面详细分析每个部分:
84000000-9fe7efff : System RAM
范围:
84000000到9fe7efff,这表示系统的物理内存的总区域,从84000000地址开始,到9fe7efff地址结束。系统的所有应用程序、内核以及其他进程会使用这部分内存。
84010000-84e5ffff : Kernel code
范围:
84010000到84e5ffff,这一部分内存专门用于存储 内核代码。内核代码是操作系统的核心部分,负责管理硬件、资源调度、进程管理等。内存用途:内核代码部分通常是只读的,因为它在运行时不允许修改。操作系统的启动、系统调用等都需要在这部分内存中运行。
加载方式:当操作系统启动时,内核代码会被加载到这部分内存区域,供系统运行。
84e60000-8507ffff : reserved
范围:
84e60000到8507ffff,这一部分被标记为 保留区域,即它不被内核代码或数据使用,通常是系统预留的空间,可能为将来升级、硬件的内存映射,或是与其他硬件模块的交互(例如固件、I/O控制、内存映射设备)预留的区域。用途:保留区域的具体用途取决于硬件和系统的设计。它们不直接分配给操作系统或应用程序,但可能由固件或硬件设备使用。
保护:这些区域可能被系统保护,不允许常规程序访问,以防止干扰系统稳定性。
85080000-854cffff : Kernel data
范围:
85080000到854cffff,这一部分内存用于存储 内核数据。内核数据是内核在运行时所需要的变量、结构和其他动态数据。内存用途:这部分内存存储着与内核相关的动态数据,比如任务调度信息、文件系统缓存、网络缓冲区等。与内核代码不同,这部分内存内容在运行过程中是可读写的。
加载方式:当操作系统加载时,这部分内存被内核用来存储运行时的状态、内核模块等。
默认的 ION 预留内存
各个 ION 区域的使用请参考:ION 系统调试指南
表头中
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 终止: 0x0_BFFF_FFFF |
起始: 0x0_A410_0000 终止: 0x0_AB0F_FFFF (112M) |
起始: 0x0_0AB10_0000 终止: 0x0_0B20F_FFFF (112M) |
起始: 0x0B_210_0000 终止: 0x0_B24F_FFFF (64M) |
| 2G | 起始: 0x0_8000_0000 终止: 0x0_FFFF_FFFF |
起始: 0x0_A410_0000 终止: 0x0_C40F_FFFF (512M) |
起始: 0x0_0C410_0000 终止: 0x0_0C40F_FFFF (512M) |
起始: 0x0E_410_0000 终止: 0x0_F00F_FFFF (192M) |
| 大于等于 4G | 起始: 0x0_8000_0000 终止: 0x1_7FFF_FFFF |
起始: 0x0_A410_0000 终止: 0x0_E40F_FFFF (1G) |
起始: 0x0_0E410_0000 终止: 0x0_1240F_FFFF (1G) |
起始: 0x12_410_0000 终止: 0x1_440F_FFFF (512M) |
根据前面 cat /proc/iomem 命令输出的日志,可以看到在 4GB DDR 的板端系统中,ION 预留的内存大小为:
a4100000-1440fffff : reserved
其中,a4100000-1440fffff 这一段内存范围的大小为 2.5 GB ,与上述表格中一致。