目录

虚拟内存是什么内存?

目录

虚拟内存

可执行文件被加载到内存,就成了一个进程

https://cdn.cjpa.top/image-20210518115901866.png

在dos时期,采用的是实地址模式,进程直接使用物理地址,在这种模式下,进程可以直接修改物理内存,很容易发生占用其他进程内存的情况,甚至可能直接覆盖操作系统的内存。

后来出现了保护模式,进程不直接使用物理内存地址,使用虚拟的内存地址,操作系统负责把虚拟内存映射进物理内存。

在32位系统中,物理内存中每4KB作为一页,从虚拟内存到物理内存,以页为单位映射

https://cdn.cjpa.top/image-20210518120439253.png

操作系统会以链表的形式记录各个进程的操作信息,在windows中被称为进程控制块(PCB),在linux中对应task_struct结构体。

每个进程中都有一个指针,指针指向一个页目录,页目录存储当前进程页目录的物理地址,页目录也是一个内存页,存储一系列指针,指向存储物理内存起始地址的页表

https://cdn.cjpa.top/image-20210518120624767.png

https://cdn.cjpa.top/image-20210518120725437.png

32位下,一个内存地址占4字节,一个页目录可以寻址1024个页表,每个页表又可以寻址1024个物理内存页

1024 * 1024 * 4K = 4GB

https://cdn.cjpa.top/image-20210518134103136.png

这样就实现了映射,但其实页表里面记录的地址,只是一个区间,其实真正可以使用的比较少,因为有些是没有被真正的映射的。

线性地址到物理地址的转换是有电脑中的 MMU 进行的。由于频繁查表会影响效率cpu会把已经转换好的地址映射关系放到TLB(Translation Lookaside Buffer)中