解析 boot_info_t
结构体
这个 boot_info_t
结构体用于存储启动时的 RAM 配置信息,通常用于 操作系统引导(bootloader)、裸机编程、嵌入式系统 等场景。
1. 结构体字段解析
typedef struct _boot_info_t {
// RAM区信息
struct {
uint32_t start; // RAM起始地址
uint32_t size; // RAM大小(字节)
} ram_region_cfg[BOOT_RAM_REGION_MAX];
int ram_region_count; // 记录 RAM 区的数量
} boot_info_t;
🔍 关键字段
字段 | 类型 | 含义 |
---|---|---|
ram_region_cfg | struct {uint32_t start; uint32_t size;} | RAM 分区数组,存储多个 RAM 区域的起始地址和大小 |
BOOT_RAM_REGION_MAX | #define | 最大支持的 RAM 区域数量(宏定义) |
ram_region_count | int | 实际 RAM 区域的数量 |
2. 作用
📌 记录多个 RAM 区域
在一些系统(如 ARM 设备、嵌入式 SoC)中,RAM 可能不是连续的,而是由多个物理区域组成。例如:
- 主 RAM
- 地址:
0x80000000
- 大小:
256MB
- 地址:
- 高速 SRAM
- 地址:
0x20000000
- 大小:
64KB
- 地址:
boot_info_t
结构体可以记录这些 RAM 片段的信息,用于 内存管理、页表映射、内核初始化 等。
3. 示例:初始化 boot_info_t
假设 BOOT_RAM_REGION_MAX = 4
,系统有 2 个 RAM 区域:
boot_info_t boot_info;
// 填充 RAM 信息
boot_info.ram_region_cfg[0].start = 0x80000000;
boot_info.ram_region_cfg[0].size = 256 * 1024 * 1024; // 256MB
boot_info.ram_region_cfg[1].start = 0x20000000;
boot_info.ram_region_cfg[1].size = 64 * 1024; // 64KB
boot_info.ram_region_count = 2; // 实际 RAM 区域数量
4. boot_info_t
在系统中的作用
✅ 启动时记录 RAM 信息,用于 操作系统初始化
✅ 支持多个 RAM 片段(如 SRAM
、DRAM
)
✅ 方便 MMU
、页表管理
、内存分配
🚀 简单理解:boot_info_t
就是“启动时的内存地图”,告诉操作系统有哪些 RAM 可用! 🎯
为什么 BOOT_RAM_REGION_MAX
可能有多个 RAM 区?
BOOT_RAM_REGION_MAX
不是指有几张内存卡,而是表示系统可能有多个独立的 RAM 片段(区域)。
这些 RAM 片段可能来源于不同的 物理地址范围、存储器类型、总线接口等,而不是单纯的“几张内存卡”。
1. 为什么一个系统会有多个 RAM 区?
在计算机架构中,RAM 可能分布在不同的物理地址段,并且可能使用不同的存储类型,比如:
- 主 RAM(DRAM)
- 主要用于系统运行,比如 DDR4/DDR5 内存。
- 例如
0x8000_0000
(起始地址),大小512MB
。
- 片上 RAM(SRAM)
- 嵌入式 SoC 或 微控制器(MCU) 通常会有小容量的 SRAM,速度快但空间有限。
- 例如
0x2000_0000
(起始地址),大小128KB
。
- 外设共享 RAM(专用 RAM)
- 某些系统会有专门的 RAM 用于 GPU、DMA、音频处理等。
- 例如
0x6000_0000
(起始地址),大小64MB
。
- 不同总线的 RAM
- 一些系统的 RAM 可能连接在不同的 总线(Bus) 上,如:
DDR
连接到CPU
主存控制器SRAM
直接连接到片上高速总线
共享 RAM
供DMA/GPU
访问
- 一些系统的 RAM 可能连接在不同的 总线(Bus) 上,如:
这些 不同的 RAM 片段 可能具有不同的 性能、访问速度、用途,但它们都属于 系统可用的内存。
2. BOOT_RAM_REGION_MAX
表示什么?
BOOT_RAM_REGION_MAX
定义的是 最多可以记录多少个 RAM 区域,例如:
#define BOOT_RAM_REGION_MAX 4
表示 最多支持 4 个 RAM 片段,但不代表一定有 4 个。
示例:一个 SoC 的 RAM 结构
boot_info_t boot_info;
// 主 RAM(DDR)
boot_info.ram_region_cfg[0].start = 0x80000000;
boot_info.ram_region_cfg[0].size = 512 * 1024 * 1024; // 512MB
// 片上 SRAM
boot_info.ram_region_cfg[1].start = 0x20000000;
boot_info.ram_region_cfg[1].size = 128 * 1024; // 128KB
// 外设专用 RAM
boot_info.ram_region_cfg[2].start = 0x60000000;
boot_info.ram_region_cfg[2].size = 64 * 1024 * 1024; // 64MB
boot_info.ram_region_count = 3; // 只有 3 个区域,虽然最大支持 4 个
在这个例子中:
- 主 RAM(0x8000_0000) 主要用于一般用途。
- SRAM(0x2000_0000) 可能用于实时任务或缓存。
- 专用 RAM(0x6000_0000) 可能用于 GPU、DSP 计算。
即使 BOOT_RAM_REGION_MAX = 4
,但如果硬件只有 3 块 RAM,ram_region_count = 3
,只使用前 3 个存储单元。
3. 这样设计的好处
✅ 支持不同类型的 RAM
- 片上 SRAM、外部 DDR、共享 RAM 在启动时就能被识别和管理。
✅ 支持硬件可扩展性
- 如果硬件更新,支持更多 RAM 片段,只需增加
BOOT_RAM_REGION_MAX
,无需改动核心代码。
✅ 适用于嵌入式和 OS 内存管理
- 嵌入式系统(如 STM32、ESP32)常有 SRAM + DDR。
- 操作系统(如 Linux)也使用类似机制 管理 NUMA、多通道内存等。
4. BOOT_RAM_REGION_MAX
不是“几张内存卡”
- 它表示最多能管理的 RAM 片段数量,不是物理上的“几张内存条”。
- 即使是单个 SoC,也可能有多个 RAM 片段,物理上不一定是独立的芯片。
- 适用于操作系统、嵌入式系统、服务器等各种环境。
🚀 总结
✅ BOOT_RAM_REGION_MAX
代表最大支持多少个 RAM 片段,但不代表实际有多少块 RAM。
✅ 一个系统可能有多个 RAM 片段(SRAM、DDR、专用 RAM),而不是简单的“几张内存条”。
✅ 这种设计能适应不同硬件架构,适用于 OS 内存管理、嵌入式设备、SoC 片上系统。 🎯