操作系统:内存管理(2)

日期:2019/5/7

关键词:内存管理;分页;分段

PS:只是一篇笔记,若是学习目的,不推荐此文章。

本节内容是内存的离散分配:分页;分段。

一、为什么需要二级分页

对于一台32位电脑,内存4GB。(实际上32位机器的最大内存也就是4GB)

对于一个进程而言,其逻辑地址空间为0-0xFFFFFFFF。(即使内存只有2GB,但逻辑地址空间还是232

最坏情况下,计算机中的进程使用了4GB内存:

采用分页机制,页大小为4KB。

最大页数:4GB/4KB = 220 个(或者老土地说1兆个)

所占空间大小:220 × 4字节 = 4×220 bytes = 4×210KB = 4MB的物理内存(页表本身相当于占了1024个页框,占据了内核太多的内存,所以才需要2级页表。)

2级页表的实质:分页是为了对进程离散内存分配,现在页表太大了,(现在页表也是进程映像的一部分了),所以对页表也进行分页,这是2级页表的实质。

如果页大小4KB,那么d占12位,P1+P2占20位。

上面提到页表最多会占1024个页框,所以一级页表分10位就够了,P1=10,P2=10

(2级页表寻址示意图,Pentium处理器使用此方式)

  • 缺点:访存3次(访问一级页表,访问二级页表,访问物理地址,最后一次才是目的)

二、分段

2.1 分段机制的前世

分段的诞生得从Intel 8086处理器的诞生说起。

8086处理器寄存器是16位的,而地址线却有20条(为什么不是16条?个人认为此处是为了适应内存硬件的发展,毕竟216 bytes = 64KB的内存,不够用的那一天总会来到的)。

所以CPU内部能处理的地址最多也就16位(通俗地说,就是CPU一眼看不完自家的后花园——"内存"),那如果8086配合了1MB的内存使用,CPU如何识别0xFFFF之外的内存地址呢?办法就是分段机制。

Intel在8086 CPU中设置了四个段寄存器:CS、DS、SS和ES,分别用于可执行代码段、数据段、堆栈段及其他段。

当程序中给出一个数据段的地址address,CPU访存之前先进行计算:paddr = (DS << 4) + address,得到的paddr才是真实的物理地址。

实际上这样的分段机制,并不是真的在将内存分为若干段,按照这样的划分方式,这些段可以相连,也可以重叠,一个物理地址可以对应多个逻辑地址。

DS

1002H

1233H

段内偏移

2325H

0015H

物理地址

12345H

12345H

我们再来看看后来的CPU,80386寄存器为32位,地址线也是32位,从CPU的角度看,能一眼看完4GB的后花园了;

现在的CPU,寄存器64位,地址线36位,最大可寻址是236 bytes = 64GB。

从这个角度讲,分段机制好像没有意义了。但是将程序分为数据段、堆栈段、代码段这种机制仍然使用至今。

2.2 操作系统中的分段

假设16为地址中,4位段号,12位偏移。

  • 先取段号,根据段号查询进程的段表,得到段的16位基地址。
  • 16位基地址与12偏移量直接相加。

(此处的16位基地址就相当于段寄存器)

原文地址:https://www.cnblogs.com/sinkinben/p/10833233.html