OSTEP Chapter 16 回顾
这里回顾第16章,本章介绍了分段。
书籍介绍:
学习资料:
- https://pages.cs.wisc.edu/~remzi/OSTEP/
- https://github.com/remzi-arpacidusseau/ostep-translations/tree/master/chinese
- https://github.com/joshuap233/Operating-Systems-Three-Easy-Pieces-NOTES
参考资料:
第16 章 分段
内容回顾
分段:
- 在MMU中引入不止一个基址和界限寄存器,给地址空间内的每个逻辑段(segment)一对
端:
- 地址空间里一个连续定长的区域
- 典型的地址空间里有3个逻辑不同的段:代码,栈,堆
段错误(segmentation fault):
- 在支持分段的机器上发生了非法的内存访问
判断引用了哪个段
显式方法
把虚拟地址的前几位来表示段,后几位来表示偏移量
// get top 2 bits of 14-bit VA Segment = (VirtualAddress & SEG_MASK) >> SEG_SHIFT // now get offset Offset = VirtualAddress & OFFSET_MASK if (Offset >= Bounds[Segment]) RaiseException(PROTECTION_FAULT) else PhysAddr = Base[Segment] + Offset Register = AccessMemory(PhysAddr)
隐式
- 通过地址产生的方式来确定段
共享
- 地址空间之间共享(share)某些内存段
粗粒度和细粒度的分段
操作系统对分段的支持
- 上下文切时需要保存和恢复各个段寄存器中的内容
- 管理物理内存的空闲空间
- 会产生外部碎片的问题
作业
1
最大地址对应最大地址即可。
问题1:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 0
ARG seed 0
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x0000006c (decimal: 108) --> PA or segmentation violation?
VA 1: 0x00000061 (decimal: 97) --> PA or segmentation violation?
VA 2: 0x00000035 (decimal: 53) --> PA or segmentation violation?
VA 3: 0x00000021 (decimal: 33) --> PA or segmentation violation?
VA 4: 0x00000041 (decimal: 65) --> PA or segmentation violation?
For each virtual address, either write down the physical address it translates to
OR write down that it is an out-of-bounds address (a segmentation violation). For
this problem, you should assume a simple address space with two segments: the top
bit of the virtual address can thus be used to check whether the virtual address
is in segment 0 (topbit=0) or segment 1 (topbit=1). Note that the base/limit pairs
given to you grow in different directions, depending on the segment, i.e., segment 0
grows in the positive direction, whereas segment 1 in the negative.
计算:
VA 0: 0x0000006c (decimal: 108) --> seg 1, offset 20, 512 - 20 = 492
VA 1: 0x00000061 (decimal: 97) --> seg 1, offset 33, segmentation violation
VA 2: 0x00000035 (decimal: 53) --> seg 0, offset 53, segmentation violation
VA 3: 0x00000021 (decimal: 33) --> seg 0, offset 33, segmentation violation
VA 4: 0x00000041 (decimal: 65) --> seg 1, offset 63, segmentation violation
答案:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 0 -c
ARG seed 0
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x0000006c (decimal: 108) --> VALID in SEG1: 0x000001ec (decimal: 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)
问题2:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 1
ARG seed 1
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x00000011 (decimal: 17) --> PA or segmentation violation?
VA 1: 0x0000006c (decimal: 108) --> PA or segmentation violation?
VA 2: 0x00000061 (decimal: 97) --> PA or segmentation violation?
VA 3: 0x00000020 (decimal: 32) --> PA or segmentation violation?
VA 4: 0x0000003f (decimal: 63) --> PA or segmentation violation?
For each virtual address, either write down the physical address it translates to
OR write down that it is an out-of-bounds address (a segmentation violation). For
this problem, you should assume a simple address space with two segments: the top
bit of the virtual address can thus be used to check whether the virtual address
is in segment 0 (topbit=0) or segment 1 (topbit=1). Note that the base/limit pairs
given to you grow in different directions, depending on the segment, i.e., segment 0
grows in the positive direction, whereas segment 1 in the negative.
计算:
VA 0: 0x00000011 (decimal: 17) --> seg 0, offset 17, 17
VA 1: 0x0000006c (decimal: 108) --> seg 1, offset 20, 492
VA 2: 0x00000061 (decimal: 97) --> seg 1, offset 31, segmentation violation
VA 3: 0x00000020 (decimal: 32) --> seg 0, segmentation violation
VA 4: 0x0000003f (decimal: 63) --> seg 0, segmentation violation
答案:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 1 -c
ARG seed 1
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x00000011 (decimal: 17) --> VALID in SEG0: 0x00000011 (decimal: 17)
VA 1: 0x0000006c (decimal: 108) --> VALID in SEG1: 0x000001ec (decimal: 492)
VA 2: 0x00000061 (decimal: 97) --> SEGMENTATION VIOLATION (SEG1)
VA 3: 0x00000020 (decimal: 32) --> SEGMENTATION VIOLATION (SEG0)
VA 4: 0x0000003f (decimal: 63) --> SEGMENTATION VIOLATION (SEG0)
问题3:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 2
ARG seed 2
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x0000007a (decimal: 122) --> PA or segmentation violation?
VA 1: 0x00000079 (decimal: 121) --> PA or segmentation violation?
VA 2: 0x00000007 (decimal: 7) --> PA or segmentation violation?
VA 3: 0x0000000a (decimal: 10) --> PA or segmentation violation?
VA 4: 0x0000006a (decimal: 106) --> PA or segmentation violation?
For each virtual address, either write down the physical address it translates to
OR write down that it is an out-of-bounds address (a segmentation violation). For
this problem, you should assume a simple address space with two segments: the top
bit of the virtual address can thus be used to check whether the virtual address
is in segment 0 (topbit=0) or segment 1 (topbit=1). Note that the base/limit pairs
given to you grow in different directions, depending on the segment, i.e., segment 0
grows in the positive direction, whereas segment 1 in the negative.
计算:
VA 0: 0x0000007a (decimal: 122) --> seg 1, offset 6, 506
VA 1: 0x00000079 (decimal: 121) --> seg 1, offset 7, 505
VA 2: 0x00000007 (decimal: 7) --> seg 0, offset 7, 7
VA 3: 0x0000000a (decimal: 10) --> seg 0, offset 10, 10
VA 4: 0x0000006a (decimal: 106) --> seg 1, segmentation violation
答案:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -s 2 -c
ARG seed 2
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x0000007a (decimal: 122) --> VALID in SEG1: 0x000001fa (decimal: 506)
VA 1: 0x00000079 (decimal: 121) --> VALID in SEG1: 0x000001f9 (decimal: 505)
VA 2: 0x00000007 (decimal: 7) --> VALID in SEG0: 0x00000007 (decimal: 7)
VA 3: 0x0000000a (decimal: 10) --> VALID in SEG0: 0x0000000a (decimal: 10)
VA 4: 0x0000006a (decimal: 106) --> SEGMENTATION VIOLATION (SEG1)
2
- 段0最高19, 段1最低108
- 最低非法地址20,最高非法地址107
测试1:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -A 19 -c
ARG seed 0
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x00000013 (decimal: 19) --> VALID in SEG0: 0x00000013 (decimal: 19)
测试2:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -A 20 -c
ARG seed 0
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x00000014 (decimal: 20) --> SEGMENTATION VIOLATION (SEG0)
测试3:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -A 108 -c
ARG seed 0
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x0000006c (decimal: 108) --> VALID in SEG1: 0x000001ec (decimal: 492)
测试4:
λ python ./segmentation.py -a 128 -p 512 -b 0 -l 20 -B 512 -L 20 -A 107 -c
ARG seed 0
ARG address space size 128
ARG phys mem size 512
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 20
Segment 1 base (grows negative) : 0x00000200 (decimal 512)
Segment 1 limit : 20
Virtual Address Trace
VA 0: 0x0000006b (decimal: 107) --> SEGMENTATION VIOLATION (SEG1)
3
翻译有问题,原文是:
valid, valid, violation, ..., violation, valid, valid
参考资料:
除了0, 1, 14, 15,都是valid:
b0 0
l0 2
b1 16
l1 2
验证:
λ 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
ARG seed 0
ARG address space size 16
ARG phys mem size 128
Segment register information:
Segment 0 base (grows positive) : 0x00000000 (decimal 0)
Segment 0 limit : 2
Segment 1 base (grows negative) : 0x00000010 (decimal 16)
Segment 1 limit : 2
Virtual Address Trace
VA 0: 0x00000000 (decimal: 0) --> VALID in SEG0: 0x00000000 (decimal: 0)
VA 1: 0x00000001 (decimal: 1) --> VALID in SEG0: 0x00000001 (decimal: 1)
VA 2: 0x00000002 (decimal: 2) --> SEGMENTATION VIOLATION (SEG0)
VA 3: 0x00000003 (decimal: 3) --> SEGMENTATION VIOLATION (SEG0)
VA 4: 0x00000004 (decimal: 4) --> SEGMENTATION VIOLATION (SEG0)
VA 5: 0x00000005 (decimal: 5) --> SEGMENTATION VIOLATION (SEG0)
VA 6: 0x00000006 (decimal: 6) --> SEGMENTATION VIOLATION (SEG0)
VA 7: 0x00000007 (decimal: 7) --> SEGMENTATION VIOLATION (SEG0)
VA 8: 0x00000008 (decimal: 8) --> SEGMENTATION VIOLATION (SEG1)
VA 9: 0x00000009 (decimal: 9) --> SEGMENTATION VIOLATION (SEG1)
VA 10: 0x0000000a (decimal: 10) --> SEGMENTATION VIOLATION (SEG1)
VA 11: 0x0000000b (decimal: 11) --> SEGMENTATION VIOLATION (SEG1)
VA 12: 0x0000000c (decimal: 12) --> SEGMENTATION VIOLATION (SEG1)
VA 13: 0x0000000d (decimal: 13) --> SEGMENTATION VIOLATION (SEG1)
VA 14: 0x0000000e (decimal: 14) --> VALID in SEG1: 0x0000000e (decimal: 14)
VA 15: 0x0000000f (decimal: 15) --> VALID in SEG1: 0x0000000f (decimal: 15)
4
python ./segmentation.py -a 100 -p 200 --b0 0 --l0 45 --b1 100 --l1 45
5
python ./segmentation.py -a 100 -p 200 --b0 0 --l0 0 --b1 100 --l1 0
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere