1.作业包:segmentation.py
2.作业说明:
通过程序 s e g m e n t a t i o n . p y segmentation.py segmentation.py,我们能够观察到段式存储管理的地址转换。
命令行参数解释如下:
- − h -h −h: 查看帮助信息以及退出
- − s -s −s: 随即因子
- − A -A −A:逗号分隔的逻辑地址
- − a -a −a: 逻辑地址空间大小
- − p -p −p: 物理地址空间大小
- − n -n −n: 逻辑地址个数
- − b -b −b: 段0基地址寄存器的值
- − l -l −l: 段0界地址寄存器的值
- − B -B −B: 段1基地址寄存器的值
- − L -L −L: 段1界地址寄存器的值
- − c -c −c:计算地址转换结果
逻辑地址空间布局为2个段地址空间,段0向高地址增长,段1向低地址增长,逻辑地址最高为表示所在的段。
3.作业要求:
(1) 分别用随机因子 0,1,2 生成逻辑地址并转换为物理地址。
答:下面以随机因子 1 为例:
python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 0 -c
逻辑地址空间大小
a
s
i
z
e
asize
asize 为
128
(
2
7
)
128(2^7)
128(27),逻辑地址长度为
7
7
7 位。当逻辑地址
d
e
c
i
m
a
l
decimal
decimal 作为带符号时,最高位
0
/
1
0/1
0/1 用于表示所处的段;而逻辑地址
d
e
c
i
m
a
l
decimal
decimal 作为无符号时,段
0
0
0 为
0
0
0~
64
64
64 ,段
1
1
1 为
65
65
65~
128
128
128。
- 根据逻辑地址 d e c i m a l decimal decimal 判断地址所处的段,段 0 0 0 为 0 0 0~ 64 64 64 ,段 1 1 1 为 65 65 65~ 128 128 128
- 根据所在的段计算进程的长度 l e n len len,如果 l e n > l i m i t len>limit len>limit 的值则越界 l e n = { d e c i m a l + 1 段0:decimal 从0开始 a s i z e − d e c i m a l 段1:decimal 从asize开始 len= \begin{cases} decimal+1& \text{段0:decimal 从0开始}\\ asize-decimal& \text{段1:decimal 从asize开始} \end{cases} len={decimal+1asize−decimal段0:decimal 从0开始段1:decimal 从asize开始
- 未越界,则段 0 0 0 的物理地址为 l e n len len,段 1 1 1 的物理地址为 p s i z e − l e n psize-len psize−len
逻辑地址
d
e
c
i
m
a
l
=
108
decimal=108
decimal=108 位于段
1
1
1,进程长度
l
e
n
=
128
−
108
=
20
len =128-108=20
len=128−108=20 未越界,物理地址
512
−
20
=
492
512-20=492
512−20=492
逻辑地址
d
e
c
i
m
a
l
=
108
decimal=108
decimal=108 位于段
1
1
1,进程长度
l
e
n
=
128
−
97
=
31
len =128-97=31
len=128−97=31 越界,其余同理
(2) 上题段0最高合法逻辑地、段1最低合法逻辑地址是多少?相应各自的最低非法逻辑地址和最高非法逻辑地址是多少?使用参数 -A
验证
答:段 0 0 0 的进程长度 l e n = d e c i m a l + 1 ≤ 20 len=decimal+1≤20 len=decimal+1≤20,故最高合法逻辑地址为 19 19 19,相应最低非法逻辑地址为 20 20 20;段 0 0 0 的进程长度 l e n = a s i z e − d e c i m a l ≤ 20 len=asize-decimal≤20 len=asize−decimal≤20,故最高合法逻辑地址为 108 108 108,相应最高非法逻辑地址为 107 107 107。验证结果如下:
结果完全一致,逻辑地址
19
19
19、
108
108
108可以访问, 逻辑地址
20
20
20、
107
107
107越界。
(3) 假设我们在一个 128 字节的物理内存中有一个很小的 16 字节地址空间。你会设置 什么样的基址和界限,以便让模拟器为指定的地址流生成以下转换结果:有效,有效,违规 ... 违反,有效,有效
?假设用以下参数:segmentation.py -a 16 -p 128 -A 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -b ? -l ? -B ? -L ?
?
答:逻辑地址 0 0 0、 1 1 1 和 14 14 14、 15 15 15 合法,其余逻辑地址非法,从而可知两个 l i m i t limit limit 都是 2 2 2,而段 0 0 0 的 b a s e base base 为 0 0 0,段 1 1 1 的 b a s e base base为 16 16 16
python3 ./segmentation.py -a 16 -p 128 -A 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -b 0 -l 2 -B 16 -L 2`