【操作系统基础】内存管理——虚拟内存概念及分页机制
发布网友
发布时间:2024-09-28 00:19
我来回答
共1个回答
热心网友
时间:2024-10-28 23:13
操作系统与CPU共同实现的内存虚拟化技术是虚拟内存,这种技术通过虚拟化内存使得每个程序都面对一个完整的、连续的虚拟地址空间。
虚拟内存的好处在于它避免了程序直接面对物理地址,主要解决了以下问题:
具体来说,操作系统通过查表的方式将虚拟内存与物理内存进行映射。操作系统使用页表来记录程序中所有虚拟地址与物理地址的映射关系,这种表格称为页表。因此,连续递增的逻辑虚拟地址对应的物理地址不一定是连续的。
现代操作系统对于虚拟内存调度的最小单位是“页”,一般使用4k大小的连续物理空间作为一个内存页。也就是说,页表中所记录的最小单位是4k的页,因此一个虚拟地址可以分为两部分:页地址和页内偏移地址。通常这里需要计算。
在了解了分页存储管理的基本概念之后,我们需要了解地址映射的原理。由于操作系统通过页表进行虚拟地址与物理地址的映射,因此首先需要认识页表。每个程序都有自己的页表,页表是程序运行所需的资源,通常也存储在物理内存中,只能由操作系统访问。
虚拟地址作为页表的索引,查询到对应的物理页起始地址,再通过页内偏移定位到实际的物理地址空间。
在这种映射机制下,CPU向操作系统提供了页表基址寄存器,用于指向程序页表所存放的物理地址的基地址。同时,CPU会提供专门的地址映射单元进行地址管理,称为内存管理单元(MMU)。操作系统会为每个程序维护页表的基地址,在程序运行期间写入到页表基址寄存器,在进行地址映射时,MMU向CPU访问页表基址寄存器,通过加上虚拟页号找到存放物理页号的内存地址(页表项),再进行地址的翻译。
关于页表基址寄存器和虚拟地址的联合机制只是个人的理解,如页表基址和虚拟页号是否是相加的关系不得而知,如何索引到页表项也暂时不确定,后续如果有更深的理解会更新。
页表既然是存放在内存中,也就存在物理大小的概念。由于页表需要记录所有地址的映射关系,因此页表的大小与虚拟内存容量正相关。假设虚拟内存的地址位宽为32bit,其中12bit为页内偏移,则剩下的20bit为页的数量。既然每个页都需要被记录,则页表项为2^20个。通常一个页表项需要记录20bit的物理页号,因此这样一个虚拟内存管理系统分配给一个程序的页表至少需要2^20*20bit的容量,至少是2.6MByte,而如果是64bit的地址空间,一个页表至少是11,258,999GByte。这种机制显然是不合理的。因此,操作系统通过多级页表的方法减少驻留在内存中的页面尺寸,减小页表。
具体来说,高层页表的页表项并不保存物理页号,而是保存下一级页表的起始地址,如同页表基址寄存器的功能一样。在这种方式下,操作系统不需要把所有的页表项都存放到内存中,部分页表项成为空洞,在需要用到这个页表项对应的空间时才进行填写。如图所示的*页表,其中只用到了最低地址和最高地址的页表项,因此只需要在内存中驻留2级页表、最高和最低地址的1级页表以及最高和最低地址的0级页表,共5个页表子集。其中单个高层的页表项所对应的页表项数量由不同的CPU和操作系统决定。
多级页表使得虚拟地址的虚拟页号有了更多的含义。在四级页表情况下,一个虚拟地址可以分为:
在使用多级页表后,存在着页表项动态填写的需求。