windows内核情景分析学习笔记5

1、“虚拟内存”机制

在硬件上,“虚拟内存”是由CPU芯片内部的MMU(存储管理单元)支持的。

在软件上,由内核中的内存管理模块实现。

采用虚拟内存机制,程序中使用的内存地址为虚拟地址。虚拟地址是无法访问物理内存的,必须经由MMU映射到某个物理页面上,转换为物理地址才能访问。

其原理图如下:

windows内核情景分析学习笔记5_第1张图片

 

2、采用虚拟内存的原因

主要原因是必须满足现代操作系统的基本要求:

①每个进程的虚拟地址范围是相同的,但实际映射到物理内存中不同的部位。例如:A进程与B进程,都把执行映像装入虚拟地址为0x50008000的地方,而实际物理地址当然不同。相比之下,如果都采用物理地址,那势必要对其中之一进行“重定位”,修改所有绝对地址。

②不同进程的虚拟地址被映射到物理内存中不同页面集合,每个进程都有自己的映射,互相之间没有交集,这样就解决了进程隔离的问题。

③将CPU的运行状态分为“用户态”和“内核态”,进程虚拟地址范围也分为两部分。对于windows,0x80000000以上属于系统空间,以下属于用户空间。

其次,出于经济考虑:

每个进程的地址空间有4GB之大,而物理内存显然远远小于此。这样,就有必要对物理内存进行复用,使一片物理内存在不同的时间为不同进程的虚拟内存使用,暂时不用的虚存内容,存入磁盘文件中(windows中就是页交换文件)。磁盘的存储成本比物理内存要少的多。当然倒换内存数据要耗费一定的CPU周期。

 

3、虚拟页面如何映射到物理页面

每个进程拥有自己的页面映射表。

页面映射表实际是个以虚存页面号为下标的数组。其中元素的内容决定了相应的虚存页面是否有映射、映射到哪一个物理页面、物理页面的保护模式。

x86有个专门的控制寄存器CR3,这个寄存器总是指向当前进程的页面映射表(使用物理地址)。

MMU根据CR3的指引找到当前页面映射表。

页面映射表并不全部缓存在CPU中,因为体积太大(4GB分为1M个页面,所以有1M个表项,每个表项4字节,一共需要4M存储空间)。CPU根据实际需要把当前用到的页面映射表项高速缓存在TLB(地址转换便查缓冲区,是CPU内部一块专用的高速缓存)。每当需要查找页面映射时,MMU首先会在TLB中寻找,找不到再访问物理内存。大大提高效率。

 

4、MMU的作用总结

①根据虚拟地址计算出该地址所属的页面。

②根据虚拟页面号在页面映射表中查找到对应的表项(先在TLB中查找,如找不到,则从物理内存加载页面映射表)。

③检查该表项的PA_PRESENT标志位,如果为1就表示已经映射到某个物理页面(但如需访问,还需权限检查)。

④如果PA_PRESENT标志位为0,则说明该虚存页面没有映射到物理内存中。

你可能感兴趣的:(windows,存储,X86,磁盘)