前言
内容仅作记录,请谨慎参考
一、15.1
题目描述:
分析与解答:
通过计算机底层的地址转换机制我们可以知道,CPU会先将虚拟地址VA与限制寄存器(limit)中的值进行比较,当虚拟地址VA的值小于该值时,将虚拟地址VA加上基址寄存器中的值所得到的结果作为对应的物理地址PA;当虚拟地址VA的值不小于限制寄存器(limit)中的值时则会导致内存访问出现问题,即不能成功进行地址转换。
使用程序relocation.py模拟虚拟地址的转换情况:
(1) 输入命令./relocation.py -s 1 -c 用种子1进行运行:
可以看到Base的值为13884,limit的值为290
对于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,故无法成功转换;
(2) 输入命令./relocation.py -s 2 -c 用种子2进行运行:
可以看到Base的值为15529,limit的值为500
对于VA 0其地址值为57,小于limit的值500,将其加上Base的值15529为15586即为对应的物理内存中的地址;
对于VA 1其地址值为86,小于limit的值500,将其加上Base的值15529为15615即为对应的物理内存中的地址;
对于VA 2其地址值为855,大于limit的值500,故无法成功转换;
对于VA 3其地址值为753,大于limit的值500,故无法成功转换;
对于VA 4其地址值为685,大于limit的值500,故无法成功转换;
(3) 输入命令./relocation.py -s 3 -c 用种子3进行运行
可以看到Base的值为8916,limit的值为316
对于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即为对应的物理内存中的地址。
二、15.3
题目描述:
分析与解答:
查阅原书,并在网上搜索可知,本题翻译有误,应该为可以设置的基址的最大值是多少
按照题目中的命令,-s 1 -n 10 -l 100 可知,我们设置的限制寄存器limit的值为100
根据README中的规则可知,模拟程序的内存大小为16K,那么按照地址转换的规则,基址寄存器的最大值应该为:16*1024-100=16284
使用命令./relocation.py -s 1 -n 10 -l 100 -b 16285尝试是否可以分配成功
可以看到这样的话会导致错误,并提示我们Base+Limit的值为16385
再次使用命令./relocation.py -s 1 -n 10 -l 100 -b 16284尝试是否可以分配成功
可以看到这次程序成功运行,因此,可以得到基址寄存器的最大值是16284。