操作系统内存管理(分页与分段)

转自: https://blog.csdn.net/wangsifu2009/article/details/6755929

分段

分段本是由于8086是16位总线,为寻址20位内存地址而增加的。在32位操作系统中,分段依然有用。

1)段描述符:描述该段的安全属性,为一个64位长的值。在实地址模式中,只需要使用段寄存器(CS,DS,SS和ES)就可以了,每个段寄存器都是16位的,对应于地址总线中的高16位。每条“访问”指令中的“内部地址”都是16位的,但是在送上地址总线之前都在CPU内部自动地与某个段寄存器中的内容相加,形成一个20位的实际地址。这样,就实现了从16位内部地址到20位实际地址的转换。这个方法与“段式内存管理”(现代意义的操作系统使用)相似,但并不完全一样,主要是没有地址空间的保护机制(后来出现的保护模式)。在保护模式中,在内存中存放“地址端描述结构”,即段描述符(8个字节),在段描述符中有关于段的基地址与段的长度的说明,也有一些访问权限的控制。通过段寄存器可以找到对应的段描述符。

2) 段描述符表:表中存放段描述符。段描述符表可以看作一个数组,存放的是各个段描述符。

3)段寄存器:存放段描述符表的索引值,用于段选择子。段寄存器中存放的是段描述符表(数组)的索引,通过段寄存器中的值,找到段描述表中存放的段描述符。

4) GDTR(全局性的段描述表寄存器,80386才有): 该寄存器指向全局描述符表(gdt),gdt中保存操作系统使用的代码段,堆栈段等段描述符,及各个任务的ldt,gdt的内容不随任务的切换而切换。48位。

5) LDTR(局部性的段描述表寄存器,80386才有): 该寄存器指向局部描述符表(ldt),ldt中保存当前任务所使用的代码段,数据段,堆栈段等的段描述符。ldt随任务的切换而切换。16位。

6) 所有寄存器中只有cr3(保存当前也目录表地址,目录表存放在内存中,实现线性地址到物理地址的转换)中地址为物理地址,其他都为线性地址。

 

分页

1) 如果没有分页机制,则由分段寻址方式计算出的地址即为物理地址。

2) 分页机制为程序提供了4G的连续地址空间。

3) 每个页占据4k,则4G的地址空间需要4G/4K = 1M个页。每个页需要4个字节来描述其物理基地址。这样则需要4M的地址空间存放页信息。

4) 操作系统将每1024个页分成一组,组成一个页表,页表项中保存该页的物理基地址。则最多有1024个页表。

5) 目录表中有1024个项,每个项占用4个字节,项的内容为页表的地址。

 

线性地址到物理地址的映射过程:

1)从CR3寄存器取得页面目录的基地址

2)以线性地址中的dir位段(前10位)为下标,在目录中取得相应页面表的基地址

3)以线性地址中的page位段(中间10位)为下标,在所得到的页面表中取得相应的页面描述项

4)将页面描述项中给出的页面基地址与线性地址中的offset位段(后12位)相加得到物理地址

 

在页面映射过程中,CPU要访问内存三次。第一次是页面目录,第二次是页面表,第三次才是真正的目标。为了缩短查找时间,可以使用高速缓存(cache),有了高速缓存,虽然在第一次用到具体的页面目录和页面表时要到内存中区读取,但一旦装入了高速缓存以后,一般可以在高速缓存中找到,而不需要再到内存中去读取了。另一方面,这整个过程是由硬件实现的,所以速度很快。

 

分页和分段的区别:

1)页是信息的物理单位;段是信息的逻辑单位。

2)页的大小固定且由系统确定;段的长度不固定(取决于用户所编写的程序,通常由编译程序在对源程序编译时,根据信息的性质来划分)。

3)分页的作业地址空间是一维的,只需一个记忆符,就可表示一个地址;分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

4)分段物理空间不连续,但段内是连续的;分页物理空间不连续。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值