OSTEP:虚拟内存和物理内存地址转换

第十五章:机制:地址转换

该章节主要引出了基址寄存器和界限寄存器的概念,表述了在操作系统内程序执行的时候虚拟内存的分布和物理内存的地址转换关系

  1. 判断是否越界只需要将访问内存地址大小和Limit进行比较,在小于Limit的情况下直接做加法即可

  2. 获取到所有访问的数据后,可以发现访问的地址中最大的为

    1
    VA  9: 0x000003a1 (decimal:  929)

    因此只需要将-l设置为930即可

    补充为什么不是929

    界限寄存器是在基址寄存器的基础上开始limit个单位的内存可被使用,就好比数组中的limit为10个空间的情况下,只有0-9可以被使用。对应到该题,如果想要让(0x000003a1)的地址不越界,则需要设置930个可用空间

  3. 题目默认的物理地址为16k,也就是16,384,只需要设置-b16384 - 100 = 16284即可

  4. 和上文实验差别不大,其中-a参数是设置随即生成的取地址的大小范围,-p为设置物理内存的最大范围,实际内存主要是否越界只和-b的基址寄存器、-l的界限寄存器以及-p的物理内存有关系,-a作为一个随机数范围没有实际含义

  5. 通过PyPlot画图,在默认的-n情况下,当limit从0逐渐增加到asize的时候,可以得到大致如下的图片

    limit

    附画图代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import os
    import re
    import matplotlib.pyplot as plt

    def execRelocation(seed, limit, num):
    r = os.popen('python3 relocation.py -s %d -l %d -c' % (seed, limit))
    pass_num = r.read().count("VALID")
    r.close()
    return pass_num / num

    if __name__ == '__main__':
    limitTop = 1024
    limit_list = []
    case_list = []
    # 从 0 - limitTop开始以50为公差测试对应通过的概率
    for i in range(0, limitTop, 50):
    sum = 0
    # 对于每个limit重复实验20次,取平均值
    for j in range(0, 20):
    sum += execRelocation(j, i, 10)
    # 结果存入list
    case_list.append(sum / 10)
    limit_list.append(i)
    # 画图
    plt.xlabel("limit")
    plt.ylabel("pass rate")
    plt.plot(limit_list, case_list)
    plt.savefig("limit.png")

OSTEP:虚拟内存和物理内存地址转换
https://halc.top/p/1724953e
作者
HalcyonAzure
发布于
2022年4月19日
许可协议