首页 > 编程知识 正文

java内存分页,内存分页的目的

时间:2023-05-05 17:44:51 阅读:119676 作者:1441

为什么要在保护模式下分页,内存访问使用段机制————“lyd BG :段内偏移地址”方案,引入段描述符概念以增强段内存的安全性和可管理性但是,只有这些是不够的。 如果有太多的APP应用程序、太多的内存碎片,或者需要更换为硬盘内存段,然后重新加载到内存中,导致内存找不到合适大小的空间,该怎么办?

要替换大部分当前操作系统,必须将一些进程中未使用的内存段更换为硬盘,并腾出内存空间供所需的进程使用。 由于硬盘是速度比内存慢的设备,因此在两个速度不匹配的设备之间交换数据对内存来说是徒劳的,但使用适当的替换算法可以减少替换次数。

在保护模式下,内存段的各种属性由段描述符存储,CPU在引用段时必须检查段描述符。 即使段不存在于内存中,也就是说,即使CPU允许段描述表中注册的段不存在于内存中,段描述符也存储在GDT或LDT中。 描述符的p位为1表示段存在于内存中,访问段后,CPU将段描述符的a位置设为1,表示最近访问了内存段。

段描述符的a位由CPU设置为1,清除0由操作系统进行。 操作系统在每次找到此位置1时将此位清零,同时对一个周期内此位变为1的次数进行计数,从而可以知道此存储器段的使用频率,并在物理存储器不足时看到使用频率最低的段将段交换到硬盘后,操作系统会将段的段描述符p的位置设置为0,以指示段已经不在内存中。

如上所述,计算机的软件和硬件相互协作完成存储器的置换工作。 这在一定程度上解决了内存不足的问题,但还是有缺陷。 例如,如果物理内存非常小,无法容纳任何进程的段,则无法运行该进程,也无法执行段替换工作。 造成这种问题的本质原因是,在当前只有段的情况下,CPU认为线性地址等于物理地址,而线性地址由编译器编译,由于其本身是连续的,物理地址也必须连续,但我们可以使用因此,为了解决这个问题,需要解除线性地址和物理地址的一对一对应关系,在它们之间重构——,即,使线性地址连续,使物理地址不连续。 在操作系统中实现该映射的策略是内存分页机制,相关的数据结构是页表。

分页机制的分页机制实际上是建立在划分机制之上的。 在保护模式下,中段寄存器的内容已经是选择器,但由于选择器最终是用于找到lydbg的,所以其存储器访问的中心机制仍然是基于“lydbg:段内偏移地址”的绝对地址、 该线性地址是分段机制下的物理地址,可以直接从CPU发送到地址总线。 分段机制下的内存访问如下图所示。

由于分页机制基于分区机制,因此分页将在分区之后进行,如下图所示。

与分段机制不同,如果打开分页机制,则“lydbg:段内偏移地址”是经过段部件处理而获得的线性地址不再是物理地址,而是虚拟地址,依此类推这是因为CPU必须获取物理地址。 必须在页面表中搜索与虚拟地址对应的物理地址。 页面部件自动进行。

分页机制的作用主要是提供从连续线性地址到不连续物理地址的映射,用同一页替换大小不同的段。 由于寻呼机制是建立在划分机制之上的,所以即使在寻呼机制之下也必须经过逻辑划分。 每次加载进程时,操作系统都会根据进程中每个段的起始范围,在进程自身的4GB虚拟地址空间中查找可用空间并分配内存段。 操作系统开始为这些虚拟内存分配实际的物理内存页。 查找物理内存中可用的页面,并在页面中注册物理页面地址。 这可以完成分页机制中虚拟页面到物理页面的映射,并且每个进程占用4GB的地址空间。

一级页面表页面是地址空间的测量单位,因此线性地址的一个页面也必须与物理地址的一个页面相对应。 一页的大小为4KB。 于是,4GB的地址空间被分割为1M个页面。 这意味着4GB的空间可以包含1048576页,页面表当然也需要1048576页的表项。 这就是一级页面表的结构。

一级页面表的线性地址与物理地址的映射关系如何? Linux将页面表条目的32位地址分为两部分,第0-11位表示页面大小,可用作页面内地址的第12-31位表示页数,可用于索引一个页面。 CPU集成了用于页面表寻址的硬件——页面部件。

添加一级页面表后,地址转换的完整过程如下。 传递“lydbg:段内偏移地址”,由段部件处理后生成线性地址,将其传递给页面部件进行进一步处理。 页面部件将传递的线性地址分为高位20位和低位12位。 高位20位是页表物理地址中的偏移地址部分,将其向左移动2位,与cr3寄存器的页表的物理地址相加,得到页表条目存在的位置,从页表条目映射的物理页地址低位12位作为物理页的页内偏移地址,在其上加上物理页地址而得到的地址是最终转换后的物理地址。 的步骤简单说明如下:必须获取页面表条目所在的物理地址,然后从中提取物理页的部分地址信息以获取物理页。

二级页表一级页表解决了纯段内存缺陷,但本身还不够。 例如,由于操作系统占用4GB虚拟地址空间的高1GB,用户进程占用低3GB,因此必须提前创建一级页面表中的所有页面表项。 此外,每个进程都有自己的页面表,随着进程的增多,分配给每个进程页面表的物理空间也不少。

第2级页面表可以很好地解决上述问题,并在第1级页面表中虚拟化数据结构为——页的目录表,以管理第1级页面表。 因此,可以根据需要动态创建和释放内存,而无需预先划分区域。 此外,由于每个进程都有一个页面目录表,因此进程实体占用的空间将进一步缩小。

无论是多少阶段的页面表,都是标准页的

尺寸都是4KB,所以4GB线性地址空间一共有1M个标准页。一级页表是将这1M个标准页放置到一张页表中,二级页表则是将这1M个标准页平均放置到1K(1024)个页表中,每个页表包含1K个页表项。这1K个页表则由页目录表来管理。
页目录表的元素——页目录表项可以作为索引得到页表的物理地址。页表和页目录表本身作为一种数据结构本身要占用一定物理内存空间,但页表结构本身与其他数据混布在物理内存中,它们所占用的物理页从外在形式上与其他数据占用的物理页没有什么不同,只有CPU才能“分辨”。页表在建立之初还是相对较整洁的,随着操作系统分配和释放内存的动作越来越多,物理内存的布局就更加零散。
在一级页表中,虚拟地址被拆分成2个部分,而由于二级页表增加了页目录表这个数据结构,因此虚拟地址被拆分成了3个部分。
二级页表中,32位的虚拟地址中,高10位(22-31)用来在页目录表中定位一个页目录表项(PDE),PDE中有页表的物理地址。找到页表后,中间10位(12-21)则用来在页表中定位一个页表项(PTE),PTE中有分配的物理页地址。余下低12位则用于页内偏移量。
由此我们可以得出使用二级页表的系统的完整寻址过程:(1)用虚拟地址的高10位乘4,作为页目录表内的偏移地址,加上页目录表的物理地址得到PDE的物理地址,读取PDE得到页表的物理地址。(2)用虚拟地址的中间10位乘4作为页表内的偏移地址,加上在上一步中得到的页表的物理地址,得到PTE,从PTE中读取到分配的物理页地址。(3)虚拟地址的高10位和中间10位分别是PDE和PTE的索引值,因此它们需要加以转换(左移2位),但低12位不需要左移,它直接与上一步中得到的物理页地址相加即可得到最终转换的物理地址。

页表项和页目录表项

页表项和页目录表项的结构如下图所示:

0~11位的含义如下:
P:Present,即存在位。若为1表示该页存在于物理内存中,若为0则表示该表不在物理内存中。
RW:Read/Write,即读写位。为1表示可读可写,为0表示可读不可写。
US:User/Supervisor,意为普通用户/超级用户标识位。为1表示处于User级(0、1、2、3)特权的程序都可以访问该页,为0则表示只有处于Supervisor级(0、1、2)的程序才能访问。
PWT:Page-Level Write-Through,页级通写位。若为1表示此项采用通写方式,即表示该页不仅是普通内存,还是高速缓存,此项与快表有关。
PCD:Page-Level Cache Disable,页级告诉缓存禁止位。若为1表示该页启用高速缓存,为0则表示禁止将该页缓存。
A:Accessed,访问位。若为1表示该页被CPU访问过,由CPU置1,由操作系统清0。
D,Dirty,脏页位。当CPU对一个页执行写操作时,就会设置对应页表项的D位为1,此项仅针对页表项有效,并不会修改页目录表项的D位。
PAT:Page Attribute Table,页属性位,在页一级的粒度上设置内存属性。
G:Global,全局位。与TLB有关,为1表示该页是全局页,该页在高速缓存TLB中一直保存。
AVL:Available,可用位。为1表示用户进程可用该页,为0则不可用。对操作系统无效。

快表

分页机制实现了线性地址与物理地址的分离,它为内存管理提供了灵活性,但分页的数据结构毕竟都是存在于内存中的,相对于CPU来说内存时低速设备,因此分页无法解决I/O速度不匹配的问题。且多级页表(现代的64位操作系统已经实现了三级、四级页表的机制)的地址转换过程繁琐,涉及频繁的内存访问,这更拖慢了速度。
因为不管是几级页表,本质上都是虚拟地址向物理地址映射,因此需要有一个“捷径”来快速获得物理地址,免去中间的查表过程——快表(Translation Lookaside Buffer,TLB)应运而生。快表基于程序的局部性原理,将进来常用的地址和指令加载到一块专门的高速缓存中,缓存中存放的条目就是虚拟地址页到物理地址页的直接映射。具体来说,TLB中的条目就是虚拟地址的高20位到物理地址高20位的映射。除此之外TLB中还有一些属性位。
有了TLB,处理器在寻址之前就会用虚拟地址的高20位作为索引来查找TLB中的相关条目,如果匹配成功(或者成为命中)则返回虚拟地址所映射的物理页框地址,否则会走之前所属的查表流程,获得页框物理地址后再更新TLB。
本文部分内容摘自《操作系统真象还原》,有改动

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。