前言
内容仅作记录,请谨慎参考
16.1
题目描述
分析及解答
(1) 输入命令./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 0
得到如下模拟程序:
从模拟结果中我们可以看到,虚拟地址空间大小为128,物理地址空间大小为512
同时物理空间被分成了两个段,其中第一个段segmentation 0的基址为0,大小为20,正向增长;第二个段segmentation 1的基址为512,大小为20,反向增长。
由于有两个段,分析后将虚拟地址转化的二进制的最高两位作为段的判断,00表示在segmentation 0而01表示在segmentation 1
对于VA 0(108):将其转化为二进制为:01101100,段(01),偏移量(101100即-20)
故其对应segmentation 1这个段,物理地址为512+(-20)=492;
对于VA 1(97):将其转化为二进制为:01100001,段(01),偏移量(100001即-31)
由于段的大小为20,故超出了限制,段错误;
对于VA 2(53):将其转化为二进制为:00110101,段(00),偏移量(110101即-11)
segmentation 0为正向增长的段,偏移量不能为负,段错误;
对于VA 3(33):将其转化为二进制为:00100001,段(00),偏移量(100001即-31)
segmentation 0为正向增长的段,偏移量不能为负,段错误;
对于VA 4(65):将其转化为二进制为:01000001,段(01),偏移量(000001即1)
segmentation 1为反向增长的段,偏移量不能为正,段错误;
输入命令./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 0 -c查看模拟结果:
可以看到与上述分析是一致的
(2) 输入命令./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 1
得到如下模拟程序:
对于VA 0(17):将其转化为二进制为:00010001,段(00),偏移量(010001即17)
故其对应segmentation 0这个段,物理地址为:0+17=17;
对于VA 1(108):将其转化为二进制为:01101100,段(01),偏移量(101100即-20)
故其对应segmentation 1这个段,物理地址为512+(-20)=492;
对于VA 2(97):将其转化为二进制为:01100001,段(01),偏移量(100001即-31)
由于段的大小为20,故超出了限制,段错误;
对于VA 3(32):将其转化为二进制为:00100000,段(00),偏移量(100001即-32)
segmentation 0为正向增长的段,偏移量不能为负,段错误;
对于VA 4(63):将其转化为二进制为:00111111,段(00),偏移量(111111即-1)
segmentation 0为正向增长的段,偏移量不能为负,段错误;
输入命令./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 1 -c查看模拟结果:
可以看到与上述分析是一致的
(3) 输入命令./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 2
得到如下模拟程序:
对于VA 0(122):将其转化为二进制为:01111010,段(01),偏移量(111010即-6)
故其对应segmentation 1这个段,物理地址为:512+(-6)=506;
对于VA 1(121):将其转化为二进制为:01111001,段(01),偏移量(111001即-7)
故其对应segmentation 1这个段,物理地址为:512+(-7)=505;
对于VA 2(7):将其转化为二进制为:00000111,段(00),偏移量(000111即7)
故其对应segmentation 0这个段,物理地址为:0+7=7;
对于VA 3(10):将其转化为二进制为:00001010,段(00),偏移量(001010即10)
故其对应segmengtation 0这个段,物理地址为:0+10=10;
对于VA 4(106):将其转化为二进制为:01101010,段(01),偏移量(101010即-22)
由于段的大小为20,故超出了限制,段错误;
输入命令./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 2 -c查看模拟结果:
可以看到与上述分析是一致的。
16.2
题目描述
分析及解答
由于段0(正向增长)的基址为0,size为20:
故段0的最高合法虚拟地址为19;
由于段1(反向增长)的基址为512,size为20:
故段1的最低合法虚拟地址为108;
整个地址空间中最低和最高的非法地址是0和127
使用-A设定特殊的虚拟地址:19,20,107,108,0,127,128测试结果的正确性:
16.3
题目描述
分析及解答
查看英文原书可知,此处符号翻译有误:为指定的地址流生成以下转换结果:有效,有效,违规…违规,有效,有效
即,虚拟地址0,1和14,15可以转换成功,那么只需确保两个段的size为2,同时二者的基址相差至少为4即可:
例如可以这样设置:
./segmentation.py -a 16 -p 128 -A 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
–b0 0 --l0 2
–b1 4 --l1 2 -c
当然,符合题意得组合还有很多,在此不一一列出了。