课程作业-第十五章:
15.1用种子1、2和3运行,并计算进程生成的每个虚拟地址是处于界限内还是界限外?如果在界限内,请计算地址转换。
答:
根据课本定义,CPU首先将虚拟地址VA与限制寄存器中的值进行比较。如果虚拟地址VA的值小于限制寄存器中的值,那么CPU会将虚拟地址VA与基址寄存器中的值相加,得到的结果即为对应的物理地址PA。然而,如果虚拟地址VA的值不小于限制寄存器中的值,则会导致内存访问出现问题,即发生越界情况,此时地址转换将不会成功进行。
- 输入命令./relocation.py -s 1 -c,使用种子1运行
观察得知,Base的值为13884,而limit的值为290。现在逐一检查虚拟地址VA的转换情况:
①对于虚拟地址VA 0,其值为782,这个值大于limit的290,因此无法进行成功的地址转换。
②接下来,虚拟地址VA 1的值为261,这个值小于limit的290。于是,我们将这个值加上Base的13884,得到的结果14145即为对应的物理内存地址。
③虚拟地址VA 2的值为507,这个值大于limit的290,因此地址转换失败。
④同样地,虚拟地址VA 3的值为460,也大于limit的290,所以无法成功转换。
⑤最后,虚拟地址VA 4的值为667,这个值同样大于limit的290,因此地址转换同样无法成功。
- 输入命令./relocation.py -s 2 -c,使用种子2运行
同理,观察得知,Base的值为15529,而limit的值为500。现在逐一检查虚拟地址VA的转换情况:
①虚拟地址VA 0的值为57,这个值小于limit的500。因此,我们将其与Base的值15529相加,得到的结果15586即为对应的物理内存地址。
②同样,虚拟地址VA 1的值为86,也小于limit的500。于是,我们将其加上Base的值15529,到的结果15615即为该虚拟地址在物理内存中的对应地址。
③虚拟地址VA 2的值为855,这个值大于limit的500,因此无法进行成功的地址转换。
④虚拟地址VA 3的值为753,以及VA 4的值为685,这两个值都大于limit的500,所以它们的地址转换也都失败了。
- 输入命令./relocation.py -s 3 -c,使用种子3运行
同理,观察得到,Base的值为8916,而limit的值为316。按照虚拟地址VA的值进行地址转换的检验:
①虚拟地址VA 0的值为378,这个值大于limit的316,因此无法进行成功的地址转换。
②虚拟地址VA 1的值为618,也大于limit的316,所以地址转换失败。
③虚拟地址VA 2的值为640,同样大于limit的316,因此也无法成功转换。
④虚拟地址VA 3的值为67,这个值小于limit的316。因此,我们将它加上Base的值8916,得到的结果8983即为该虚拟地址在物理内存中的对应地址。
⑤虚拟地址VA 4的值为13,也小于limit的316。于是,我们将其与Base的值8916相加,得到的结果8929即为该虚拟地址对应的物理内存地址。
综上所述,只有当虚拟地址VA的值小于limit的值时,才能通过加上Base的值得到对应的物理内存地址;若VA的值不小于limit的值,则地址转换将失败。
15.3使用以下标志运行:-s 1 -n 10 -l 100。可以设置基址的最大值是多少,以便地址空间仍然完全放在物理内存中?
答:
根据题目中的命令要求,设定了限制寄存器limit的值为100,这是通过参数-s 1 -n 10 -l 100来指定的。
同时,根据README文件中的说明,模拟程序的内存大小是16K。基于地址转换的规则,我们需要计算基址寄存器的最大值。由于内存总大小为16K,即16乘以1024字节,并且限制寄存器已经占用了100个字节的空间,因此基址寄存器的最大值应该是总内存大小减去限制寄存器所占用的空间。
因此,基址寄存器的最大值为:16乘以1024减去100,即16284。
(1)使用命令./relocation.py -s 1 -n 10 -l 100 -b 16285尝试是否可以分配成功。
根据上述运行结果,这样的话会导致错误,并提示我们Base+Limit的值为16385。
(2)再次使用命令./relocation.py -s 1 -n 10 -l 100 -b 16284尝试是否可以分配成功。
根据运行结果,可以看到,这次程序成功运行。所以,可以得到基址寄存器的最大值为16284。