mmu_enable指令执行的前后顺序
前提:
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是怎么样联系的?