80386CPU 页式存储管理机制

关于80386段式管理,也是Linux内核采用的段式管理部分已在硬件平台分析给出了详细分析(段式存储管理)。 接着我们详细分析建立在段机制上的 80386CPU 页式内存管理机制。分析页机制之前我们先了解为什么我们需要页机制。在之前我们的段式存储管理,解决了安全问题,但是还有很多不能解决问题,这些问题会影响存储,以及指令执行的效率。具体说,80386的段式内存管理机制,是将指令中结合段寄存器使用的32位逻辑地址(转换)成同样式32位的物理地址。但是段式存储管理机制的灵活性和效率都比较差。例如“段”式可变长度的,这给内存和硬盘交换带来了麻烦。而页机制就很好的解决了这些麻烦,页机制中,逻辑地址连续性并不会和实际物理地址连续对应,其次一页的大小固定为4K,细化内存管理的粒度,方便内存的换入换出。在只有段机制下,逻辑地址(虚拟地址)经过段部件产生的线性地址被直接当做物理地址,而有了页机制后,经过段部件的线性地址还要经过页部件的映射为实际的物理地址如同所示:

如上图,如果我们开启页机制,那么原先选择子和偏移经过段部件形成的32位线性地址不再是物理地址,而是成为页部件的输入。因此段部件输出的32位的线性地址会有新的解释。如下同所示:

数据结构代码表示:

typedef struct{unsigned int dir:10;    //用作页面表目录的下标,该目录项指向一个页表unsigned int page:10;    //用作具体页面表中的下标,该表项指向一个物理页面unsigned int offset:12;    //在4K字节物理页面内的偏移量
}//32位线性地址(段部件的输出,页部件的输入):后面为字段所占位数

其中页目录dir有1024个项,每个项占4字节,因此共4K字节,刚好一个页大小,每个项指向一个页面表。一个页面表含1024个物理页面基址,每项占4字节,因此共4K字节,也刚好一个页大小。页内偏移offset用与一个物理页内的寻址。

类似GDTR和LDTR,又增加了一个新的寄存器CR3寄存器作为指向当前页目录的指针存放的寄存器。具体

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

①从CR3取得页目录的基地址。

②以线性地址中的dir位段为下标,在目录中取得相应页面的基地址。

③以线性地址中的page位段为下标,在所得的页面表中取得相应的页面描述项。

④将页面描述项中给出的页面基地址与线性地址中的offset位相加得到物理地址。

具体图示如下:

我们可以看到,目录项和页表项都是对应一个4K页面,即地址为4K整数倍,因此4字节,32位地址的后12位是空出来的,而实际被用来当作一些属性位。

例如目录项的结构为:

数据结构代码表示:

typedef struct{unsigned int ptba:20;    //页表基址的高20位unsigned int avail:3;    //供系统程序员使用unsigned int g:1;        //global 全局性页面unsigned int ps:1;        //页面大小,0表示4K字节unsigned int reserved:1;    //保留,永远是0unsigned int a:1;        //accessed,已被访问过unsigned int pcd:1;        //关闭(不使用)缓冲存储器unsigned int pwt:1;        //write Through,用于缓冲寄存器unsigned int u_s:1;        //为0表示系统(或超级)权限,为1表示用户权限unsigned int r_w:1;        //只读或可写unsigned int p:1;        //为0时表示相应的页面不存在
}//页目录项

以上为80386的页式存储管理,我们是以二级页表为例子做的分析。而Linux对与页式管理的机制与其类似,只是在具体的实现上不同。

转载于:https://www.cnblogs.com/HonkerYblogs/p/10385662.html

Linux内核分析(二) 段页式分析相关推荐

  1. OS- -请求分页系统、请求分段系统和请求段页式系统(二)

    OS- -请求分页系统.请求分段系统和请求段页式系统(二) 文章目录 OS- -请求分页系统.请求分段系统和请求段页式系统(二) 一.基本分段存储管理方式 1.分段系统的组成: 2.段表 3.查找过程 ...

  2. 【学习笔记】第三章——内存 III(分段存储、段页式存储、分段和分页对比)

    文章目录 一. 分段存储 1) 概念 2)段表 二. 分段 VS 分页 1)对比 2)优缺点分析 三. 段页式存储 1)定义 2)逻辑地址结构 一. 分段存储 1) 概念 离散,每段从0开始编址,每个 ...

  3. Linux内核之旅/张凯捷——系统调用分析(2)

    在<系统调用分析(1)>Linux内核之旅/张凯捷--系统调用分析(1)中,首先介绍了系统调用的概念,并对早期通过软中断(int 80)来进行系统调用的相关过程进行了分析,最后分析和介绍了 ...

  4. Linux 操作系统原理 — 内存 — 页式管理、段式管理与段页式管理

    目录 文章目录 目录 前文列表 页式管理 快表 多级页表 基于页表的虚实地址转换原理 应用 TLB 快表提升虚实地址转换速度 页式虚拟存储器工作的全过程 缺页中断 为什么 Linux 默认页大小是 4 ...

  5. linux 内核连接跟踪,Linux内核连接跟踪锁的优化分析(1)

    Linux内核连接跟踪锁的优化分析(1) 作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 微博:weibo.com/glinuxer ...

  6. 详细剖析linux的内存管理方式(分段式、分页式、段页式),以及进程状态的具体关系

    进程状态之间的关系: 1.分段式内存管理: 分段:进程地址空间按照逻辑关系将自身划分为若干个段,每个段都有自己的段名,从0开始编址. 内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各 ...

  7. 笔记:深入理解Linux内核(二)

    笔记:深入理解Linux内核(二) 二零二一年十月二十四日 文章目录 笔记:深入理解Linux内核(二) 第二章:内存寻址 内存地址 硬件中的分段 段选择符和段选择器 段描述符 快速访问段描述符 分段 ...

  8. 三十四、段页式管理方式

    一.知识总览 二.分页.分段的优缺点分析 分页管理: 优点:内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片. 缺点:不方便按照逻辑模块实现信息的共享和保护 分段管理: 优点:很方便按照逻辑模 ...

  9. 12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理

    文章目录 1 基本分页存储管理 1.1 什么是分页存储 1.2 重要的数据结构--页表 1.3 基本地址变换机构 1.4 具有快表的地址变换机构 1.4.1 什么是快表(TLB) 1.4.2 引入快表 ...

最新文章

  1. 【机器学习基础】相当全面的时间序列基础教程总结
  2. Maven的scope详解
  3. 前端学习(2465):ajax发送请求
  4. java io之图片存取
  5. Redis之简单动态字符串sds
  6. 树莓派智能小车python_人工智能-树莓派小车(1)——DuerOS语音唤醒
  7. 又一篇Centos7下的asp.net core部署教程
  8. Guava: Joiner
  9. Nanopore sequencing and assembly of a human genome with ultra-long reads
  10. kotlinx.serialization处理Json解析
  11. 广联达报错access_广联达软件报错问题汇总和解决方案.doc
  12. 汇编实现吃豆子小程序
  13. SQL Server“对象名无效”报错的解决方法
  14. 项目开发过程中遇到的问题和解决方法
  15. 锁升级过程(偏向锁/轻量级锁/重量级锁)
  16. HTML学习笔记_常用标签的使用及注意事项
  17. QT Desinger设计程序主界面 PyUIC生成.py
  18. 在Windows上使用Cygwin源码安装tig
  19. A Survey for Image Quality Assessment(综述)
  20. 用js javascript 创建网页快捷方式

热门文章

  1. linux whois工具,CentOS如何安装whois命令
  2. 用lisp编写串口助手源代码_实战用python来写个串口助手--界面篇
  3. 3D溜溜网站用的是php吗_浩辰3D软件中全面的阵列特征你会用吗?快来看看吧
  4. Laravel 5.5 的错误异常处理机制以及应用实例
  5. Java详解:作为一个码农终于把MySQL日记看懂了
  6. 【408预推免复习】计算机组成原理之控制单元的功能和控制单元的设计
  7. 【操作系统】考研の页面置换算法例子(看不懂你来打我~!)
  8. 【Deep Learning笔记】用Inception-V3模型进行图像分类
  9. matlab读取h5文件
  10. easyexcel写入数据为空_如何解决Redis缓存和MySQL数据一致性的问题?