接下来我们讨论段式存储管理
那在段式存储管理里头
我们会来说明
段的地址空间是如何来组织的
然后在段式存储管理当中
我的内存访问是如何进行的
那在段式存储管理当中
我们把进程的地址空间
看成由若干个段组成的
每一个段 在这里
是给出了一些实例
你比如说我的程序
有主程序有子模块
那各个子模块我可以看成是
相对独立的一个段
主代码呢我看成是一个段
然后我的公共库
可以看成是另外一个段
这几个呢都是代码
同时还有一些堆
初始化的数据 堆栈
符号表 这样一些数据段
好 那在这里头
我们把它看成是一个
组织成一个段地址空间的话
实际这时我们希望是能够达到
把进程的地址空间能够
以更精细 更灵活的方式
把它分离开
分离开之后呢
我可以实现更好的共享
好 有了上面关于段地址空间的描述
这时候呢我们就可以
把逻辑地址空间
转换成一个不连续的二维结构
那在这里头呢我们看到
我们把代码分成了几个部分
两个部分 数据 堆栈
堆 那这几个部分呢
各个部分内部呢
它是需要连续的
我会用它的偏移呢来进行访问
但各个部分之间 我们很少有跨越
从一个段访问另一个段的这种情况
以一个段的基址
去访问另一个段的这种情况
好 有了这个讨论之后
我们就可以把段地址空间的逻辑视图
转换成一个这样的结构
那到物理地址空间里头呢
它就可以是不连续的
那由于各个段之间我们是相对可以
把它很好地分离开 那这个里头呢
这种不连续呢
对我们的访问带来的影响
是相对来说比较小的
好 有了这种概念之后
那么这时候我们来看
我的访问过程是什么样的
首先有了这一段之后
我们可以把它理解为段呢实际上是
每个段是什么
每个段是访问方式和存储数据
存储的到底是什么数据
到底用什么样的方式在访问
这个相对一致的一段地址空间
好 这一段呢我要求它是连续的
好 有了这个之后
那我们说如果每一个段呢
对应到一块连续的内存块
然后若干个段组成了
进程的逻辑地址空间
有了这个之后
我们再来看段的访问是什么
我就会把逻辑地址
分成一个二元组
段号和段内偏移
那原来的地址
我们是一个连续的若干位
好 现在呢 在段式地址空间里呢
我们把它分成两段 段号和段内偏移
转化过来之后呢
我们看到的逻辑结构呢
变成是段号和段内偏移
这个时候分开之后
那我再访问的时候
我必须把它转换成原来的地址
好 有了这种地址的划分之后
那它的访问过程会变成什么样子呢
好 这是进程的地址空间
这是物理的地址空间
然后程序在CPU上执行
它要访问一个存储单元的时候
首先是它的逻辑地址
在段地址空间里头
我们把它分成两段
段号和段内偏移
这个首先用段号
我们去查进程的段表
那若干个段
所有的段在这里都有一项
每一项对应一个段描述符
这里基本内容是
段的起始地址和它的长度
那这里的内容呢
我们是可以用操作系统的软件
来对它进行控制的
也就是说我在这里头
每个段在什么位置呢
它的相关信息我是由
操作系统可以控制的
好 有了这里头
我可以得到段的长度之后
那硬件在里做什么呢
存储管理单元MMU
它就会把这个长度和你的偏移
取出来两个做比较
看看是不是越界
如果越界 那这时候
就会出异常
如果说
你的偏移是小于它的长度的
那这是一个合法的访问
然后在MMU里头呢再利用段基址和
你的偏移两个加到一起
就可以找到你实际要访问的内容了
有了这个访问之后
那我们基于段的这种机制
就可以工作起来了