1.分段
分段就是把程序代码划分到若干个独立的地址空间内,每一个地址空间称为一个段,段内独立编址。例如,2.4版的Linux内核在Intel 80×86微处理器上被分为内核代码段、内核数据段、用户态下所有进程共享的用户代码段、用户态下所有进程共享的用户数据段、任务状态段、1个所有进程共享的缺省局部描述符表(Local Descriptor Table,LDT)段、4个与高级电源管理支持相关的段。程序代码和数据的运行权限不同,程序代码可以被执行,而数据只能被读和写,因此,程序代码和数据一般分成两个段存放。通常,用户程序编译时,编译程序会自动将代码归类到若干个段中,如GCC编译器编译C语言程序时会自动创建代码段、初始化数据段、未初始化数据段和栈段,代码段存放程序指令,初始化数据段存放全局初始化数据,未初始化数据段存放全局未初始化数据,栈段用于存放函数调用断点、局部变量。分段管理就是将一个程序按照逻辑单元分成多个程序段,每一个段使用自己单独的地址空间。这样,一个段占用一个地址空间,就不会发生单地址空间动态内存增长引起的地址冲突问题。
2.程序地址结构
程序采用分段结构后,整个程序由若干个段组成,每个段都有段名,程序内部用段号表示。段内指令和数据都从0开始编址,允许存放指令和数据的数量称为段长。因此,采用分段管理的程序逻辑地址是二维的,由段号和段内偏移组成,如图6-12所示。在该地址结构中,一个程序最多允许有64K个段,每个段最大段长为64KB。
图6-12 分段逻辑地址结构(www.xing528.com)
3.段表
分段存储管理方式中,系统需要为每个段分配一个连续的内存空间,程序的所有段离散地进入内存中的不同分区。分段存储管理方式中,内存分配可以采用可变分区分配管理方式。为了实现逻辑地址到物理地址的转换,同分页存储管理方式一样,需要在系统中为每个运行的程序建立一个段表。段表记录了段与分区的映射关系,每个段表项记录了段号、段长、段在内存中的起始地址(又称为基址)等信息,如图6-13所示。段表位于内存中,但是为了提高地址转换速度,段表项可以存放在一组寄存器中,例如Intel的80×86处理器提供一种附加的非编程寄存器(不能被程序员所设置的寄存器),自动加载段寄存器中值所指定的段描述符。
图6-13 段表
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。