今天再次阅读arm linux内核源码,看MMU启动部分发现了一个问题,就是在常规的enable_mmu和turn_mmu_on部分我没有找到真正使能MMU标志的代码,但是它到底是什么时候将MMU的最低位置1的呢??怀着这个疑问我在google上搜索了好多,但是对于这个问题的解答都是模凌两可,说的特别含糊,千篇一律,不能让人信服。
__enable_mmu代码如下:
1 | __enable_mmu: |
__turn_mmu_on源码如下:
1 | ENTRY(__turn_mmu_on) |
在turn_mmu_on中将r0的值写入协处理CP15的C1寄存器中,但是r0的bit0什么时候被置位了呢??enable_mmu没有置位,那就肯定是在__enable_mmu之前,搜索代码找到了答案:
::arch/arm/mm/proc-v6.S
其实在__v6_setup中设置的,有一段代码如下:
1 | adr r5,v6_crval @将v6_crval的实际运行地址加载到r5处 |
v6_crval的定义如下:
1 |
|
其中crval是定义的宏,根据配置CONFIG_MMU不同存放不同的值.
1 |
|
至此就非常清楚了,在v6_setup中设置了r0的bit0,然后调用enable_mmu和__turn_mmu_on真正开启MMU。