Linux内核及ARM的内存管理(不厌其烦续)

一个人勃一次不难,难的是勃一辈子……

最近分心的事很多,勃得越来越少了!

 

 

打开mmu是一件神圣的工作,需要仔细、再仔细……

 

从__v7_setup函数返回来,进入到__enable_mmu过程,做起飞前的最后确认:

 

__enable_mmu:

#ifdef CONFIG_ALIGNMENT_TRAP

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

根据配置选项,决定是否关闭开指令缓冲区,一般是不需要关闭的;

 

mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | /

     domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | /

     domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | /

     domain_val(DOMAIN_IO, DOMAIN_CLIENT))

结合数据手册,此段是将D0、D1两个域,D1对应于USER域,D0对应于KERNEL和TABLE域,配置为管理模式,对这两个域的访问和执行不受TLB中相应标志位影响,D2域,对应于IO域,配置为客户模式,对此域的访问受TLB中相应标志位的检查;

 

mcr p15, 0, r5, c3, c0, 0 @ load domain access register

写入域访问控制寄存器,其实和__v7_setup函数中写入的值相同;

 

mcr p15, 0, r4, c2, c0, 0 @ load page table pointer

__v7_setup函数中也已经写过这个寄存器了;

 

b __turn_mmu_on

__turn_mmu_on就在后面紧跟着,不明白为何还要b一下;

 

ENDPROC(__enable_mmu)

再看看紧接着的__turn_mmu_on函数:

 

/*

 * Enable the MMU.  This completely changes the structure of the visible

 * memory space.  You will not be able to trace execution through this.

 * If you have an enquiry about this, *please* check the linux-arm-kernel

 * mailing list archives BEFORE sending another post to the list.

 *

 *  r0  = cp#15 control register

 *  r13 = *virtual* address to jump to upon completion

 *

 * other registers depend on the function called upon completion

 */

.align 5

原来是因为有这个,所以要b过来,但为什么是以5对齐?在网上搜索了一下,原来.align n的语法,有按照n对齐的,也有按照2的n次方对齐的,而arm-linux是按照2的n次方对齐的,即,是以20字节位置对齐的,详见某篇博文:http://www.eetop.cn/blog/html/45/11145-1211.html

 

__turn_mmu_on:

mov r0, r0

暂时认为这是常规的nop语句……

 

mcr p15, 0, r0, c1, c0, 0 @ write control reg

终于将寄存器r0的值写入到了mmu控制寄存器中,此时的CPU终于可以“内牛满面”!

 

mrc p15, 0, r3, c0, c0, 0 @ read id reg

对于Cortex A8处理器来说,此时寄存器r3的值也许是:0x413fc082字样,其中41代表ARM,c08就是Cortex A8;

 

mov r3, r3

mov r3, r3

继续认为这是nop语句,或者说,在这里是清除流水线,那么,之后的CPU,已经平稳过渡到了虚拟地址空间的环境?(我不敢确认)……

 

mov pc, r13

无需废话了,很久以前,寄存器r13就准备好了__switch_data的入口地址;

ENDPROC(__turn_mmu_on)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值