1 作业要求
通过运行 paging-linear-translate.py 这个程序,来理解进程虚拟地址到物理地址的转换,通过不同的参数来对进程地址空间,页表进行修改。
2 具体操作
2.1 参数说明
Options:
-h, --help 帮助信息
-s SEED, --seed=SEED 改变seed的值
-a ASIZE, --asize=ASIZE 改变虚拟地址大小
-p PSIZE, --physmem=PSIZE 改变物理地址大小
-P PAGESIZE, --pagesize=PAGESIZE 改变页大小
-n NUM, --addresses=NUM 测试的虚拟地址个数
-u USED, --used=USED Page Table中有效页的个数
-v 详细模式
-c 计算结果
2.2 具体测试
2.2.1 使用默认地址大小
虚拟地址的大小为16k (14 bit)。page大小为4k(12bit)。因此还剩下2bit用作Page Table的索引。因此Page Table的大小应该为4。
物理地址的大小为64k(16bit)。因为page的大小为4k(12bit),因此还剩下4bit。我们可以选择最左边的那个bit用作标志位,该标志位用来判断当前的物理页是否有效。
我们来计算第一个Virtual Address:0x00003229
将地址拆分:11 0x229
最左边的2个bit为11,因此对应于第四个Page。查看最左边一位:1 。因此该物理页有效。选择其中最右边的4bit:0x6(0110),因此最后的物理地址为:0x6229。
计算第二个Virtual Address:0x00001369
将地址拆分:01 0x369
最左边的2个bit为01,因此对应于第二个Page。查看最左边一位:0 。因此该物理页无效。输出Invalid。
其它二个Virtual Address的结果分析类似。
因此最后结果为:
VA | 虚拟地址 | 物理地址 | 结果 | VPN |
---|---|---|---|---|
VA | 0x00003229 | 0x00006229 | valid | 3 |
VA | 0x00001369 | invalid | 1 | |
VA | 0x00001e80 | invalid | 1 | |
VA | 0x00002556 | invalid | 2 | |
VA | 0x00003a1e | 0x00006a1e | valid | 3 |
验证结果:
2.2.2 修改物理地址空间为32k,虚拟地址空间为64k,计算结果。
我们发现,程序运行报错。
查看程序的限制:
if psize <= 1:
print 'Error: must specify a non-zero physical memory size.'
exit(1)
if asize < 1:
print 'Error: must specify a non-zero address-space size.'
exit(1)
if psize <= asize:
print 'Error: physical memory size must be GREATER than address space size (for this simulation)'
exit(1)
if psize >= convert('1g') or asize >= convert('1g'):
print 'Error: must use smaller sizes (less than 1 GB) for this simulation.'
exit(1)
vabits = int(math.log(float(asize))/math.log(2.0))
mustbepowerof2(vabits, asize, 'address space must be a power of 2')
pagebits = int(math.log(float(pagesize))/math.log(2.0))
mustbepowerof2(pagebits, pagesize, 'page size must be a power of 2')
我们发现它的限制为:物理地址和虚拟地址的大小必须大于1,小于1G,并且为2的k次方。并且物理地址的大小必须大于虚拟地址。
2.2.3 使用其它参数
-s 1 -a 64k -p 32k -P 8k -n 5
修改 虚拟地址大小为32k(15bit),物理地址大小为64k(16bit),Page大小为8k(13bit)。测试的虚拟地址数量为5。
计算结果:(过程省略,与上面的计算过程相同)
VA | 虚拟地址 | 物理地址 | 结果 | VPN |
---|---|---|---|---|
VA | 0x00003988 | 0x0000d988 | valid | 1 |
VA | 0x00005367 | invalid | 2 | |
VA | 0x000064f4 | invalid | 3 | |
VA | 0x00000c03 | invalid | 0 | |
VA | 0x000003a0 | 0x0000d988 | valid | 1 |
验证:(-v是详细模式)
2.2.4 使用-u参数
-u参数可以改变Page Table中有效的物理页个数。默认的是50%。修改为100%
我们发现Page Table中所有的Page 都是有效的。这样最后所有的虚拟地址都能转换为物理地址。