Linux学习1(虚拟地址、物理地址、地址映射)
2021-11-02 本文已影响0人
HardMan
虚拟地址
在虚拟内存出现以前,程序寻址用的都是物理地址,这种方式存在几个问题
1、程序能寻址的范围是有限的,取决于CPU的地址线条数,比如32位的操作系统可供寻址的范围是2^32次,即4g。因此每个程序都要分配4g的内存,并且这是固定的。因为物流内存是有限的,多个进程执行的时候,内存不够用,于是没有分配到资源的进行就只能等待,很没用效率。
2、由于内存是随机分配的,因此程序运行时的地址也是不正确。
3、缺少安全性,通过指针直接访问物理地址,其它进程可能会修改其它进程的数据,甚至内核的数据。
为了解决上述问题,出现了虚拟内存。
每个程序运行都会被分配4g虚拟内存(后续都以32位操作系统为例),虚拟内存所对应的地址便是虚拟地址,它是连续的。其实程序以为自己分配到是4g内存,但真正被分配到的物理内存只有一点点,实际正在运行用了多少内存,便会分配多少内存。同样,进程也只是认为内存地址是连续的,实际上,它的数据是存储在多个物理内存碎片上,还有一部分存储在外部存储器上(磁盘),在需要时,将数据交换进内存。
进程要访问一个地址,必须要将虚拟内存转换成真正的物理地址。每个进程共享一整块物理内存,每个进程只把自己目前需要访问的虚拟地址空间映射到物理内存上。
页表的具体访问过程
1.CPU想访问虚拟地址所在的虚拟页,根据页表,找出页表中对应的页表项,判断有效位
2.若有效位为1,则表示有对应的物理地址,直接返回
3.若有效位位0,则表示数据在磁盘上,发生缺页异常,中断运行,将磁盘文件内容缓存到该物理地址对应的页上,然后将有效位变成1,第二部分存储物理内存对应地址。
4.缺页处理完,返回中断前的命令,重新执行。此时缓存命中
5.将找到的内容映射到高速缓存区,CPU从高速缓存区读取该值,结束。