物理地址(实际在内存硬件里面的地址)是实在的存在于计算机中的一个实体,程序访问到了就可以直接修改,哪怕这个是分配给其他进程的。
虚拟地址(指令里用到的内存地址)并不真实存在于计算机中,每个进程都分配有自己的虚拟空间,而且只能访问自己被分配使用的空间。这样可以将程序做到内存隔离。
为什么我们程序里地址连续?
首先程序的占用的内存空间是连续的,因为执行的时候是程序计数器是顺序地一条一条指令执行的,所以指令必须放在一起。
所以就需要在物理内存上找一段连续的分给他,也就是通过物理内存分段进行映射,但是这样会导致物理内存上产生大量碎片。
所以就需要内存分页,将物理内存预先切成一段固定大小的空间,同时将程序需要的内存也切成固定的空间(页),这样在程序运行的时候将需要的页加载到物理内存即可。
由于程序拿到的都是虚拟内存,所以都是连续的,但是在实际物理内存上,页分配到物理内存的位置可能不同,在物理内存的地址根据实际情况不同,可能是分段连续的。
为什么需要TLB Translation lookaside buffer?
由于加入了页,会导致访问一个物理内存,需要多次查表,所以需要对内存映射的地址进行缓存(TLB),加速其访问到物理内存的速度。