学习目标

  • 实现内存抽象
  • 理解内存映射
  • 处理 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 开始!

下一步

第 11 章:I/O 设备抽象

更新时间: