本节书摘来自异步社区《操作系统真象还原》一书中的第0章,第0.10节,作者:郑钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看
0.10 什么是段重叠
其实上面已经提到了段重叠,也许有的读者已经明白了,但还是在此特意解释一下吧。
依然假设在实模式下(并不是说在保护模式下就不存在段重叠,只是这样就会少解释了相关数据结构,如段描述符,不过这不重要,原理是一样的),一个段最大为64KB,其大小由段内偏移地址寻址范围决定,也就是2的16次方。其起始位置由段基地址决定。CPU的内存寻址方式是:给我一个段基址,再给我一个相对于该段起始位置的偏移地址,我就能访问到相应内存。它并不要求一个内存地址只隶属于某一个段,所以在上面的图0-2中,欲访问内存0xC03,段基址可以选择0xC00,0xC01,0xC02,0xC03,只不过是段内偏移量要根据段基地址来调整罢了。用这种“段基地址:段内偏移”的组合,0xC00:3和0xC02:1是等价的,它们都访问到同一个物理内存块。但段的大小决定于段内偏移地址寻址范围,假设段A的段基址是从0xC00开始,段B的段基址是从0xC02开始,在16位宽度的寻址范围内,这两个段都能访问到0xC05这块内存。用段A去访问,其偏移为5,用段B去访问,其偏移量为3。这样一来,用段B和段A在地址0xC02之后,一直到段B偏移地址为0xfffe的部分,像是重叠在一起了,这就是段重叠了,如图0-6所示。