Caching RPI2上的MMU初始化时缓存无效

Caching RPI2上的MMU初始化时缓存无效,caching,memory,arm,raspberry-pi2,mmu,Caching,Memory,Arm,Raspberry Pi2,Mmu,最近我在raspberry pi 2上试验了MMU初始化代码,遇到了奇怪的行为。我试图做的是建立简单的部分映射 我使用代码作为参考基础。尽管简要回顾表明,这段代码是为bcm2835编写的,但仍然没有比这更好的代码 我遇到的问题是缓存刷新后的死胡同。以下是启动mmu函数的完整示例 .globl start_mmu start_mmu: mov r2,#0 mcr p15,0,r2,c7,c7,0 ;@ invalidate caches mcr p15,0,r2,c8,c7

最近我在raspberry pi 2上试验了MMU初始化代码,遇到了奇怪的行为。我试图做的是建立简单的部分映射

我使用代码作为参考基础。尽管简要回顾表明,这段代码是为bcm2835编写的,但仍然没有比这更好的代码

我遇到的问题是缓存刷新后的死胡同。以下是启动mmu函数的完整示例

.globl start_mmu
start_mmu:
    mov r2,#0
    mcr p15,0,r2,c7,c7,0 ;@ invalidate caches
    mcr p15,0,r2,c8,c7,0 ;@ invalidate tlb
    mcr p15,0,r2,c7,c10,4 ;@ DSB ??

    mvn r2,#0
    bic r2,#0xC
    mcr p15,0,r2,c3,c0,0 ;@ domain

    mcr p15,0,r0,c2,c0,0 ;@ tlb base
    mcr p15,0,r0,c2,c0,1 ;@ tlb base

    mrc p15,0,r2,c1,c0,0
    orr r2,r2,r1
    mcr p15,0,r2,c1,c0,0
换言之,我在缓存失效线上遇到了死胡同:

 mcr p15,0,r2,c7,c7,0 ;@ invalidate caches
所谓死胡同,我的意思是在这一行被执行之后,我不能打印一些东西。那一刻我似乎遇到了一些例外。 如果我省略了缓存无效行,我可以继续,但在我的设置之后MMU映射似乎没有正确建立(但这是另一个问题)。 我想知道的是:

1.)为什么我们需要在MMU启动前使缓存和tlb失效

2.)死胡同问题的原因可能是什么

为什么我们需要在MMU启动之前使缓存和tlb失效

因为它们可能包含未初始化的垃圾(或者只是重置后过时的条目)。一旦您打开MMU,指令/数据访问的地址可能会在TLB中查找,如果任何垃圾恰好看起来非常像与相关虚拟地址匹配的有效条目,那么您将度过一段糟糕的时光。启用缓存后,指令/数据本身也是如此

死胡同问题的原因可能是什么

您正在执行无效的指令

如果你想写裸机代码,了解你正在运行的金属是值得的——Raspberry Pi 2有Cortex-A7内核,这与其他型号的ARM1176内核不同,因此表现不同。特别是在这种情况下,ARMv6架构下的统一缓存操作所在的CP15 c7,0,c7系统寄存器空间不再分配给ARMv7,因此尝试访问它会导致不可预测的行为。您需要分别使I-cache和D-cache无效。我建议至少看一下,最好是。同样,对于现实世界的例子,总是会有一些人和朋友。是的,这是一个很难接受的东西,但是,嘿,这是一个成熟的多核移动类应用处理器,而不是一些微控制器;)


现在,首要任务应该是设置一些异常向量处理程序,在出现问题时提供一些调试输出,因为从现在开始,在

我非常肯定,其中一本ARM参考手册中有一些示例用于启用MMU。CP15寄存器在Cortex-A家族的每个版本上都是不同的;您可以通过使用ID寄存器和/或注意不要使用特殊的CP15寄存器(通常用于调试)来实现多皮质。