美文网首页计算机基础知识
操作系统拾遗--内存管理之分页式存储(一)

操作系统拾遗--内存管理之分页式存储(一)

作者: FrankerSung | 来源:发表于2019-02-26 19:36 被阅读0次
    1. 概念
    • 逻辑地址:CPU所生成的地址。逻辑地址分为两部分:
      ① P--页号:它包含每个页在物理内存中的基址,用来作为页表的索引;
      ② W--页偏移:同基址相结合,用来确定送入内存设备的物理内存地址。
      ③ 如果有k位表示页内偏移量,则说明该系统中一个页面的大小是2k个内存单元。
      ④ 如果有m位表示页号,则说明在该系统中,一个进程最多允许有2m个页面。

      逻辑结构图
    • 物理地址:内存单元所看到的地址。逻辑地址空间为2m,且页大小为2n,那么逻辑地址的高m-n位表示页号,低n位表示页偏移。

    • 逻辑地址空间:由程序所生成的所有逻辑地址的集合。

    • 物理地址空间:与逻辑地址相对应的内存中所有物理地址的集合,用户程序看不见真正的物理地址。
      注:用户只生成逻辑地址,且认为进程的地址空间为0到max。物理地址范围从R+0到R+max,R为基地址,地址映射-将程序地址空间中使用的逻辑地址变换成内存中的物理地址的过程。由内存管理单元(MMU)来完成。

    2.内存分页式存储--地址转换
    2.1. 计算物理地址

    1).算出逻辑地址对应的页号
    2).要知道该页号对应页面在内存中的起始地址
    3).要算出逻辑地址在页面内的偏移量
    4).物理地址=页面始址+页内偏移量

    2.2. 如何计算

    页号=逻辑地址/页面长度(取除法的整数部分)
    页内偏移量=逻辑地址%页面长度(取除法的余数部分)
    页面在内存中的起始位置:操作系统需要用某种数据结构记录进程各个页面的起始位置。

    2.3. 举例
    页号          80/50=1
    页内偏移量     80%50=30
    1号页在内存中的起始位置为400[操作系统会采用页表记录]
    则物理地址为 400 + 30
    
    2.4. 计算机真实的计算方式[重复一遍~]

    如果每个页面大小为 2k B,用二进制数表示逻辑地址,则末尾k位即为页内偏移量,其余部分就是页号。


    3. 页表

    为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表
    说是页表,其实就是一个类似数组的数据结构,每一项数据元素称为页表项,页表项又有页号和块号构成:

    1. 一个进程对应一张页表
    2. 进程的每一页对应一个页表项
    3. 每个页表项由页号和块号组成
    4. 页表记录进程页面和实际存放的内存块之间的对应关系
    5. 每个页表项的长度是相同的,页号是隐含的

    为什么每个页表项的长度是相同的,页号是隐含的?

    假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该为多少字节?

    4GB=232 B, 4KB=212 B
    因此4GB的内存总共会被分为232/212=220个内存块,因此内存块号的范围应该是0~220-1。
    因此至少要20个二进制位才能表示这么多的内存块号,因此至少要3个字节才够(每个字节8个二进制位,3个字节共24个二进制位)。
    各页表项会按顺序连续地存放在内存中,如果该页表在内存中存放的起始地址为x,则M号页对应的页表项一定是存放在内存地址为×+3M。
    因此,页表中的页号可以是隐含的。
    只需要知道页表存放的起始地址和页表项长度,即可找到各个页号对应的页表项存放的位置
    在本例中,一个页表项占3B,如果进程由n个页面,则该进程的页表总共会占3
    n个字节


    4. 基本地址变换机构

    基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
    通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。
    进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,
    当进程被调度时,操作系统内核会把它们放到页表寄存器中。

    设页面大小为L,逻辑地址A 到 物理地址E的变换过程如下:
    ① 计算页号P和页内偏移量W
    (如果用十进制数手算,则P=A/L,W=A%L。但是在计算机实际运行时,逻辑地址结构是固定不变的,而且页面大小是2的整数幂次方,因此计算机硬件可以更快地得到二进制表示的页号、页内偏移量)
    ② 比较页号P和页表长度M,若P ≥ M,则产生越界中断,否则继续执行。
    (注意:页号是从0开始的,而页表长度至少是1,因此P = M时也会越界)
    ③ 页表中页号P对应的页表项地址 = 页表起始地址F + 页号P * 页表项长度,取出该页表项内容b,即为内存块号。

    注意区分页页表长度、表项长度、页面大小的区别。
    页表长度指的是这个页表中总共有几个页表项,即总共有几个页;
    页表项长度指的是毎个页表项占多大的存储空间;
    页面大小指的是一个页面占多大的存储空间
    

    ④ 计算E=b*L+W,用得到的物理地址E去访存。(如果内存块号、页面偏移就是用二进制表示的,那么把二者拼接起来就是最终的物理地址了)。

    image.png

    参考
    《MOOC 王道操作系统》

    相关文章

      网友评论

        本文标题:操作系统拾遗--内存管理之分页式存储(一)

        本文链接:https://www.haomeiwen.com/subject/sjgoyqtx.html