第 10 章:内存管理
学习目标
- 实现内存抽象
- 理解内存映射
- 处理 MMIO
10.1 思考:内存只是一个大数组吗?
你可能觉得内存就是:
uint8_t memory[128 * 1024 * 1024]; // 128MB
但真实系统中,内存地址可能映射到:
- RAM
- ROM
- 外设寄存器(UART、Timer)
这就是 内存映射 I/O (MMIO)!
10.2 内存映射
0x80000000 - 0x87FFFFFF : RAM (128MB)
0x10000000 - 0x10000FFF : UART
0x02000000 - 0x0200FFFF : CLINT
问题:访问 0x10000000 应该读 RAM 还是 UART?
答案:UART!
10.3 实现内存读写
uint32_t mem_read(uint32_t addr, int len) {
// 判断地址范围
if (addr >= 0x80000000 && addr < 0x88000000) {
// RAM
return *(uint32_t*)(ram + (addr - 0x80000000));
} else if (addr >= 0x10000000 && addr < 0x10001000) {
// UART
return uart_read(addr);
}
// ...
}
问题:为什么要减去 0x80000000?
因为 RAM 数组从 0 开始,但地址从 0x80000000 开始!