在移植linux2.6.18.1到龍芯3210的時候,也就是在移植筆記3裡,對Cache和TLB進行了一段修改,移植的時候以對照的方式進行修改,現在來看看,為什麼代碼這樣寫。
在移植Linux到龍芯3210筆記3裡面已經知道,對Cache和TLB的操作是在trap_init裡完成的,查了一下trap的英文意思,有一個解釋是"存水池"。
然後進入per_cpu_trap_init,看到兩個函數的調用:
cpu_cache_init();
tlb_init();
對了,正是這兩個函數。
先來看cpu_cache_init:
在./arch/mips/kernel/cpu-probe.c裡我們加入了一段代碼:
(在cpu_probe_legacy函數裡)
switch (c->processor_id & 0xff00) {
case ... ...
... ...
case PRID_IMP_SOC32101:
c->cputype = CPU_SOC32101;
c->isa_level = MIPS_CPU_ISA_II;
c->options = R4K_OPTS |
/* MIPS_CPU_FPU | */ MIPS_CPU_LLSC;
c->tlbsize = 48;
break;
}
看到c->options的值是R4K_OPTS
而:
#define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
| MIPS_CPU_COUNTER)
明顯地,c->options記錄的就是選定一些關於該CPU的一些特性。而這些特性就成了判斷的標志位,從而選擇不同的初始化,其中MIPS_CPU_4K_CACHE特性就是關於Cache的。
回到cpu_cache_init函數,在./arch/mips/mm/cache.c裡。
該函數就是根據不同的CPU特性來決定用哪個函數初始化我們的cache。
在./include/asm-mips/cpu-features.h定義了這個判定宏:
#define cpu_has_4k_cache (cpu_data[0].options & MIPS_CPU_4K_CACHE)
顯然,對cache的初始化是由r4k_cache_init來執行的。
進入r4k_cache_init,看到:
probe_pcache();