首页 文章

MMU上的逻辑和物理地址?

提问于
浏览
1

我对MMU如何处理内核物理和逻辑地址有些怀疑 . 我会试着用一个例子来解释我的问题 . 让我们假设我们在ARM架构上 .

系统从MMU关闭开始,因此在CPU内部传递的所有地址都是物理的 . 在我们启用MMU之前,我们创建一个页表,我们说所有物理地址都映射到虚拟地址 physical address + 0xC0000000 . 在此之后我们打开MMU . 所有这一切都很清楚 . 但现在问题开始了:

因为我们处于流水线架构中,所以说后面的指令是来自地址0x8000的加载 . 现在据我所知,我们应该有一个页面错误,因为MMU在页面表的任何地方都没有找到这个地址,所以它调用了一个页面错误来处理这种情况 . 但是如果我们设置了中断向量,那么它内部就有一个分支到另一个物理地址,所以MMU找不到这个地址,我们不可避免地陷入了无限循环 . 我错过了什么?

1 回答

  • 1

    您错过了所有使用的虚拟地址都应该映射,即使它们实际上匹配相同的物理内存区域 . 我们来详细说明一下 .

    假设有 startup 代码(用于主要初始化和启用MMU)和其他 main 代码(仅适用于启用MMU),具有以下布局 .

    • startup - phys:0x4000-0x7FFFF,virt:0x4000-0x7FFFF

    • main - phys:0x8000-0xBFFF,virt:0xC0008000-0xC000BFFF

    这样的布局是链接器作业,您的工作是使用正确的脚本来提供它 . 此示例中的CPU入口点应为 0x4000 . 这几乎是硬件特定的地址 .

    CPU启动时禁用MMU和'PC=0x4000',当MMU启用时,它会一直持续到 0x4800 .

    因此,在启用MMU之前,必须有 0x4000-0x7FFFF (启动)和 0xC0008000-0xC000BFFF (所有其他代码)的映射 .

    现在MMU已启用 . PC有0x4804(假设32b CPU) . 0x4804 现在是 virtual address ,它映射在 0x4804 physical address 上 . CPU继续 0x48040x48080x480C 等 .

    在某些时候你应该跳进 main . 对于 ARM 来说就是这样的

    ldr r0, =0xC0008000
    bx r0
    

    注意,使用了 mainmain 条目 . 所以在分支 PC=0xC0008000 之后,它在物理内存中被解析为 0x8000 .

    之后可以删除 0x4000-0x7FFFF 映射 .

相关问题