长篇连载--arm linux演艺---第七回 -------------------------------------------------------------------------------- 上回书讲到已经设置好了内核的页表,然后要跳转到__arm920_setup,这个函数在arch/arm/mm/proc-arm929.s __arm920_setup: mov r0, #0 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 mcr p15, 0, r0, c7, c10, 4@ drain write buffer on v4 mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 mcr p15, 0, r4, c2, c0 @ load page table pointer mov r0, #0x1f @ Domains 0, 1 = client mcr p15, 0, r0, c3, c0 @ load domain access register mrc p15, 0, r0, c1, c0 @ get control register v4 /* * Clear out 'unwanted' bits (then put them in if we need them) */ @ VI ZFRS BLDP WCAM bic r0, r0, #0x0e00 bic r0, r0, #0x0002 bic r0, r0, #0x000c bic r0, r0, #0x1000 @ ...0 000. .... 000. /* * Turn on what we want */ orr r0, r0, #0x0031 orr r0, r0, #0x2100 @ ..1. ...1 ..11 ...1 #ifdef CONFIG_CPU_ARM920_D_CACHE_ON orr r0, r0, #0x0004 @ .... .... .... .1.. #endif #ifdef CONFIG_CPU_ARM920_I_CACHE_ON orr r0, r0, #0x1000 @ ...1 .... .... .... #endif mov pc, lr 这一段首先关闭i,d cache,清除write buffer ,然后设置页目录地址,设置domain的保护,在上节中,注意到页目录项的domain都是0,domain寄存器中的domain 0 对应的是0b11,表示访问模式为manager,不受限制。 接下来设置控制寄存器,打开d,i cache和mmu注意arm的d cache必须和mmu一起打开,而i cache可以单独打开 其实,cache和mmu的关系实在是紧密,每一个页表项都有标志标示是否是cacheable的,可以说本来就是设计一起使用的 最后,自函数返回后,有一句mcr p15, 0, r0, c1, c0使设置生效。 arm linux演艺第七回终
|