本章介绍了内存虚拟化的机制:地址转换。
地址转换采用基址寄存器和界限寄存器来实现程序的地址重映射和访问区域限制。地址重映射对于程序是透明的,每一个程序或者进程在运行时会获得一块地址,即私有空间,这个私有空间的起始地址是0,而真实的物理地址=程序的虚拟地址+基址寄存器的值。
为了限制程序访问的空间,使用界限寄存器来实现访问保护。如果访问的地址超出界限寄存器或者问负值则操作系统会做出某些特定的响应。
所以,地址转换的高效率需要底层硬件的支持。
存在的问题:
- 每个程序在分配完内存之后,栈和堆占用的内存通常很小,内部可能存在没有使用的内存,即存在内存碎片,造成内存浪费
下面的课后作业需要relocation.py
第一题
1.用种子1、2和3运行,并计算进程生成的每个虚拟地址是处于界限内还是界限外?如果在界限内,请计算地址转换。
显然只有VA 1
在界限内,物理地址:Base + 0x00000105 = 0x00003741
另外四个虚拟地址都是 segmentation violation
另外两个种子就贴了。
第二题
2.使用以下标志运行:-s 0 -n 10。为了确保所有生成的虚拟地址都处于边界内,要将-l(界限寄存器)设置为什么值?
使用固定的种子生成的随机数是一样的,所以是生成的最大虚拟地址是929,所以limit至少应设置为929
第三题
3.使用以下标志运行:-s 1 -n 10 -l 100。可以设置基址寄存器的最大值是多少,以便地址空间仍然完全放在物理内存中?(原文翻译有误,建议对照英文pdf)
最大界限值 = phys - limit
第四题
4.运行和第3题相同的操作,但使用较大的地址空间(-a)和物理内存(-p)。
第五题
5.作为边界寄存器的值的函数,随机生成的虚拟地址的哪一部分是有效的?画一个图,使用不同随机种子运行,限制值从0到最大地址空间大小。
这个翻译,我真的会谢!:(
问题是随机生成的虚拟地址有多少是有效的?
当然必须满足虚拟地址小于界限寄存器的值。