当前位置: 代码迷 >> 驱动开发 >> mmu_enable授命执行的前后顺序
  详细解决方案

mmu_enable授命执行的前后顺序

热度:90   发布时间:2016-04-28 10:29:10.0
mmu_enable指令执行的前后顺序
本帖最后由 edwardlulinux 于 2012-10-07 01:01:15 编辑
hi 大侠们:
    跪求问题答案,还望高手指点。

前提:
    1,cpu就是取值运算。当没有分支指令时叫顺序执行。pc指针自加,取到后面的指令。
    2,当有分支指令时,跳转到某一个位置取指令去执行。
问题:
    当enable mmu后,pc指针还是自动加操作?如果这时候是自加的操作,在enable mmu后和之前的地址就是不一样了。需要转换,这时候如何实现无缝跳转?
1 __turn_mmu_on:
2     mov    r0, r0
3     mcr    p15, 0, r0, c1, c0, 0        @ 设置cp#15控制寄存器(启用MMU)
4     mrc    p15, 0, r3, c0, c0, 0        @ read id reg
5     mov    r3, r3
6     mov    r3, r13                        @ r3中装入最后要跳入的*虚拟*地址
7     mov    pc, r3                        @ 跳转到__mmap_switched
8 __enable_mmu_end:

A:
假设mmutable已近建立完成。就是最简单的线性映射的关系:
0xC000 0000,0xC000 0000+OFFSET -> 0x5000 0000,0x5000 0000+OFFSET
假设 3 4 行代码之前pc的内容是0xC0008000的值。但是在第5行后pc的内容是自动更新吗?还是依旧在0xC000800C?或者是0x5000000C?
假设__mmap_switched这个函数的地址是连接器按照0xC0000000的base来连接的,那么在mov pc r3的时候是不是要把r3寄存器内容修改成虚拟地址,应为这个时候mmu已经启动了。

B:
在补充一个问题:
paging_ini函数会再次建立页表,这时候的页表为精细页表(4K)的。那么在paging_init的之后在哪里有调用enable_mmu的函数,再次使能mmu,使mmu进入(4K)的页表模式?

请高手不要吝惜笔墨,真心求教。
谢谢


------解决方案--------------------
新手问个问题,以指令寄存器存储一条指令开始,到主存中获得数据之前,指令的地址码部分是如何在CPU内部及主存之间流动和虚实转换的?(希望具体到寄存器如PC寄存器、总线等)
谢谢
------解决方案--------------------
关键的PC寄存器与MMU是怎么样联系的?
  相关解决方案