比较连续分配、分页和分段三种存储分配机制的优缺点_第十九期-处理器存储模型概述(1)...
作者:罗宇哲,中国科学院软件研究所智能软件研究中心
上一期中我们介绍了ARMv8-A架构中的异常级别,从这一期开始的接下来四期我们将介绍ARMv8-A的存储模型。第一期我们将介绍存储模型中地址转换和访存控制的一般概念,第二期我们将介绍缓存相关的基本概念,最后两期我们将介绍ARMv8-A架构中的地址转换、访存控制和缓存机制。本期中我们介绍处理器中地址转换机制和访问控制的一般概念。
一、处理器的地址转换和访问控制
处理器运行程序时,需要从物理存储器中取得所需的指令和数据。对于处理器中的地址转换,输入数据为应用程序空间中的地址(指令地址或数据地址),输出为数据总线上的地址。前者称为逻辑地址,后者称为物理地址。处理器需要将逻辑地址转换为物理地址。
处理器所能访问的物理存储空间分配的方式主要有连续分配和离散分配两种方式。连续分配指运行在处理器上的进程将其使用的数据和指令保存在内存中的连续区域里面,这种方式不够灵活,可能会产生大量内存碎片,整合内存碎片的开销比较大。离散分配方式将进程使用的存储空间离散地分布在内存里,常用的分配方式有段式、页式和段页式。
段式分配方式通过分段机制将程序划分为不同的程序段,如代码段、数据段等。分段机制通过将段基址与偏移量相加得到对应的物理地址,偏移量不能超过段长,否则会产生越界中断。在分段机制中,访问控制由段描述符实现。段描述符保存了段基址、段长和访问段的最低特权等级等信息,只有当前访问段描述符的进程有足够的特权等级才能访问该段的段描述符。
页式分配方式通过分页机制将逻辑地址空间划分为固定大小的页,将物理地址空间划分为固定大小的页框,页框和页的大小是一样的。分页机制将逻辑地址空间中的页离散地映射为物理地址空间中的页框,从而完成从逻辑地址到物理地址的转换。页和段的区别在于页的大小是固定的,而段的大小是可变的。很多RISC[2]处理器处理器不支持分段机制,只支持分页机制,所以我们着重介绍分页机制。
在分页机制中,逻辑地址到物理地址的转换是通过页表来实现的。页表中保存了页号到页框号的转换关系。逻辑地址被分为页号和页偏移,页号指示逻辑地址空间中的不同的页,页偏移指示页内的逻辑地址。通过页号可以找到对应的页框号,页框号指示了物理存储空间中的页框,页框号和页偏移拼接则可以得到物理地址。页表可以有多级,一个典型的二级页表如下图所示[3]:
在上图中,外部页表(也叫页目录)用于索引页表在物理存储空间中的基地址,而外部页表的基地址则存储在外部页表寄存器中。用基地址和偏移相加的方式可以对外部页表和页表进行索引。通过用外部页号作为偏移索引可以得到页表基址。在页表中通过用外部页内地址作为偏移索引可以得到逻辑页对应的物理页框号。物理页框号(b)和页内地址(d)拼接在一起可以得到物理地址。
由于页表存储于主存中且需要被经常访问,若处理器每次访问主存都要先访问主存中的页表则访存的时间开销很大,因此处理器一般为页表设计了专门的页面高速缓存,其中保存了常用的页表项。当页面高速缓存命中时,可以实现逻辑地址到物理地址的直接转换,节省了访问内存页表的开销;当页面高速缓存不命中时,仍然需要访问内存页表。
分页机制也支持访问控制。外部页表项和页表项中可以包含访问控制位,这些访问控制位可以控制进程对外部页表项和页表项的读写权限。
段页式分配方式结合了段式分配方式和页式分配方式,即在地址转换时,首先将逻辑地址用分段机制转换为线性地址,再对线性地址用分页机制找到对应的物理地址,一个典型的段页式地址转换机制如下图所示[1]:
其中逻辑地址为机器指令使用的地址,用于指定操作数或指令的位置。逻辑地址一般由段选择符和偏移量共同决定。通过段选择符可以找到段描述符[2],段描述符中包含段基址、段长和访问权限信息等段的性质。其中段基址加上偏移量的算术和就形成了线性地址。线性地址再通过分页机制找到对应的物理地址。
二、结语
本期我们介绍了处理器中地址转换和访问控制的一般概念,下一期中我们分析一下处理器的缓存机制。
参考文献
[1] 《深入分析Linux内核源代码》陈莉军编著。
[2] https://baike.baidu.com/item/RISC体系结构/4679327
[3] https://www.jianshu.com/p/3558942fe14f
比较连续分配、分页和分段三种存储分配机制的优缺点_第十九期-处理器存储模型概述(1)...相关推荐
- 操作系统:连续分配、分页和分段三种存储分配机制的优缺点
连续,设计简单,直接寻址,效率高.缺点:内存利用效率最低,有内部碎片. 分页,缓解内存压力,设计最复杂(粒度最小),无论数据有多少,都只能按照页面大小分配,造成浪费. 分段,程序员在编程和使用上多方面 ...
- 深入分析Kafka架构(三):消费者消费方式、三种分区分配策略、offset维护
本文目录 一.前言 二.消费者消费方式 三.分区分配策略 3.1.分配分区的前提条件 3.2.Range分配策略 3.3.RoundRobin分配策略 3.4.Sticky分配策略 四.offset维 ...
- mysql 分页查询web_JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)...
JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)-1.jpg (40.23 KB, 下载次数: 0) 2018-8-18 13:34 上传 在开发过程中,经常做的一件事,也是最基本的事 ...
- sql oracle分页查询,【SQL】Oracle分页查询的三种方法-Oracle
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 [sql] select * from t_user t where ROWNUM <10; 按照学生ID排名 ...
- 【Kafka】Kafka消费者组三种分区分配策略roundrobin,range,StickyAssignor
文章目录 1. 分配策略 1.1 Range(默认策略) 1.2 RoundRobin RoundRobin的两种情况 1.3 StickyAssignor 2. Range策略演示 参考 相关文章 ...
- Kafka Range、RoundRobin、Sticky 三种 分区分配策略区别
Kafka Range RoundRobin 和Sticky 三种 分区分配策略 一.Kafka默认分区分配策略 1.1 consumer 订阅 1 topic ( 7 partition ) 按照K ...
- Kafka-消费者组三种分区分配策略Range Assignor、RoundRobin Assignor、Sticky Assignor详细解析
Kafka消费者组三种分区分配策略roundrobin,range,StickyAssignor 文章目录 Kafka消费者组三种分区分配策略roundrobin,range,StickyAssign ...
- css中的三种基本定位机制
css中的三种基本定位机制 a.普通文档流 b.定位:相对定位 绝对定位 固定定位 c.浮动 1.普通流中,元素位置由文档顺序和元素性质决定,块级元素从上到下依次排列,框之间的垂直距离由框的垂直mar ...
- 分页条件查询_mongodb多条件分页查询的三种方法
自我推荐 一.使用limit和skip进行分页查询 public List<User> pageList(int pageNum ,int pageSize){List<User&g ...
最新文章
- linux下C++ 插件(plugin)实现技术
- Java IO: 网络
- LINQ体验系列文章导航
- 3.1.10 基本分段存储管理方式
- Datafix_for_arinvoice_dist_move
- linux out 日志,关于Linux中nohup.out日志过大问题(示例代码)
- [转]摧毁一个人可以有多简单
- 瑞利衰落(Rayleigh Fading)
- HttpServletResponse(打开图片)
- 15.go install
- keil-5.25Pro自带jlink驱动调试时自动掉线问题
- Android 仿音乐播放器自定义锁屏歌词功能
- 2023 年值得关注的十大人工智能趋势,还不快码住来看!
- java response.write_response.write()区别response.getWrite().write()
- Windows VScode Linter pylint is not installed
- 武汉大学计算机学院 优秀夏令营,武汉大学计算机学院2014年优秀大学生暑期夏令营通知...
- JavaScript读书笔记四
- 中国软件开发外包公司排名-国内最大的软件开发商有哪些呢
- 苹果系统和安卓系统的区别_#你喜欢苹果系统还是安卓系统?
- 高配低价的新国民旗舰:联想Z5评测体验
热门文章
- mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!
- php passport security,php写的Passport加密函数
- oracle数据库无法查询,关于oracle中无法查询中文条件的解决办法
- 剑指offer面试题[24]-二插搜索树的后序遍历序列
- java存储整数,用于存储整数数值的是 JAVA四种整数数据类型的取值范围分别是多少...
- MySQL详细知识点总结 可以收藏啦
- c语言影碟租借管理系统,影碟出租信息管理系统
- android使用lombok_Android Studio 使用Lombok
- rust怎么造双层_DIY双层电路板 制作详解
- 实现字符级的LSTM文本生成