博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存分页
阅读量:5902 次
发布时间:2019-06-19

本文共 2127 字,大约阅读时间需要 7 分钟。

  hot3.png

本文为本人总结他人博客得来

分段

分段本是由于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)分段物理空间不连续,但段内是连续的;分页物理空间不连续。


         因为4GB的虚拟内存空间对应着1048576个4KB页, 可以随机的抽取这些页, 将它们组织在1024个页表内, 每个页表可以容纳1024个页. 页表内的每个项目叫做页表项, 占4字节, 存放的是页的物理地址, 故每个页表的大小是4KB, 正好是一个标准页的长度. 注意, 页在页表内的分布是随机的, 哪个页位于哪个页表中, 这是没有规律的.

03140637_RLS3.jpg

            每个任务都有自己的页目录和页表. 如下图所示, 在处理器中有个控制寄存器CR3, 存放着当前任务页目录的物理地址, 故又叫做页目录基址寄存器(Page Directory Base Register: PDBR). 每个任务都有自己的TSS, 其中就包括了CR3寄存器域, 存放了任务自己的页目录物理地址. 当任务切换时, 处理器切换到新任务开始执行, 而CR3寄存器的内容也被更新, 以指向新任务的页目录位置. 相应的, 页目录又指向一个个的页表, 这就使得每个任务都只在自己的地址空间内运行. 从下图可以看出, 页目录和页表也是普通的页, 混迹于全部的物理页中. 它们和普通页的不同支持仅仅在于功能不一样. 当任务撤销之后, 它们和任务所占用的普通页一样会被回收, 并分配给其他任务.

03140637_XRKt.jpg

转载于:https://my.oschina.net/manmao/blog/669088

你可能感兴趣的文章
扩展 DbUtility (1)
查看>>
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
查看>>
Apple Developer Registration and DUNS Number Not Accepted
查看>>
Hadoop学习笔记系列文章导航
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
PHP如何学习?
查看>>
谈教育与成长
查看>>
jni c++
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
discuz X3登录流程分析
查看>>
上传图片预览
查看>>