由于我们公司和某知名芯片厂商定制了一款芯片,为cortex-A8架构,最初不支持cache,因此在内核最初的一小段启
动代码中,cache没有打开。按照正常流程来说,应该是先打开cache,解压缩完成后会关闭cache。
跳转到开启cache的代码如下:
bl cache_on
打开cache的代码如下:
bl decompress_kernel
bl cache_clean_flush
bl cache_off
后来芯片厂商提供了带cache的cpu,结果忘记在最开始的解压缩代码中忘记打开cache了,但是用测试软件跑出来的
结果证明性能提升了60倍。
查看代码,原来是在arch\arm\kernel\head.S中再次将cache打开。
/*
* Setup common bits before finally enabling the MMU. Essentially
* this is just loading the page table pointer and domain access
* registers.
*
* r0 = cp#15 control register
* r1 = machine ID
* r2 = atags or dtb pointer
* r4 = page table pointer
* r9 = processor ID
* r13 = *virtual* address to jump to upon completion
*/
__enable_mmu:
#if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6
orr r0, r0, #CR_A
#else
bic r0, r0, #CR_A
#endif
#ifdef CONFIG_CPU_DCACHE_DISABLE
bic r0, r0, #CR_C
#endif
#ifdef CONFIG_CPU_BPREDICT_DISABLE
bic r0, r0, #CR_Z
#endif
#ifdef CONFIG_CPU_ICACHE_DISABLE
bic r0, r0, #CR_I
#endif