到底什么是虚拟地址呢?它和物理地址的区别又在哪呢?
一. 虚拟地址的作用
1. 使代码的移植性更好,在不同平台进行编译以后,就可以直接运行,因为到别的系统,会将你的虚拟地址转换为物理地址,而使用的物理地址,那就得考虑这块物理地址是否被别人使用了
2. 不需要考虑内存分配的问题。
3. 虚拟地址映射的不一定是物理地址,还可能是硬盘上的某一块地方
二. 虚拟地址和物理地址是怎么映射的呢?
进程想要访问真正的物理地址,首先要先将虚拟地址转换为线性地址,然后经过MMU就可以将线性地址转换为真正的物理地址。
而虚拟地址和线性地址是如何进行转换的呢:
转换过程中,需要段寄存器,段寄存器中存储的是描述表的索引。描述符中存放基地址,通过基地址加上虚拟地址这个偏移量就可算出线性地址了。而在linux系统中,虚拟地址和线性地址是相等的。
而线性地址和物理地址是如何进行转换的呢:
1.从CR3寄存器中取出页目录的地址。
2.根据线性地址中的前10位,找到页目录的索引。
3.根据页目录项的值与中间10位相加后得到页表中的索引。
4.将页的起始地址与最后的12位相加后得到最终的物理地址。
通过线性地址找到页目录中的页表,然后找到页表中的页表项,最终通过页表项和线性地址中的偏移,来找到最终的物理地址。