在操作系统上的实现的,用户空间的全部是虚拟地址。即能打印的全部是虚拟地址,只有裸机变成打印的,接触的才是真正的无力地址。
LDR R1,【R2】,这个r2内写的也是虚拟地址,但是这个虚拟地址和真正的物理地址的值一样,原因是关闭了MMU(内存管理单元)。MMU负责虚拟地址到物理地址的映射,并提供硬件机制的内存条件检查。
ALU和MMU都是在CUP内,当MMU关闭的时候,就访问虚拟地址,当MMU开启的时候,就会访问物理地址,MMU不存储映射关系,只是一个查表者。
关于虚拟地址有几个很重要的地址,0x8048000是代码段起始地址,0x804a900(相差4K)是数据段的起始地是,可以通过程序来验证(包括栈地址:用户空间栈和内核栈),通过程序结果可以结合1总结。
验证程序:
1 #include<stdio.h>
2 int global = 20;
3 int main()
4 {
5 int local = 100;
6 printf(".text = %p\n",main);
7 printf(".data = %p\n",&global);
8 printf(".stack = %p\n",&local);
9 return 0;
10 }