• 操作系统:内存管理(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位基地址就相当于段寄存器)

  • 相关阅读:
    gin解决CORS跨域问题
    线程Demo演示
    委托调用匿名方法
    扩展的使用
    DataGridView使用技巧(七、设定列宽和行高自动调整).NET
    url post 请求方法
    记录系统日志方法
    TSQL查询进阶理解SQL Server中索引的概念,原理以及其他
    MongoDB单节点转换成复制集
    MySQL主从架构小版本升级
  • 原文地址:https://www.cnblogs.com/sinkinben/p/10833233.html
Copyright © 2020-2023  润新知