内存映射
项目提供的配置使用以下内存区域:
外部 PSRAM(提供的镜像使用 16 MiB)
内部 HP SRAM(512 KiB)
内部 LP SRAM(32 KiB)
Linux 使用外部 PSRAM 存放可写内核数据和应用。内部 HP SRAM 存放固件、 无线内存分配和 DMA 缓冲区。
HP 内存
下表中的结束地址不包含在范围内。详细映射见 ESP32-S31 技术参考手册。
区域 |
起始地址 |
结束地址或大小 |
用途 |
|---|---|---|---|
PSRAM |
|
16 MiB |
Linux 数据和应用 |
OpenSBI 数据 |
|
|
数据、栈和堆 |
无线低地址堆 |
|
|
无线内存分配 |
无线主区域 |
|
|
无线堆、缓冲区及 Wi-Fi 可执行 SRAM 子区 |
无线异常区域 |
|
|
异常栈和保护区域 |
AXI GDMA 描述符 |
|
12 KiB |
DMA 描述符 |
AHB GDMA 描述符 |
|
4 KiB |
DMA 描述符 |
USB/状态保留区 |
|
64 字节 |
保留的共享 SRAM |
UART DMA |
|
10 KiB |
UART 缓冲区 |
无线高地址堆 |
|
|
额外的无线内存分配 |
HP 预留区域定义在
shared/s31_memory_layout.h
中。无线和 DMA 驱动直接使用这些区域。应用通过常规 Linux API 分配内存。
XIP 无线加载器还有以下地址约定,定义见内核的 drivers/platform/esp32s31-radio-xip.h:
映射或区域 |
地址/容量 |
用途 |
|---|---|---|
无线 Flash 虚拟基址 |
|
对应原始偏移 |
Wi-Fi 可执行 SRAM |
物理 |
从 Flash 复制的热点代码,位于上表无线主区域内 |
无线可写 arena |
内核符号 |
PSRAM 中的初始数据与 BSS,地址取决于内核构建 |
无线 Flash 映射使用 4 MiB 对齐的 Sv32 页:虚拟 [0xBE000000, 0xBE400000) 对应物理 [0x40000000, 0x40400000),1536 KiB 无线分区完全位于其中。启动映射覆盖从原始偏移零开始的完整 16 MiB Flash,Linux 从 0x40400000 执行。原始分区见Flash 布局。
无线堆必须排除正在使用的 Wi-Fi SRAM 代码,只能回收代码后的尾部,不能把整段可执行 SRAM 当作空闲堆。预链接工具会记录内核可写 arena 地址,因此无线镜像必须匹配内核构建。
LP 内存
区域 |
地址 |
大小 |
|---|---|---|
LP SRAM |
|
总计 32 KiB |
OpenSBI 挂起快照 |
|
占用 LP SRAM 中的 20 KiB |
休眠控制预留区域 |
|
LP SRAM 的最后 1 KiB |
LP 固件构建使用最前面的 8 KiB,结束地址为 0x2E002000。安排 LP 固件代码、
数据和栈的位置时,请避开快照和控制区域。休眠控制
结构体本身为 112 字节,较大的预留区域为其周围留出了余量。
构建和加载 LP 代码的方法见LP 固件开发。
DMA 缓冲区
DMA 描述符使用上述预留 SRAM 区域。传输缓冲区使用对应 Linux 驱动提供的 分配和映射 API。在 ESP32-S31 上,CPU 与 DMA 引擎共享 PSRAM 缓冲区时 需要同步缓存。
驱动示例见DMA 和缓存。