《操作系统导论》第16章习题(Ubuntu12.04)
(越来越怀疑买了本假书,习题描述总是出问题,基本靠猜0.0)
输入-h查看指令参数详细内容
-
先让我们用一个小地址空间来转换一些地址。这里有一组简单的参数和几个不同的随机种子。转换这些地址
1.运行代码 python segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 0
方法:先根据虚拟地址最高位确定所在段,最高位为1位于segment1,为0位于segment0.
segment0(堆空间和代码空间地址)地址向高增长,计算方法和15章一样,只需要判断虚拟地址是否大于对应的段界限即可。segment1(栈空间)地址向低增长,需要先将虚拟地址减去物理地址大小(这里为128),然后将得到的值的绝对值和段界限比较大小,若大于界限则为非法地址。
答案:
virtual address | physical address | |
---|---|---|
VA 0 | 0x0000006c (decimal: 108) | VALID in SEG1: 0x000001ec (decimal: 492)(108 -128+512 = 492) |
VA 1 | 0x00000061 (decimal: 97) | SEGMENTATION VIOLATION (SEG1) |
VA 2 | 0x00000035 (decimal: 53) | SEGMENTATION VIOLATION (SEG0) |
VA 3 | 0x00000021 (decimal: 33) | SEGMENTATION VIOLATION (SEG0) |
VA 4 | 0x00000041 (decimal: 65) | SEGMENTATION VIOLATION (SEG1) |
(随机种子取1或2时和上面情况类似,这里不赘述)
-
段0中最高的合法虚拟地址是什么?段1中最低的合法地址是什么?在整个地址空间中,最低和最高的非法地址是什么?
答:19,108,20,107.详细推导见https://blog.csdn.net/qq_40232851/article/details/103057067,这是真真的大佬。
使用指令python segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 1 -A 19,108,20,107 -c
可以验证。
-
第三题答案:
python 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 16 --l1 2 -c
-
假设我们想要生成一个问题,其中大约90%的随机产生的虚拟地址是有效的(即不产生段异常)。如何配置模拟器完成这一点?哪些参数很重要?
答:假设随机地址的范围在给定的总物理空间内,则我们设定segment0 base为0,segment1 base为总物理空间最大地址,两个段的大小相同,两段地址空间加起来占总物理空间90%大小。参数-a,-p,-l,-L,-b,-B很重要。
-
你能运行模拟器,使所有虚拟地址无效吗?怎么做?
答:设定段限定大小均为0,即-l 0 -L 0。