4. 调用渠道特定的 __cpu_flush 函数
当 __create_page_tables 回来之后
此刻,一些特定寄存器的值如下所示:
r4 = pgtbl
r8 = machine info
r9 = cpu id
r10 = procinfo
在咱们需求在敞开mmu之前,做一些有必要的作业:铲除ICache, 铲除 DCache, 铲除 Writebuffer, 铲除TLB等.
这些一般是经过cp15协处理器来完成的,并且是渠道相关的. 这便是 __cpu_flush 需求做的作业.
00091:
00092:
00093:
00094:
第91行: 将r13设置为 __switch_data 的地址
第92行: 将lr设置为 __enable_mmu 的地址
第93行: r10存储的是procinfo的基地址, PROCINFO_INITFUNC是在 arch/arm/kernel/asm-offset.c 中107行界说.
00391:
00392: __arm926_setup:
00393:
00394:
00395:
00396: #ifdef CONFIG_MMU
00397:
00398: #endif
00399:
00400:
00401: #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
00402:
00403:
00404: #endif
00405:
00406:
00407:
00408:
00409:
00410:
00411: #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
00412:
00413: #endif
00414:
00415:
00416:
00417:
00423:
00424: arm926_crval:
00425:
第391, 392行: 是函数声明
第393行: 将r0设置为0
第394行: 铲除(invalidate)Instruction Cache 和 Data Cache.
第395行: 铲除(drain) Write Buffer.
第396 – 398行: 假如有装备了MMU,则需求铲除(invalidate)Instruction TLB 和Data TLB
接下来,是对操控寄存器c1进行装备,请参阅 ARM926 TRM.
第401 – 404行: 假如装备了Data Cache运用writethrough方法, 需求关掉write-back.
第406行: 取arm926_crval的地址到r5中, arm926_crval 在第424行
第407行: 这儿咱们需求看一下424和425行,其间用到了宏crval,crval是在 arch/arm/mm/proc-macro.S 中:
所以,在407行中,咱们将clear和mmuset的值别离存到了r5, r6中
第408行: 取得操控寄存器c1的值
第409行:
第410行: 设置r0中 mmuset (r6) 对应的位
第411 – 413行: 假如装备了运用 round robin方法,需求设置操控寄存器c1的 Bit[16]
第412行: 取lr的值到pc中.
而lr中的值寄存的是 __enable_mmu 的地址(arch/arm/kernel/head.S 93行),所以,接下来便是跳转到函数 __enable_mmu